当前位置: 首页 > 知识库问答 >
问题:

Android应用内计费:无法启动launchPurchaseFlow,因为launchPurchaseFlow正在进行

曾元忠
2023-03-14

我第一次实现应用内计费,并使用静态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()?

共有3个答案

彭硕
2023-03-14

对我来说,最好的解决办法是将代码升级到最近的代码(这里),然后按照这篇文章的建议执行:

1)使方法regEndAsync公开。它在那里,只是不可见。

2) 让每个侦听器调用帮助器。确保程序被正确标记为已完成;似乎所有的听众都需要它。

3) 用try/catch环绕调用,以捕获可能发生的非法状态异常,并以这种方式处理。

更新代码还不够的原因是,我发现了这种错误仍然存在的特殊情况(或者至少有一个):

  • 断开与因特网的连接;
  • 进入你的应用;
  • 让它初始化IabHelper
  • 连接到互联网;
  • 一旦设备连接,尝试进行购买。

鲁成天
2023-03-14

我知道这有点晚了,但我今天也遇到了同样的问题,我在一个片段中调用了应用内计费,所以我查看了“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);
}

我希望这能帮助一些人。。。

邵麒
2023-03-14

我相信你只需要在应用程序内计费类中获得更新的代码,你就不会再遇到同样的问题了。

据我所知,谷歌尚未推出对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中的解决方案中提到的防病毒软件。但是似乎什么都不起作用。