这个答案直接解决了@Wouter 看到的问题......
确实,onActivityResult()
必须触发,就像许多人所说的那样。但是,错误在于 Google 的代码onActivityResult()
在某些情况下没有触发,即当您在运行应用程序的调试版本时按两次 [BUY] 按钮时。
此外,一个主要问题是用户可能处于不稳定的环境中(例如公共汽车或地铁)并按下您的 [BUY] 按钮两次...突然间您遇到了一个例外!
至少谷歌修复了这个令人尴尬的异常https://github.com/googlesamples/android-play-billing/commit/07b085b32a62c7981e5f3581fd743e30b9adb4ed#diff-b43848e47f8a93bca77e5ce95b1c2d66
下面是我在IabHelper
实例化的同一个类中实现的(对我来说,这是在 Application 类中):
/**
* invokes the startIntentSenderForResult - which will call your activity's onActivityResult() when it's finished
* NOTE: you need to override onActivityResult() in your activity.
* NOTE2: check IAB code updates at https://github.com/googlesamples/android-play-billing/tree/master/TrivialDrive/app/src/main/java/com/example/android/trivialdrivesample/util
* @param activity
* @param sku
*/
protected boolean launchPurchaseWorkflow(Activity activity, String sku)
{
if (mIabIsInitialized)
{
try
{
mHelper.launchPurchaseFlow(
activity,
sku,
Constants.PURCHASE_REQUEST_ID++,// just needs to be a positive number and unique
mPurchaseFinishedListener,
Constants.DEVELOPER_PAYLOAD);
return true;//success
}
catch (IllegalStateException e)
{
mHelper.flagEndAsync();
return launchPurchaseWorkflow(activity, sku);//recursive call
}
}
else
{
return false;//failure - not initialized
}
}
我的 [BUY] 按钮调用它launchPurchaseWorkflow()
并传递 SKU 和按钮所在的活动(或者如果您在片段中,则传递封闭活动)
注意:一定要IabHelper.flagEndAsync()
公开。
希望 Google 会在不久的将来改进此代码;这个问题大约有 3 年的历史了,它仍然是一个持续存在的问题 :(