onPurchaseStateChange没有被调用

时间:2012-10-11 16:20:14

标签: android in-app-purchase in-app-billing

应用内功能的示例代码包含:

onPurchaseStateChange(PurchaseState purchaseState, String itemId,
            int quantity, long purchaseTime, String developerPayload)

它会显示有关应用内购买的信息(ID,多少等)。

在这里我可以更新我的代码,但我没有在Billing Service的回调方法中得到任何响应。示例应用程序有什么问题。有人可以帮忙吗?

先谢谢。

1 个答案:

答案 0 :(得分:2)

我不确定问题是什么,为什么有时请求活动中的@overrided onPurchaseStateChange没有被调用,但我可以验证 BillingReceiver 中的onPurchaseStateChange和始终会调用 BillingService

出于某种原因,有时,回调不会一直返回到调用Activity。

顺便说一下,这个问题似乎只发生在您购买被管理产品或订阅时。如果您购买非托管产品,回拨将始终到达。

解决方案可能是(在请求购买活动 - 示例应用程序中的Dungeons Activity中):

@Override
        public void onPurchaseStateChange(PurchaseState purchaseState, String itemId, int quantity, long purchaseTime, String developerPayload) {

            if (purchaseState == PurchaseState.PURCHASED) {

                onPurchaseStateChange = true;

                // Do whatever you need to do after purchase here first.

            }
        }

        @Override
        public void onRequestPurchaseResponse(RequestPurchase request, ResponseCode responseCode) {


            if (responseCode == ResponseCode.RESULT_OK) {

                if (!onPurchaseStateChange) {
                    // If onPurchaseStateChange = false, the onPurchaseStateChange callback didn't arrive from the BillingService, so you can perform your after purchase actions here.
                }

            } else if (responseCode == ResponseCode.RESULT_USER_CANCELED) {

            } else {

            }
        }

解决方案#2(似乎是正确的解决方案): Google的示例代码包含以下方法:

@Override
    protected void onStop() {
        super.onStop();

        ResponseHandler.unregister(YOUR_PURCHASE_OBSERVER);
    }

这会导致观察者在您打开Play商店购买活动的第二个时间内取消注册。当您返回到您的活动时(无论是购买后还是后退按钮),onStart都会被调用并重新启动purchaseObserver,但并不总是包含购买信息 - 这会导致onPurchaseStateChange永远不会被召唤。

解决方案是从onStop中删除取消注册并将其移至onDestroy。另一种解决方案是将其保留在那里,但是使用保存先前接收的详细信息的队列启动它。见这里:Android in-app-billing. When to unregister the ResponseHandler?