edit 4/15: Ловля нулевого указателя в IabHelper, похоже, остановила эту проблему. Я больше не вижу исключения, которые меня бросают, я собираюсь принять это как ответ.
edit 4/04: Немного более глубокое погружение. Существуют блоки catch catch, которые обрабатывают RemoteExceptions и JSONExceptions для метода queryPurchases, но не обрабатывают NullPointerException. То, что я собираюсь попробовать, включает в себя обработку NullPointer Exception, поэтому IabHelper выглядит так, когда вы пытаетесь выполнить запросSkuDetails:
catch (NullPointerException e) {
throw new IabException(IABHELPER_UNKNOWN_ERROR, "NullPointer while refreshing inventory.", e);
}
Я только что написал об ошибке:
https://code.google.com/p/marketbilling/issues/detail?id=114
отредактируйте 3/25: хорошо, все еще получая этот сбой... теперь это происходит при попытке получить контекст в строке 3 следующего отрывка из IabHelper:
int queryPurchases(Inventory inv, String itemType) throws JSONException, RemoteException {
logDebug("Querying owned items, item type: " + itemType);
logDebug("Package name: " + mContext.getPackageName());
Это разочаровывает, потому что в моем манифесте я всегда использую полное имя пути моего приложения для "имени".
Пример "com.myappname.blah.ClassName"
Я также пробовал передать это, MyClass.this, getApplicationContext() в mHelper. Однако все они производят одинаковые результаты NullPointer случайным образом с устройств в дикой природе. Я также попробовал name= "MyClass" в манифесте. Это выглядит так:
mHelper = new IabHelper(MyClass.this, myKey);
edit 3/18/13: Я все еще получаю исключения, даже с новой версией IabHelper, развернутой на 3/17.
Я начинаю видеть шаблон здесь, что все сбои при попытке получить контекст при выполнении mContext.getPackageName(). Мне любопытно, почему это работает на всех моих тестовых устройствах, и я не могу воспроизвести этот сбой и, похоже, только на небольшом количестве устройств.
Вот новый сбой:
java.lang.NullPointerException
at com.myapp.util.IabHelper.queryPurchases(SourceFile:836)
at com.myapp.util.IabHelper.queryInventory(SourceFile:558)
at com.myapp.util.IabHelper.queryInventory(SourceFile:522)
at com.myapp.util.IabHelper$2.run(SourceFile:617)
at java.lang.Thread.run(Thread.java:1019)
Вызывается IabHelper...
line 836: logDebug("Package name: " + mContext.getPackageName());
edit 3/17/13: я вижу, что за последние несколько месяцев было опубликовано множество исправлений об ошибках, я попробую последний код, доступный здесь, и посмотреть, устраняет ли это проблему:
В одном из моих приложений я использую API биллинга и код шаблона, включенный в него.
Я использую последнюю версию биллингового API, доступную через менеджер SDK по состоянию на 3/16/2013.
В моей деятельности я запрашиваю инвентарь, используя следующее:
final List<String> skuList = new ArrayList<String>();
skuList.add("sku1");
skuList.add("sku2");
skuList.add("sku3");
if (skuList != null) {
if (skuList.size() > 0) {
try {
mHelper.queryInventoryAsync(true, skuList, mGotInventoryListener);
} catch (Exception e) {
ACRA.getErrorReporter().handleException(e);
}
}
}
Я получаю несколько отчетов NullPointerException в дикой природе из класса IabHelper для следующих устройств. Я не могу воспроизвести проблему и не могу найти никакой информации об этих авариях, и именно поэтому я публикую этот вопрос.
У меня есть множество других проверок для значений NULL и блоков try/catch в стороне разработчика, связанной с биллинговым API, в том числе внутри onQueryInventoryFinished, поэтому я знаю, что это исключение не выбрасывается из "моего кода" (потому что я не снимая сбоев с любого из моих классов приложений), но вместо этого вызывается из самого IabHelper. Я не изменил IabHelper, кроме этого рекомендуемого исправления: qaru.site/info/106482/...
Crash # 1 Galaxy Nexus
java.lang.NullPointerException
at com.myapp.util.IabHelper.querySkuDetails(SourceFile:802)
at com.myapp.util.IabHelper.queryInventory(SourceFile:471)
at com.myapp.util.IabHelper$2.run(SourceFile:521)
at java.lang.Thread.run(Thread.java:856)
Вызывается IabHelper...
line 802: Bundle skuDetails = mService.getSkuDetails(3, mContext.getPackageName(), ITEM_TYPE_INAPP, querySkus);
Crash # 2 Samsung GT-S5570L
java.lang.NullPointerException
at com.myapp.util.IabHelper.queryPurchases(SourceFile:735)
at com.myapp.util.IabHelper.queryInventory(SourceFile:465)
at com.myapp.util.IabHelper$2.run(SourceFile:521)
at java.lang.Thread.run(Thread.java:1019)
Вызывается IabHelper...
line 735: Bundle ownedItems = mService.getPurchases(3, mContext.getPackageName(), ITEM_TYPE_INAPP, continueToken);