NullPointerException in IabHelper.queryPurchases

2022-09-03 05:35:52

今天,我发现了我的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 复制粘贴过来的,因为这是 Android SDK 提供的一个类,作为实现应用内计费 v3 的良好起点。IabHelper

有罪线是第二条

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

这几乎可以肯定,因为流程正在异步运行,并且当结果返回时,活动/应用已经(或正在)关闭。


答案 2

推荐