我第一次实现应用内计费,并使用静态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(静态购买的
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
被调用,我在日志中看到购买失败
:“应用内计费错误:无法购买物品,错误响应:7:物品已拥有”
这是有道理的,但如果我尝试购买其他物品,我的应用程序就会崩溃,并出现以下错误:
JAVAlang.IllegalStateException:无法启动异步操作(launchPurchaseFlow),因为另一个异步操作(launchPurchaseFlow)正在进行中。
当我尝试执行失败的购买时,onActivityResult回调不会发生,所以失败的启动流不会得到处理和清理。所以,当我尝试另一个购买时,这就是它崩溃的原因,因为它应该还在最后一个失败的事务中。
我做错了什么?我如何确保失败后清理启动PurchaseFlow()?
对我来说,最好的解决办法是将代码升级到最近的代码(这里),然后按照这篇文章的建议执行:
1)使方法regEndAsync
公开。它在那里,只是不可见。
2) 让每个侦听器调用帮助器。确保程序被正确标记为已完成;似乎所有的听众都需要它。
3) 用
try/catch
环绕调用,以捕获可能发生的非法状态异常
,并以这种方式处理。
更新代码还不够的原因是,我发现了这种错误仍然存在的特殊情况(或者至少有一个):
断开与因特网的连接;
- 进入你的应用;
- 让它初始化
IabHelper
; - 连接到互联网;
- 一旦设备连接,尝试进行购买。
我知道这有点晚了,但我今天也遇到了同样的问题,我在一个片段中调用了应用内计费,所以我查看了“labHelper.java”,我看到了一个我认为可以解决这个问题的直接解决方案,就是。。。我在labHelper中修改了“void flagStartAsync(字符串操作)”方法。java应该如下所示
void flagStartAsync(String operation) {
if (mAsyncInProgress) {
flagEndAsync();
}
if (mAsyncInProgress) throw new IllegalStateException("Can't start async operation (" +
operation + ") because another async operation(" + mAsyncOperation + ") is in progress.");
mAsyncOperation = operation;
mAsyncInProgress = true;
logDebug("Starting async operation: " + operation);
}
我希望这能帮助一些人。。。
我相信你只需要在应用程序内计费类中获得更新的代码,你就不会再遇到同样的问题了。
据我所知,谷歌尚未推出对SDK管理器的更改。只要将新类复制/粘贴到你的类中,你就不应该再遇到这个问题了。
请在此处查看新的代码更改:https://code.google.com/p/marketbilling/source/detail?r=7ec85a9b619fc5f85023bc8125e7e6b1ab4dd69f
截止到3月15日,已更改的课程为:IAB Helper。java,库存。java,详细信息。java和一些主要活动。java文件
我正在使用谷歌教程推荐的实用程序类,这个错误让我深受打击。显然,不能同时运行多个异步操作。我甚至试图在盘点仍在进行的时候开始购买,成功了。 我已经按照这里的建议尝试在我的主类中实现了,但在出现错误之前,我甚至没有得到对该方法的调用。然后我找到了这个,但我不知道在哪里可以找到这个方法——它不在类中。 现在我正在寻找一种方法来解决这个问题(而不需要重新实现整个她-邦)。我能想到的唯一解决方案是创建一个
启动购买流后,onActivityResult方法需要什么? 来自平凡的驱动器示例: msgstr"在这里,您可以对与应用内计费无关的活动结果执行任何处理" 这是否意味着您需要更新用户的清单或显示警报框?如果是这样,我已经在OnConsumeFinishedListener中这样做了。我已经测试了我的代码,留下了上面的onActivityResult方法,看起来没问题。这可能会导致任何问题吗? 或
我在JavaEE项目中使用eclipse 怎么修? 在我的电脑意外关机之前,glassfish的一切都很好
为了测试Android应用内计费v3,我实现了一个对话框,其中添加了一个选项适配器。我添加了测试SKU,“Android.测试.购买”,“Android.测试.取消”,“Android.测试.退款”,“Android.测试.项目不可用”。 当我使用该对话框启动购买流时,一切正常,我能够购买该商品,并且该商品是绝对购买的。然而,当我的应用程序尝试刷新UI时,我会收到一个nullpointerexce
我在测试我的应用内计费时遇到了麻烦。 (使用Google Play应用内计费版本3 API) 问题: 已退款的应用程序内购买仍然存在于购买列表中,该列表由BillingClient.query购买()提供。 当我在一月份尝试退款时,退款的物品从购物清单上消失了。 我所做的: 作为测试人员购买了一些物品。 (我很确定对话框说是测试购买。) 之后在谷歌游戏控制台退款。 等到他们的付款状态变成退款。 清
当我试图在Android Studio中导入一个gradle项目时,我遇到了以下错误。 这是我看到的输出: 我已经关闭了在SO中的解决方案中提到的防病毒软件。但是似乎什么都不起作用。