java - IabHelper.startSetup() 导致 NullPointerException

标签 java android in-app-billing

我的应用使用 In App Billing,它在我的手机上运行良好 (Android 2.3.6)。但是当我在模拟器 (Android 4.4.2) 上运行它时,它会在创建用于执行应用程序购买的帮助程序时不断崩溃。它抛出一个 NullPointerException:

mHelper = new IabHelper(MainActivity.this, base64EncodedPublicKey);
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
    public void onIabSetupFinished(IabResult result) {
        if (!result.isSuccess()) {
            Log.d("x", "In-app Billing setup failed: " + result);
        } 
        else {             
            Log.d("x", "In-app Billing is set up OK");
        }                             
    }
});

This answer说我应该把上面的代码放在一个try-block中,然后把catch放在它下面的答案中。这样做时出现错误,推荐的解决方案也将其放入 try-catch block 中。即使我这样做了,它仍然崩溃。

谁能告诉我怎么做?我完全被卡住了。

堆栈跟踪:

12-24 10:59:51.908: E/AndroidRuntime(2273): FATAL EXCEPTION: main
12-24 10:59:51.908: E/AndroidRuntime(2273): Process: com.sandradiependaal.mediatie, PID: 2273
12-24 10:59:51.908: E/AndroidRuntime(2273): java.lang.NullPointerException
12-24 10:59:51.908: E/AndroidRuntime(2273):     at com.sandradiependaal.meditatie.util.IabHelper.startSetup(IabHelper.java:267)
12-24 10:59:51.908: E/AndroidRuntime(2273):     at com.sandradiependaal.meditatie.MainActivity$4.onItemClick(MainActivity.java:142)
12-24 10:59:51.908: E/AndroidRuntime(2273):     at android.widget.AdapterView.performItemClick(AdapterView.java:299)
12-24 10:59:51.908: E/AndroidRuntime(2273):     at android.widget.AbsListView.performItemClick(AbsListView.java:1113)
12-24 10:59:51.908: E/AndroidRuntime(2273):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:2904)
12-24 10:59:51.908: E/AndroidRuntime(2273):     at android.widget.AbsListView$3.run(AbsListView.java:3638)
12-24 10:59:51.908: E/AndroidRuntime(2273):     at android.os.Handler.handleCallback(Handler.java:733)
12-24 10:59:51.908: E/AndroidRuntime(2273):     at android.os.Handler.dispatchMessage(Handler.java:95)
12-24 10:59:51.908: E/AndroidRuntime(2273):     at android.os.Looper.loop(Looper.java:136)
12-24 10:59:51.908: E/AndroidRuntime(2273):     at android.app.ActivityThread.main(ActivityThread.java:5017)
12-24 10:59:51.908: E/AndroidRuntime(2273):     at java.lang.reflect.Method.invokeNative(Native Method)
12-24 10:59:51.908: E/AndroidRuntime(2273):     at java.lang.reflect.Method.invoke(Method.java:515)
12-24 10:59:51.908: E/AndroidRuntime(2273):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
12-24 10:59:51.908: E/AndroidRuntime(2273):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
12-24 10:59:51.908: E/AndroidRuntime(2273):     at dalvik.system.NativeStart.main(Native Method)

IabHelper.java:

 Intent serviceIntent = new Intent("com.android.vending.billing.InAppBillingService.BIND");
 serviceIntent.setPackage("com.android.vending");
 if (!mContext.getPackageManager().queryIntentServices(serviceIntent, 0).isEmpty()) {
     // service available to handle that Intent
     mContext.bindService(serviceIntent, mServiceConn, Context.BIND_AUTO_CREATE);
 }

最佳答案

这是因为返回的列表不仅是空的,而且实际上是null。您可以添加一个简单的检查列表是否为 null。为什么实现不返回空列表而不是 null 超出了我的理解,但这就是它的构建方式。

改成这样:

List<ResolveInfo> queryIntentServices = mContext.getPackageManager().queryIntentServices(serviceIntent, 0);
if (queryIntentServices != null && !queryIntentServices.isEmpty()) {
        // service available to handle that Intent
        mContext.bindService(serviceIntent, mServiceConn, Context.BIND_AUTO_CREATE);
}

这至少对我来说是用模拟器解决的问题。如果正确实现,这在真实设备中是不需要的。

关于java - IabHelper.startSetup() 导致 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20763952/

相关文章:

java - Weblogic11g 中 Reflecions 0.9.9-RC1 的类加载器错误

java - 如何使用 ValueProvider 将通用垂直轴添加到图表中

java - 删除时 CASCADE 在 hibernate 中的多对多映射中不起作用

java - 添加到 arraylist 后不允许更改 hashmap 值

android - 为什么要在 onPause() - onResume() 而不是 onStop() - onStart() 中提交/读取 Android 数据?

android - 何时调用 BillingClient.endConnection()?

java - 条件表达式中的 XPath 谓词

android - Appflow 部署插件导致错误 : 'uncaught (in promise) string resource id #0x0' in Ionic Capacitor project

android - 购买消耗品的应用内结算问题

android - 除了使用 Google 的应用内计费之外,还有其他方法可以避免发布私有(private)信息吗?