onIabPurchaseFinished так и не позвонил.


111

Я пытался настроить биллинг в приложении для своего первого приложения и использовал sku android.test.purchased. Покупка прошла, и мне удалось получить артикул в свой инвентарь, но, как говорится в названии, onIabPurchaseFinished никогда не вызывается.

Я думаю, это может иметь какое-то отношение к этому журналу: «Не удалось сохранить, какое представление имеет фокус, потому что сфокусированное представление com.android.internal.policy.impl.PhoneWindow$DecorView@406743d0 не имеет идентификатора». Это всплывает прямо перед переходом в Google Play. Я не совсем понимаю, что это значит ...

Запуск покупки:

mHelper.launchPurchaseFlow(this, sku, 10001, mPurchaseFinishedListener, "");

И Слушатель:

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {

    @Override
    public void onIabPurchaseFinished(IabResult result, Purchase info) {
        System.out.println("Purchase Finish heard something");

        if (result.isFailure()) {
             Log.d(TAG, "Error purchasing: " + result);
             return;
        } else{
                Log.d(TAG,"Success!");
             }


    }
};

Возможно, мне стоит добавить, что я пытаюсь сделать это из вкладки
AAAton

Я установил идентификатор программно, но без разницы.
AAAton

Ответы:


206

Попробуйте добавить это в Activity, которая вызывает mHelper.launchPurchaseFlow(..):

    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.d(TAG, "onActivityResult(" + requestCode + "," + resultCode + "," + data);

    // Pass on the activity result to the helper for handling
    if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
        // not handled, so handle it ourselves (here's where you'd
        // perform any handling of activity results not related to in-app
        // billing...
        super.onActivityResult(requestCode, resultCode, data);
    }
    else {
        Log.d(TAG, "onActivityResult handled by IABUtil.");
    }
}

16
была такая же проблема, и это сработало отлично. Но я хочу знать, почему обратный вызов не выполняется, как можно было бы предположить, почему мы должны делать вызов этому самому себе? Вид делает обратный вызов бесполезным: /
Spider

4
Также мне помогли, спасибо. @Spider, причина, по которой вам нужен этот метод в вашей деятельности, заключается в том, что в противном случае метод handleActivityResult () mHelper не будет вызван. Другими словами, это реальный / стандартный handleActivityResult (), необходимый в Activity, а mHelper на самом деле является обычным старым методом.
gcl1

8
Спасибо за это. Это ошибка в документации (они никогда не упоминают о необходимости этого или в IabHelper. IabHelper launchPurchaseFlow () вызывает startIntentSenderForResult, который после завершения вызовет onActivityResult () вашей активности.
Джерри Брэди

3
Я думал, что решил свою проблему, когда нашел это ... потом я понял, что уже реализовал эту функцию, и она все еще не работает ... вздох
Мэтт К.

3
Обратите внимание, что переопределение onActivityResult () для фрагмента не работает, это необходимо сделать для Activity
cprcrack

8

Я только что обнаружил еще одну важную вещь: requestCode, который используется для запуска потока покупки, должен быть> = 0!

Я использовал «new Random (). nextInt ()» для генерации случайного кода запроса, и иногда он работал, иногда нет. теперь я обнаружил в следующей документации, что requestCode не должен быть отрицательным числом:

http://developer.android.com/reference/android/app/Activity.html#startActivityForResult%28android.content.Intent,%20int%29


3

У меня была такая же проблема, и onActivityResult тоже не вызывался.
Вдохновленный ответом @Ghulam, я понял, что действие onActivityResult не вызывает автоматически onActivityResult фрагмента, поэтому мне пришлось сделать это вручную.

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(mCurrentFragment!= null){
            mCurrentFragment.onActivityResult(requestCode, resultCode, data);
        }
    }

В моем случае этот ответ сработал, но мне пришлось добавить переопределение OnActivityResult в моем основном
действии

1

Вам нужно вызвать protected void onActivityResult (); В родительском Activity вместо MainActivity (Trivial Drive), откуда вы вызываете MainActivity, то есть Trivial Drive Activity.

вы получите значение кода результата -1, если покупка успешна, в противном случае - 0.


0

Я столкнулся с той же проблемой, и принятое решение уже было реализовано, но я не мог сказать, что вызывает это. При переходе на новую библиотеку биллинга Google Play 1.0 (выпущенную 19 сентября 2017 г.) проблема была решена!

Надеюсь, следующие ссылки помогут тем, кто хотел бы реализовать новую библиотеку:

Сообщение в блоге Google о выпуске

Видео Google на YouTube

Учебный курс по библиотеке биллинга Google Play

Образец Google Trivial Drive v2

Лаборатория кода Play Billing Library опубликована во время Google I / O 2017

Документы библиотеки биллинга Google Play

Официальный справочник по классам и методам

Примечания к выпуску

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.