IabHelper PurchaseFinishedListener

Если я отправляю намерение совершить покупку через стандартный

String mySku = "android.test.purchased";

mHelper.launchPurchaseFlow(this, mySku, 10001, mPurchaseFinishedListener);

Я могу приобрести элемент, и он будет хранить, и я могу запросить элемент, и это тоже отлично работает. Единственное, что не работает, это PurchaseFinishedListener. Я получил код, очень похожий на образец приложения, но он, похоже, не вызван вообще.

12-12 01:40:47.248: D/IabHelper(23502): Calling getPurchases with continuation token: null
12-12 01:40:50.116: D/IabHelper(23502): Starting async operation: launchPurchaseFlow

Это два последних метода, которые вызываются, и после этого, когда я заканчиваю покупку, он не вызывает покупкуfinishedlistener

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new OnIabPurchaseFinishedListener() {

    @Override
    public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
        Log.d(TAG, "Purchase finished: " + result + ", purchase: "
                + purchase);
        if (result.isFailure()) {
            complain("Error purchasing: " + result);
            // setWaitScreen(false);
            return;
        }

        if (purchase.getSku().equals(mySku)) {
            Log.d(TAG, "mySku is being consumed.");
            mHelper.consumeAsync(purchase, mConsumeFinishedListener);
        }
        Log.d(TAG, "Purchase successful.");
        new AsyncQuestionsActivity().doInBackground();
    }
};

Ничего из журнала до конца не работает. Есть ли что-то, что я просто как-то не хватает?

Ответ 1

Я узнал, как это исправить. Внедрите handleActivityResult в onActivityResult. Ему необходимо было создать мост между слушателем и запущенным потоком покупок.

Ниже приведен код, который я использовал:

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        Log.d(TAG, "onActivityResult(" + requestCode + "," + resultCode + ","
                + data);

        // Pass on the activity result to the helper for handling
        if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
            super.onActivityResult(requestCode, resultCode, data);
        } else {
            Log.d(TAG, "onActivityResult handled by IABUtil.");
        }
    }

Ответ 2

AndroidPenguin, я столкнулся с той же проблемой, что и вы, но у меня правильно задан параметр activityresult, и все же моя покупка не была выполнена.

Вот мой onActivityResult

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (SettingsManager.getBooleanSetting(rootId, "inapppurchase", false)){
        Log.d(TAG, "take care of activity result with billing helper");
        if (!mBillingService.handleActivityResult(requestCode, resultCode, data)) {
            // not handled, so handle it ourselves (here 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.");
        }
    }
    else
        super.onActivityResult(requestCode, resultCode, data);
}

Ответ 3

В моем случае он работает попробуйте вот так,  дождитесь, когда этот диалог google будет закрыт. Затем слушатель будет вызван

Ответ 4

Для тех из вас, у кого была такая же проблема, я испытывал...

Я просто сделал свою переменную-член IabHelper статической, и это исправило проблему.

Я уже добавил код AndroidPenguin и все еще получал сбои от нулевого IabHelper, после того как я купил элемент (так что onActivityResult никогда не имел возможности вызвать handleActivityResult, потому что mHelper был нулевым).