IabHelper.queryPurchases中的NullPointerException

今天,我发现我的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 提供的一个类,作为实现应用内结算v3的一个很好的起点

有罪的线是第二个

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

看来该方法被调用时服务没有连接。 在Nexus 5设备上发生此错误(按照开发者控制台)

  • 这是Android 5已知的问题吗?
  • 有没有最新版本的IAB Helper?
  • 我能做些什么,而不是手动编辑代码来处理NPE呢?

Solutions Collecting From Web of "IabHelper.queryPurchases中的NullPointerException"

我修改了这个代码…

  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); // ... } 

这几乎肯定是因为进程正在asynchronous运行,并且活动/应用程序在结果返回时(或正在)被closures。