IabHelper PurchaseFinishedListener

22

如果我通过标准的

<intent-filter>

将购买意图发送

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();
    }
};

从日志到结尾都没有起作用。我是否漏掉了什么?

4个回答

50

我找到了解决方法。在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.");
        }
    }

5
这在安卓文档中没有更好的记录,有点让人发疯,啊。 - Alfie Hanssen
9
@AndroidPenguin,你真的需要调用supers onActivityResult()两次吗? - nyaray
在我的情况下,当我旋转设备时,监听器的引用丢失了。真的很让人恼火。 - joepetrakovich
将监听器设为静态变量 @某位开发者 - AndroidPenguin
1
重要提示:我尝试将上述片段放入启动购买的Fragment中。这导致回调在购买失败时起作用,但奇怪的是,在成功购买时却没有起作用。花了我很长时间才发现OnActivityResult()片段必须在我的实际主Activity中,而不是在Fragment中。(有任何想法为什么吗,有人?) - RobP
显示剩余10条评论

5

AndroidPenguin,我遇到了与你相同的问题,但是我已经正确设置了activityresult,但我的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);
}

2
你能解决这个问题吗?我也遇到了同样的问题,就是mHelper.launchPurchaseFlow无法被识别。 - Arsalan
2
是的,我已经解决了这个问题。问题出在我在错误的类中实现了onActivityResult。我同时使用了片段和活动,似乎我的父类ACTIVITY需要实现onActivityResult而不是片段。例如:sampleFragment是从sampleActivity中调用的。你必须在sampleActivity中实现onActivityResult。 - kevinl
我和@kevinl有着类似的问题,而且花费了很长时间才找到解决方法。将OnActivityResult()添加到Fragment中有时可以解决一些失败的购买问题,但对于成功的购买则无效。将OnActivityResult放在“父”Activity中可以解决这个问题。(如果你编辑了你的回答并不是在评论中留下这个重要的提示,那会帮助很多人,我会点赞的!) - RobP

1
在我的情况下,它是有效的。尝试像这样操作,等待直到Google Play对话框自行关闭。然后,监听器将被调用。

-1

对于那些遇到我经历过的相同问题的人...

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

我已经添加了 AndroidPenguin 的代码,但在购买物品后仍然会出现 null IabHelper 引起的崩溃(所以 onActivityResult 没有机会调用 handleActivityResult,因为 mHelper 为空)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接