onIabPurchaseFinished никогда не звонил.

Я пытался настроить биллинг в своем первом приложении и использовал sku android.test.purchased. Покупка завершена, и мне удается поместить SKU в свой инвентарь, но, как следует из названия, 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!");
             }


    }
};

5 ответов

Решение

Попробуйте добавить это в активность, которая вызывает 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.");
    }
}

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

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

http://developer.android.com/reference/android/app/Activity.html

У меня была та же проблема, и 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);
        }
    }

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

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

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

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

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

Видео YouTube на YouTube

Учебный класс Play Billing Library

Образец Google Trivial Drive v2

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

Play Billing Library Docs

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

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

Другие вопросы по тегам