onIabPurchaseFinished从未打过电话.

AAA*_*ton 110 android in-app-billing

我一直在尝试为我的第一个应用程序设置应用内结算,并且一直在使用android.test.purchased sku.购买过来了,我设法将SKU放入我的库存中,但正如标题所示,onIabPurchaseFinished永远不会被调用.

我认为它可能与此日志有关:"无法保存哪个视图具有焦点,因为焦点视图com.android.internal.policy.impl.PhoneWindow$DecorView@406743d0没有id".在进入Google Play之前就会弹出.我不太确定这意味着什么......

发布购买:

mHelper.launchPurchaseFlow(this, sku, 10001, mPurchaseFinishedListener, "");
Run Code Online (Sandbox Code Playgroud)

和听众:

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {

    @Override
    public void onIabPurchaseFinished(IabResult result, Purchase info) {
        System.out.println("Purchase Finish heard something");

        if (result.isFailure()) {
             Log.d(TAG, "Error purchasing: " + result);
             return;
        } else{
                Log.d(TAG,"Success!");
             }


    }
};
Run Code Online (Sandbox Code Playgroud)

bug*_*gzy 204

尝试将此添加到调用的Activity mHelper.launchPurchaseFlow(..):

    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.d(TAG, "onActivityResult(" + requestCode + "," + resultCode + "," + data);

    // 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.");
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 有同样的问题,并且工作完美.但我想知道的是为什么回调没有像人们想象的那样被执行,为什么我们必须打电话给我们自己呢?有点让回调变得无用:/ (16认同)
  • 谢谢你.这是文档中的一个错误(他们从未提及需要它或在IabHelper中.IabHelper的launchPurchaseFlow()调用startIntentSenderForResult - 它将在活动结束后调用你的活动的onActivityResult(). (8认同)
  • thx也帮助了我.@Spider,你在Activity中需要这个方法的原因是否则不会调用mHelper的handleActivityResult()方法.换句话说,这是Activity中所需的真实/标准handleActivityResult(),而mHelper实际上只是一个常规的旧方法. (4认同)
  • 当我发现这个时,我以为我已经解决了我的问题...然后我意识到我已经实现了这个功能,它仍然无法工作......*叹气* (3认同)
  • 请注意,在片段上覆盖onActivityResult()不起作用,必须在Activity上完成 (3认同)
  • 顺便说一句,如果你有像我这样的支付片段,你可以在片段Java中执行所有回调,这个解决方案可行.只需创建一个公共片段对象并使用它来引用iabhelper,即paymentFragment.mHelper.HandleActivity ... (2认同)

小智 8

我刚发现另一个重要的事情:用于启动购买流程的requestCode必须> = 0!

我使用"new Random().nextInt()"来生成一个随机的requestCode,有时它可以工作,有时却没有.现在我在以下文档中发现,requestCode不应该是负数:

http://developer.android.com/reference/android/app/Activity.html#startActivityForResult%28android.content.Intent,%20int%29