我是第一次实施 In App Billing,我正在使用静态 SKU id 测试我的第一次购买。
第一次效果很好。我打电话mHelper.launchPurchaseFlow(...)
并完成了测试购买。我的活动收到了onActivityResult
回调,我确保使用mHelper.handleActivityResult(...)
. 一切都很棒。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// Pass on the activity result to the helper for handling
log("onActivityResult");
if (!this.mHelper.handleActivityResult(requestCode, resultCode, data)) {
log("cleared the launch flow");
// 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);
}
}
但是,我想测试下一部分,所以我重新启动了应用程序并尝试购买相同的 SKU(静态purchased
SKU)。
mHelper.launchPurchaseFlow(rootActivity, "android.test.purchased", 10002,
new IabHelper.OnIabPurchaseFinishedListener() {
@Override
public void onIabPurchaseFinished(IabResult result, Purchase purchaseInfo) {
if (result.isFailure()) {
log("purchased failed");
} else {
log("purchase succeeded");
}
}
}, "bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ");
我第二次尝试购买该项目时,我OnIabPurchaseFinishedListener
被调用,我purchase failed
在我的日志中看到:“应用内计费错误:无法购买项目,错误响应:7:项目已拥有”
这是有道理的,但如果我尝试购买另一件商品,我的应用程序会因以下错误而崩溃:
java.lang.IllegalStateException:无法启动异步操作 (launchPurchaseFlow),因为另一个异步操作 (launchPurchaseFlow) 正在进行中。
当onActivityResult
我尝试进行失败的购买时,不会发生回调,因此失败的启动流程不会得到处理和清理。所以,当我尝试另一次购买时,这就是它崩溃的原因,因为它仍然应该在最后一次失败的交易中间。
我究竟做错了什么?如何确保在失败后清理 launchPurchaseFlow()?