Google Play应用内结算版本3:“已拥有的商品”崩溃并丢失了失败通知

时间:2013-01-18 10:51:15

标签: google-play in-app-billing

在(最终)发布Google Play应用内结算的v2实施后,我在启动后只有它的问题。丢失的交易,崩溃,无法恢复,疯狂的错误,如“无法下载,你已经拥有这个项目”,以及各种其他荒谬的事情。老实说,我现在已经在iOS,Amazon App Store,Samsung Apps和Blackberry 10上集成了IAB,Google Play代码比其他所有代码都花费了更多时间。十次。这太糟糕了。

无论如何,我决定尝试将v3应用到我的应用中。整合过程非常简单,因此谷歌对此赞不绝口。此外,恢复以前的交易现在按预期工作,这很好。但是,我有几个停止显示的问题:

  1. 当用户取消IAB对话框(即点击对话框边框外)时,我没有收到任何通知。我希望收到某种“用户取消”的失败事件,但是没有任何内容被触发到onIabPurchaseFinished,onConsumeFinished或onQueryInventoryFinished。结果我的应用程序没有响应这个,我在屏幕上留下了一个脏的未使用的活动。我错过了某种“dialogIsFinished”活动吗?
  2. 当用户尝试购买他们已拥有的项目时,应用程序崩溃。令人难以置信的是,这似乎是预期的行为,因为有一些暗示打印到控制台的内容(“应用程序内结算错误:无法购买项目,错误响应:7:项目已经拥有”)。我知道我应该在启动时查询可恢复的事务,但这不是一个解决方案,因为可以想象用户可以在恢复操作完成之前导航到我的UI的购买流程。当然这应该是一个非硬停止,如对话框或什么?我在这里做错了吗?我根本无法理解谷歌的某些人认为这种情况值得一劫......
  3. 非常感谢(提前)为您提供帮助。如果您认为有必要,我很乐意分享代码,尽管我的问题似乎更多地是关于功能设计而不是其他任何东西。我希望我在这里做错了,因为我觉得像谷歌这样有能力的公司会重新编写这个整个系统并且在整个地方仍然有如此巨大的漏洞......: - /

    再次感谢,

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

我有同样的错误,我购买后不小心忘了消耗该物品。但是,当我试图购买另一个相同的项目App崩溃。

我深入研究了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));

        }