【问题标题】:Google Play in-app billing version 3: crash on "item already owned" and missing failure notificationsGoogle Play 应用内结算版本 3:“项目已拥有”崩溃并且缺少失败通知
【发布时间】:2013-01-02 01:40:57
【问题描述】:

在(最终)发布了 Google Play 应用内结算的 v2 实现之后,我在发布后遇到了问题。交易丢失、崩溃、无法恢复、诸如“无法下载,您已经拥有此项目”之类的疯狂错误,以及各种其他荒谬的事情。老实说,我现在已经在 iOS、Amazon App Store、Samsung Apps 和 Blackberry 10 上集成了 IAB,而且 Google Play 代码花费的时间比其他所有代码加起来还要多。十倍。太可怕了。

无论如何,我决定尝试在我的应用中实施 v3。集成过程要简单得多,因此要感谢 Google。此外,恢复以前的交易现在可以按预期工作,这很好。但是,我遇到了一些令人震惊的问题:

  1. 当用户关闭 IAB 对话框(即点击对话框边框之外)时,我没有收到任何通知。我希望收到某种“用户取消”失败事件,但不会触发 onIabPurchaseFinished、onConsumeFinished 或 onQueryInventoryFinished。结果,我的应用程序对此没有响应,并且我在屏幕上留下了一个肮脏的未使用的活动。我是否错过了某种“dialogIsFinished”事件?
  2. 当用户尝试购买他们已经拥有的物品时,应用程序崩溃。令人难以置信的是,这似乎是预期的行为,因为控制台上打印了一些暗示此行为的内容(“应用内结算错误:无法购买商品,错误响应:7:商品已拥有”)。我知道我应该在启动时查询可恢复的交易,但这不是一个解决方案,因为可以想象用户可以在恢复操作完成之前导航到我的 UI 的购买流程。当然这应该是一个非硬停止,比如一个对话框或什么?我在这里做错了吗?我简直无法理解,谷歌的某个人认为这种情况应该遭受重创……

非常感谢(提前)您的帮助。如果您认为有必要,我非常乐意分享代码,尽管我的问题似乎更多地是关于功能设计的。我希望我在这里做错了什么,因为我无法想象像谷歌这样有能力的公司会重写整个系统并且仍然到处都是如此巨大的漏洞......:-/

再次感谢,

【问题讨论】:

    标签: google-play in-app-billing


    【解决方案1】:

    嗯,那是我的错。当我编写 launchPurchaseFlow() 时,我最终遗漏了一些有关失败案例的清理代码。不仅在那里,而且在那之后的几个 catch{} 子句上也是如此。感谢您指出了这一点!这刚刚在源存储库中修复:http://code.google.com/p/marketbilling

    【讨论】:

    • 还缺少一些东西。值得再次查看,尤其是对于其他计费响应。例如 BILLING_RESPONSE_RESULT_ITEM_UNAVAILABLE、BILLING_RESPONSE_RESULT_ITEM_ALREADY_OWNED
    • 现在崩溃不存在了。但之前在 v2 中,google play 会弹出并显示已购买的商品。它没有在 v3 中显示。
    • @Bruno,您能否提供您在 BILLING_RESPONSE_RESULT_ITEM_ALREADY_OWNED 错误中添加的代码??
    • @Bruno,我有相关的问题(虽然不是直接的)。看来只有你能给出答案,请看:stackoverflow.com/questions/30295850/…
    【解决方案2】:

    我有同样的错误,我在购买后不小心忘记消费该物品。但是当我尝试购买另一个相同的项目时,应用程序崩溃了。

    我仔细研究了 Google IabHelper 类,发现这个语句没有被正确处理。我做了一些小改动,现在它可以工作了。而不是崩溃发送错误消息与侦听器。

    这里是代码的修改部分。它在launchPurchaseFlow() 方法中。我不确定通过更改看起来需要的代码我做了什么好事。希望对您有所帮助。

    try {
            logDebug("Constructing buy intent for " + sku);
            Bundle buyIntentBundle = mService.getBuyIntent(3, mContext.getPackageName(), sku, ITEM_TYPE_INAPP, extraData);
            int response = getResponseCodeFromBundle(buyIntentBundle);
            if (response != BILLING_RESPONSE_RESULT_OK) {
                logError("Unable to buy item, Error response: " + getResponseDesc(response));
    
                result = new IabResult(response, "Unable to buy item");
                if (listener != null) listener.onIabPurchaseFinished(result, null);
    
                /* Finish Current Async Task*/
                flagEndAsync();
    
            } else {
                PendingIntent pendingIntent = buyIntentBundle.getParcelable(RESPONSE_BUY_INTENT);
                logDebug("Launching buy intent for " + sku + ". Request code: " + requestCode);
                mRequestCode = requestCode;
                mPurchaseListener = listener;
                act.startIntentSenderForResult(pendingIntent.getIntentSender(),
                                               requestCode, new Intent(),
                                               Integer.valueOf(0), Integer.valueOf(0),
                                               Integer.valueOf(0));
    
            }
    

    【讨论】:

      猜你喜欢
      • 2014-06-25
      • 1970-01-01
      • 2021-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多