112

我一直在尝试为我的第一个应用设置应用内计费,并且一直在使用 android.test.purchased sku。购买成功了,我设法将 SKU 放入我的库存中,但是,正如标题所说,onIabPurchaseFinished 从未被调用。

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

启动购买:

mHelper.launchPurchaseFlow(this, sku, 10001, mPurchaseFinishedListener, "");

和听众:

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!");
             }


    }
};
4

5 回答 5

206

尝试将此添加到调用的 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.");
    }
}
于 2013-02-19T21:53:39.110 回答
8

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

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

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

于 2014-10-10T11:08:34.677 回答
4

我有同样的问题,也没有调用 onActivityResult 。
受到@Ghulam 回答的启发,我意识到活动onActivityResult不会自动调用片段的onActivityResult,因此我必须手动进行。

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(mCurrentFragment!= null){
            mCurrentFragment.onActivityResult(requestCode, resultCode, data);
        }
    }
于 2018-04-09T14:53:38.787 回答
1

您需要调用 protected void onActivityResult(); 在您的父 Activity 而不是 MainActivity(Trivial Drive) 中,您从那里调用 MainActivity,即 Trivial Drive Activity。

如果购买成功,您将收到结果代码值 -1,否则为 0。

于 2018-02-03T15:52:34.127 回答
0

我遇到了同样的问题,并且已经实施了公认的解决方案,但不知道是什么原因造成的。迁移到新的Google Play 结算库 1.0 (2017 年 9 月 19 日发布)为我解决了这个问题!

我希望以下链接可以帮助想要实现新库的人:

谷歌关于发布的博客文章

谷歌的 youtube 视频

玩计费库培训班

Google 的 Trivial Drive v2 示例

在 Google I/O 2017 期间发布的 Play Billing Library codelab

播放结算库文档

类和方法的官方参考

发布说明

于 2018-01-29T12:42:34.290 回答