Android 未调用onPurchaseStateChange

Android 未调用onPurchaseStateChange,android,in-app-purchase,in-app-billing,Android,In App Purchase,In App Billing,应用内功能的示例代码包括: onPurchaseStateChange(PurchaseState purchaseState, String itemId, int quantity, long purchaseTime, String developerPayload) 它还提供了应用程序内购买的信息(id、金额等) 在这里,我可以更新我的代码,但在这个回调方法中,我并没有从计费服务得到任何响应。示例应用程序中有什么错误。有人能帮忙吗 提前感谢。我不确定问题出在哪里

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

onPurchaseStateChange(PurchaseState purchaseState, String itemId,
            int quantity, long purchaseTime, String developerPayload)
它还提供了应用程序内购买的信息(id、金额等)

在这里,我可以更新我的代码,但在这个回调方法中,我并没有从计费服务得到任何响应。示例应用程序中有什么错误。有人能帮忙吗


提前感谢。

我不确定问题出在哪里,也不知道为什么有时请求活动中的
@覆盖的onPurchaseStateChange
不会被调用,但我可以验证BillingReceiverBillingService中的
onPurchaseStateChange
是否总是被调用

由于某些原因,有时回调不会一直返回到调用活动

顺便说一句,这个问题似乎只有在您购买托管产品或订阅时才会发生。如果您购买的是非托管产品,则回调将始终到达

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

@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(似乎是正确的解决方案): 谷歌的示例代码包括以下方法:

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

        ResponseHandler.unregister(YOUR_PURCHASE_OBSERVER);
    }
这会导致在您打开Play store购买活动的那一刻取消注册观察者。当您返回活动时(无论是购买后还是返回按钮),将调用
onStart
,并重新启动
purchaseObserver
,但并不总是使用购买信息-这将导致永远不会调用
onPurchaseStateChange

解决方案是从onStop中删除注销并将其移动到onDestroy。另一种解决方案是将其保留在那里,但从一个包含以前接收到的详细信息的队列开始。请看这里: