onPurchaseStateChange не вызывается

1

Пример кода для функции в приложении:

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

и он приводит информацию о сделанной в приложении покупке (id, сколько и т.д.).

и здесь я могу обновить свой код, но я не получаю никакого ответа в этом методе обратного вызова из службы биллинга. Что неправильно в примере приложения. может ли кто-нибудь помочь?

Спасибо в Advance.

Теги:
in-app-billing
in-app-purchase

1 ответ

2
Лучший ответ

Я не уверен, в чем проблема, и почему иногда @overrided onPurchaseStateChange в запрашивающей активности не вызывается, но я могу проверить, что onPurchaseStateChange в BillingReceiver и BillingService всегда вызываются.

По какой-то причине иногда обратный вызов просто не возвращается полностью к вызывающему 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 никогда не будет вызываться.

Решение состоит в том, чтобы удалить unregister из onStop и переместить его в onDestroy. Другое решение - оставить его там, но запустить его с очередью, в которой хранятся ранее полученные данные. Смотрите здесь: Android-приложение-биллинг. Когда нужно отменить регистрацию ResponseHandler?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню