onIab PurchaseFinished ніколи не дзвонив.


111

Я намагався налаштувати виставлення рахунків у своєму додатку для мого першого додатка, і я використовував skuroid 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!");
             }


    }
};

Можливо, варто додати, що я намагаюся зробити це з вкладки
AAAton

Я встановив id програмно, але різниці немає.
AAAton

Відповіді:


206

Спробуйте додати це до активності, яка викликає 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
Також допоміг мені, thx. @Spider, причиною, що вам потрібен цей метод у вашій діяльності, є те, що в іншому випадку метод mHelper handleActivityResult () не буде викликаний. Іншими словами, це справжній / стандартний handleActivityResult (), необхідний в Activity, і mHelper's - це фактично звичайний старий метод.
gcl1

8
Дякую за це Це помилка в документації (вони ніколи не згадують про необхідність цього чи в IabHelper. Запуск IabHelperPurchaseFlow () викликає запуск startIntentSenderForResult - який викликає активність onActivityResult (), коли вона закінчиться.
Джеррі Брейді

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

3
Зауважте, що переосмислення onActivityResult () на фрагменті не працює, це потрібно зробити на Activity
cprcrack

8

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

Я використовував "новий Random (). nextInt ()", щоб генерувати випадковий код запиту, а іноді він працював, іноді - ні. Тепер я з'ясував у наступній документації, що codeCode не повинен бути від'ємним числом:

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 у своїй основній діяльності ( github.com/onepf/OpenIAB/isissue/166 )
PayToPwn

1

Вам потрібно викликати захищену недійсність onActivityResult (); У вашій батьківській активності замість MainActivity (Trivial Drive), звідки ви викликаєте свою MainActivity, що є Trivial Drive Activity.

ви отримаєте значення коду результату -1, якщо покупка буде успішною в іншому випадку 0.


0

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

Сподіваюся, що наступні посилання допоможуть комусь, хто хотів би впровадити нову бібліотеку:

Публікація в блозі Google про випуск

Відео Google на YouTube

Слухати навчальний клас Бібліотеки виставлення рахунків

Тривіальний диск Google v2

Код-код програвання Бібліотеки виставлення рахунків, опублікований під час Google I / O 2017

Відіграти Документи з виставлення рахунків

Офіційна довідка про заняття та методи

Випускає нотатки

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.