关于android:In-App-Billing:无法设置IAB Helper异常

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 知道的一个已知错误