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 从未调用过。的主要内容,如果未能解决你的问题,请参考以下文章