编辑 4/15:在 IabHelper 中捕获空指针似乎已经停止了这个问题。我不再看到抛出异常,我将接受这个作为答案。
编辑 4/04:深入一点。有用于处理 queryPurchases 方法的 RemoteExceptions 和 JSONExceptions 的 try catch 块,但没有 NullPointerException 处理。我要尝试的是包括 NullPointer 异常处理,因此 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: 嗯,仍然收到这个崩溃......现在它发生在尝试从 IabHelper 摘录的以下第 3 行获取上下文时:
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);
编辑3/18/13:我仍然收到异常,即使在 3/17 部署了新的 IabHelper 版本。
我开始在这里看到一个模式,崩溃都是在执行 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());
2013 年 3 月 17 日编辑:我看到过去几个月发布了许多错误修复,我将尝试此处提供的最新代码,看看是否能解决问题:
在我的一个应用程序中,我使用了计费 API 和其中包含的样板代码。
我正在使用截至 2013 年 3 月 16 日通过 SDK 管理器提供的最新版本的计费 API。
在我的活动中,我使用以下内容查询库存:
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);
}
}
}
我从以下设备的 IabHelper 类中收到了多个 NullPointerException 报告。我无法重现该问题,也找不到有关这些崩溃的任何信息,这就是我发布此问题的原因。
我在计费 API 的“面向开发人员”部分(包括在 onQueryInventoryFinished 中)对 null 和 try/catch 块进行了无数其他检查,所以我知道这个异常不是从“我的代码”中抛出的(因为我没有捕获崩溃来自我的任何应用程序的类),而是从 IabHelper 本身内部抛出。除了这个推荐的修复之外,我没有修改 IabHelper:https ://stackoverflow.com/a/14737699
崩溃 #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);
崩溃 #2 三星 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);