Исключение 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);
// ...
}
Это почти наверняка, потому что процесс выполняется асинхронно, а активность/приложение закрывается (или закрывается) при возврате результата.