【问题标题】:IabHelper PurchaseFinishedListenerIabHelper 购买FinishedListener
【发布时间】:2026-01-16 17:10:02
【问题描述】:

如果我通过标准发送购买意向

String mySku = "android.test.purchased";

mHelper.launchPurchaseFlow(this, mySku, 10001, mPurchaseFinishedListener);

我可以购买该项目,它会存储,我可以查询该项目,这也很好。唯一不起作用的是 PurchaseFinishedListener。我的代码与示例应用程序几乎相同,但它似乎根本没有被调用。

12-12 01:40:47.248: D/IabHelper(23502): Calling getPurchases with continuation token: null
12-12 01:40:50.116: D/IabHelper(23502): Starting async operation: launchPurchaseFlow

这是最后两个被调用的方法,之后当我完成购买时它不会调用purchasefinishedlistener

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new OnIabPurchaseFinishedListener() {

    @Override
    public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
        Log.d(TAG, "Purchase finished: " + result + ", purchase: "
                + purchase);
        if (result.isFailure()) {
            complain("Error purchasing: " + result);
            // setWaitScreen(false);
            return;
        }

        if (purchase.getSku().equals(mySku)) {
            Log.d(TAG, "mySku is being consumed.");
            mHelper.consumeAsync(purchase, mConsumeFinishedListener);
        }
        Log.d(TAG, "Purchase successful.");
        new AsyncQuestionsActivity().doInBackground();
    }
};

从日志到最后没有任何效果。有什么我只是想念的东西吗?

【问题讨论】:

    标签: android listener in-app-billing


    【解决方案1】:

    我发现了如何解决它。在onActivityResult 中实现handleActivityResult。它需要在听众和已启动的购买流程之间架起一座桥梁。

    下面是我使用的代码:

    @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
    
            Log.d(TAG, "onActivityResult(" + requestCode + "," + resultCode + ","
                    + data);
    
            // Pass on the activity result to the helper for handling
            if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
                super.onActivityResult(requestCode, resultCode, data);
            } else {
                Log.d(TAG, "onActivityResult handled by IABUtil.");
            }
        }
    

    【讨论】:

    • 你能用一些代码详细说明一下吗?提前致谢。
    • 在这种情况下mHelperinitialized 是如何实现的?
    • 在 Android 文档中没有更好地记录这有点疯狂,arrgh
    • @AndroidPenguin 你真的需要调用 supers onActivityResult() 两次吗?
    • 重要提示:我尝试将上述 sn-p 放入启动购买的 Fragment 中。这导致回调适用于失败的购买,但奇怪的是,不适用于成功的购买。让我永远发现 OnActivityResult() sn-p 必须在我的实际主 Activity 中,not 在 Fragment 中。 (知道为什么吗?)
    【解决方案2】:

    AndroidPenguin,我遇到了和你一样的问题,但是我正确设置了活动结果,但我的 purchasefinishedlistener 没有执行。

    这是我的 onActivityResult

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
    
        if (SettingsManager.getBooleanSetting(rootId, "inapppurchase", false)){
            Log.d(TAG, "take care of activity result with billing helper");
            if (!mBillingService.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.");
            }
        }
        else
            super.onActivityResult(requestCode, resultCode, data);
    }
    

    【讨论】:

    • 您能解决问题吗?我有同样的问题。其中 mHelper.launchPurchaseFlow 无法识别。
    • 是的,我确实解决了这个问题。发生的事情是我在错误的类中实现 onActivityResult。我正在使用片段和活动,似乎我的父类 ACTIVITY 需要实现 onActivityResult 而不是片段。例如:sampleFragment 是从 sampleActivity 调用的。您必须在 sampleActivity 中实现 onActivityResult。
    • 我或多或少遇到了与@kevinl 相同的问题,我花了很长时间才找到它。将 OnActivityResult() 添加到 Fragment 有时会起作用,例如一些失败的购买,但不是成功的。将 OnActivityResult 放在“父”活动中可以解决此问题。 (如果您编辑了答案,并且没有在评论中留下这个重要的花絮,将会有很大帮助。如果您这样做,我会支持它!)
    【解决方案3】:

    就我而言,它正在工作 试试这样 等到谷歌播放对话框自行关闭。然后,监听器将被调用

    【讨论】:

      【解决方案4】:

      对于那些与我遇到同样问题的人......

      我刚刚将我的成员变量 IabHelper 设为静态,这解决了问题。

      我已经添加了 AndroidPenguin 的代码,但在我购买了一个项目之后,仍然会因为 null IabHelper 而崩溃(所以 onActivityResult 从来没有机会调用 handleActivityResult,因为 mHelper 为 null)。

      【讨论】: