In-App-Billing: Cant set up IAB Helper exception
我正在尝试在 Google Play 中使用静态产品 ID 设置应用内结算和测试。
我在这里关注开发者教程。
当在 labHelper 对象上调用 launhPurcahseFlow 方法时,出现异常:
java.lang.IllegalStateException: IAB helper is not set up. Can't
perform operation: launchPurchaseFlow at
com.android.vending.billing.IabHelper.checkSetupDone(IabHelper.java:782)
已经搜索了几个小时,但找不到有效的解决方案。
任何意见表示赞赏。
我的代码是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); // compute your public key and store it in base64EncodedPublicKey mHelper = new IabHelper(this, base64EncodedPublicKey); // enable debug logging (for a production application, you should set this to false). mHelper.enableDebugLogging(true); //perform service binding to Google Bill ser and return ny errors with IabResult object and listener mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { public void onIabSetupFinished(IabResult result) { Log.d(TAG,"Setup finished."); if (!result.isSuccess()) { // Oh noes, there was a problem. alert("Problem setting up in-app billing:" + result); return; } // Have we been disposed of in the meantime? If so, quit. if (mHelper == null) return; // IAB is fully set up. Now, let's get an inventory of stuff we own. Log.d(TAG,"Setup successful. Querying inventory."); //mHelper.queryInventoryAsync(mGotInventoryListener); } }); //ILLEGALSTAEEXCEPTION THROWN HERE mHelper.launchPurchaseFlow(this, testProduct, RC_REQUEST, new IabHelper.OnIabPurchaseFinishedListener() { public void onIabPurchaseFinished(IabResult result, Purchase purchase) { if (result.isFailure()) { Log.d(TAG,"Error purchasing:" + result); return; } else if (purchase.getSku().equals(testProduct)) { // give user access to premium content and update the UI //set the purchaesd booean to true //when purcajsed add this code editor.putBoolean("purchased", true); editor.commit(); Toast.makeText(getApplicationContext(),"ADD FREE VERSION PURCAHSED!!!" + " Details OrderID:"+purchase.getOrderId() +" Payload ID:"+purchase.mDeveloperPayload, Toast.LENGTH_LONG).show(); Log.d("CONNECT TO GOOGLE BILL","ITEM PURCAHSED! :"+purchased); } } },"diveAppPurchase"); }//onCreate @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { Log.d(TAG,"onActivityResult(" + requestCode +"," + resultCode +"," + data); if (mHelper == null) return; // Pass on the activity result to the helper for handling if (!mHelper.handleActivityResult(requestCode, resultCode, data)) { // not handled, so handle it ourselves (here's where you'd // perform any handling of activity results not related to in-app // billing... super.onActivityResult(requestCode, resultCode, data); } else { Log.d(TAG,"onActivityResult handled by IABUtil."); } } |
这对像我这样第一次处理应用购买的人很有用。
设置调用是异步的,因此必须在调用 launchPurchaseFlow 之前完成。所以我禁用了一个"购买"按钮来进行launchPurchaseFlow调用,一旦设置调用完成,它就会启用。工作正常:
设置通话
//执行服务绑定到 Google Bill ser 并返回带有 IabResult 对象和 listener
的任何错误
1 | mHelper.startSetup(...) |
如果成功则启用按钮并调用 mHelper.launchPurchaseFlow(...) 方法
此外,当使用 google 提供的测试产品 id 时,您可能会注意到在 launchPurchaseFlow 期间引发了签名异常,尽管交易成功,但随后的结果失败,这显然是 google 知道的一个已知错误