Исключение NullPointerException в IabHelper.queryPurchases

Сегодня я обнаружил отчет о сбое приложения для моего приложения Android, включающий следующую трассировку стека:

java.lang.NullPointerException: Attempt to invoke interface method 'android.os.Bundle com.android.vending.billing.IInAppBillingService.getPurchases(int, java.lang.String, java.lang.String, java.lang.String)' on a null object reference
at com.myapp.utils.IabHelper.queryPurchases(IabHelper.java:878)
at com.myapp.utils.IabHelper.queryInventory(IabHelper.java:572)
at com.myapp.utils.IabHelper.queryInventory(IabHelper.java:545)
at com.myapp.utils.IabHelper$2.run(IabHelper.java:645)
at java.lang.Thread.run(Thread.java:818)

(номера строк изменены с оригинала, или что выглядит как оригинал, из-за пользовательского переформатирования)

Обычно можно изменить свой собственный код, чтобы проверить неназначенные члены класса. Проблема в том, что этот код скопирован и вставлен прямо из Android SDK, потому что IabHelper - это класс, который Android SDK предоставляет в качестве хорошей отправной точки для внедрения In-app Платеж v3

Виноватая строка - вторая

logDebug("Calling getPurchases with continuation token: " + continueToken);
Bundle ownedItems = mService.getPurchases(3, mContext.getPackageName(), itemType, continueToken);

Кажется, что служба не подключена во время вызова метода. Эта ошибка возникла на устройстве Nexus 5 (в консоли разработчика)

  • Это известная проблема с Android 5?
  • Есть ли обновленная версия помощника IAB?
  • Что я могу сделать, а не вручную редактировать код для обработки NPE?

Ответы

Ответ 1

Я изменил этот код...

    do {
        logDebug("Calling getPurchases with continuation token: " + continueToken);
        Bundle ownedItems = mService.getPurchases(3, mContext.getPackageName(), itemType, continueToken);
        // ...
    }

Чтобы быть этим...

    do {
        logDebug("Calling getPurchases with continuation token: " + continueToken);
        if (mService == null || mContext == null) {
            logError("Our service and/or our context are null.  Exiting.");
            return IABHELPER_UNKNOWN_ERROR;
        }
        Bundle ownedItems = mService.getPurchases(3, mContext.getPackageName(), itemType, continueToken);
        // ...
    }

Это почти наверняка, потому что процесс выполняется асинхронно, а активность/приложение закрывается (или закрывается) при возврате результата.