我的应用程序使用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"); } } });
这个答案说我应该将上面的代码放在try-block中,并将catch放在它下面的答案中.这样做时我得到一个错误,推荐的解决方案是将它放在try-catch块中.尽管我这样做了,它仍然会崩溃.
谁能告诉我怎么做?我完全卡住了.
堆栈跟踪:
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); }
user2832636.. 51
这是因为返回的列表不仅仅是空的,而是实际的null
.如果列表是,您可以添加一个简单的检查null
.为什么实现不返回空列表而不是null
我的理解,但它只是它的构建方式.
改为:
ListqueryIntentServices = mContext.getPackageManager().queryIntentServices(serviceIntent, 0); if (queryIntentServices != null && !queryIntentServices.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); }
至少这对我来说是模拟器的诀窍.如果正确实现,则在实际设备中不需要这样做.
这似乎是一个老线程.希望这个答案能帮助后来遇到问题的人.BI目前正面临同样的问题.
IAB
助手生成NPE
的startSetup()
唯一的模拟器.但这只发生在使用Android xxx作为目标创建的AVD上.
尝试使用Google API创建AVD作为目标.IAB
帮助器不会崩溃,但您仍然无法测试实际的计费功能.