onIabPurchaseFinished 从未调用过。

Posted

技术标签:

【中文标题】onIabPurchaseFinished 从未调用过。【英文标题】:onIabPurchaseFinished never called. 【发布时间】:2013-01-25 20:31:06 【问题描述】:

我一直在尝试为我的第一个应用设置应用内结算,并且一直在使用 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!");
             


    
;

【问题讨论】:

我应该补充一点,我正在尝试从标签中执行此操作 我已经以编程方式设置了 id,但没有区别。 【参考方案1】:

我遇到了同样的问题,也没有调用 onActivityResult。 灵感来自@Ghulam's answer 我意识到活动 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);
        
    

【讨论】:

在我的情况下,这个答案有效,但我必须在我的主要活动中添加一个 OnActivityResult 覆盖(github.com/onepf/OpenIAB/issues/166)【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

我希望以下链接对想要实施新库的人有所帮助:

Google's blog post about the release

Google's youtube video

Play Billing Library Training Class

Google's Trivial Drive v2 Sample

Play Billing Library codelab published during Google I/O 2017

Play Billing Library Docs

Official reference for classes and methods

Releases notes

【讨论】:

【参考方案4】:

尝试将此添加到调用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.");
    

【讨论】:

遇到了同样的问题,而且效果很好。但我想知道的是为什么回调不会像人们想象的那样被执行,为什么我们必须调用我们自己?有点使回调无用:/ 也帮助了我,谢谢。 @Spider,您在 Activity 中需要此方法的原因是,否则 mHelper 的 handleActivityResult() 方法将不会被调用。换句话说,这是Activity中需要的真实/标准的handleActivityResult(),而mHelper的其实只是一个普通的老方法。 谢谢。这是文档中的一个错误(他们从未提到需要这个或在 IabHelper 中。IabHelper 的 launchPurchaseFlow() 调用 startIntentSenderForResult - 它会在完成时调用您的活动的 onActivityResult()。 当我发现这个时,我以为我已经解决了我的问题......然后我意识到我已经实现了这个功能,它仍然不起作用...... sigh 请注意,在 Fragment 上覆盖 onActivityResult() 不起作用,必须在 Activity 上完成【参考方案5】:

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

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

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

【讨论】:

以上是关于onIabPurchaseFinished 从未调用过。的主要内容,如果未能解决你的问题,请参考以下文章

性能调优:京东架构师调优技巧全解,从未公布的技巧

QTableView点击信号从未发出?

Spark3.0核心调优参数小总结

mysql5.7性能提升一百倍调优宝典

mysql5.7性能提升一百倍调优宝典

HBase最佳实践-CMS GC调优(从gc本身参数调优)