inventory.getPurchase() всегда возвращает ноль, хотя уже куплено

Я работаю с образцом покупки в приложении. В моем приложении есть 2 кнопки, первая кнопка по умолчанию отключена, нажатие второй кнопки приведет к покупке и включению первой кнопки. Кнопка покупки работает правильно, но после покупки я проверяю инвентарь, но он всегда возвращает ноль, это означает, что я еще не купил.

Вот исходный код:

Настраивать:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    buyButton = (Button) findViewById(R.id.buyButton);
    clickButton = (Button) findViewById(R.id.clickButton);
    clickButton.setEnabled(false);
    String base64EncodedPublicKey = "key";
    mHelper = new IabHelper(this, base64EncodedPublicKey);

    mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
        public void onIabSetupFinished(IabResult result) {
            if (!result.isSuccess()) {
                Log.d(TAG, "In-app Billing setup failed: " + result);
            } else {
                Log.d(TAG, "In-app Billing is set up OK");
            }
            // Query to detect user was buy this item or not
            mHelper.queryInventoryAsync(mReceivedInventoryListener);
        }
    });

    buyButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            if (clickButton.isEnabled()) {
                mHelper.queryInventoryAsync(mReceivedInventoryListener);
            } else {
                buyClick(v);
            }
        }
    });
}

Кнопка покупки товара:

public void buyClick(View view) {
    mHelper.launchPurchaseFlow(this, ITEM_SKU, 10001,
            mPurchaseFinishedListener, "");
}

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
    public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
        if (result.isFailure()) {
            // Handle error
            return;
        } else if (purchase.getSku().equals(ITEM_SKU)) {
            // consumeItem();
            // buyButton.setEnabled(false);
            mHelper.consumeAsync(purchase, mConsumeFinishedListener);
        }

    }
};

Слушатель:

IabHelper.QueryInventoryFinishedListener mReceivedInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
    public void onQueryInventoryFinished(IabResult result,
            Inventory inventory) {

        if (result.isFailure()) {
            Toast.makeText(getApplicationContext(),
                    "Query Inventory Error!", Toast.LENGTH_SHORT).show();
            // Handle failure
        } else {
            Toast.makeText(getApplicationContext(),
                    "Query Inventory Success!", Toast.LENGTH_SHORT).show();
            // mHelper.consumeAsync(inventory.getPurchase(ITEM_SKU),
            // mConsumeFinishedListener);
            // if (inventory.hasPurchase(ITEM_SKU)) {
            // clickButton.setEnabled(true);
            // }
            Purchase item = inventory.getPurchase(ITEM_SKU);
            if (item != null) {
                clickButton.setEnabled(true);
            } else {
                Toast.makeText(getApplicationContext(),
                        "This item was not buy yet!", Toast.LENGTH_SHORT)
                        .show();
            }
        }
    }
};
IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() {
    public void onConsumeFinished(Purchase purchase, IabResult result) {

        if (result.isSuccess()) {
            Toast.makeText(getApplicationContext(), "Consume done!",
                    Toast.LENGTH_SHORT).show();
            clickButton.setEnabled(true);
        } else {
            Toast.makeText(getApplicationContext(), "Consume Error!",
                    Toast.LENGTH_SHORT).show();
            // handle error
        }
    }
};

При первом нажатии кнопки «Купить» отображается диалоговое окно оплаты, после успешной оплаты кнопка clickButton была включена.

Но когда я нажимаю кнопку buyButton во второй раз, она переходит в инвентарь, но inventory.getPurchase(ITEM_SKU) всегда возвращает значение null.

Есть идеи?

Спасибо!


person Han Tran    schedule 22.10.2013    source источник
comment
Судя по вашему вопросу, я думаю, что вы пытаетесь купить товар на один раз, я прав? Если да, то вам не нужно вызывать обработчик serveFinish для разовой покупки.   -  person Maulik    schedule 22.10.2013
comment
просто прокомментируйте свой код из onIabFinishListner mHelper.consumeAsync(purchase, mConsumeFinishedListener); для получения дополнительной информации: stackoverflow.com/questions/19195864/ и попробуйте купить снова и дайте мне знать, будет ли это решено или нет.   -  person Maulik    schedule 22.10.2013
comment
@Maulik Я стараюсь, чтобы пользователь покупал товар только один раз. Если пользователь удалит приложение и установит его снова, я проверю, купил ли пользователь уже этот элемент, и тогда ему не нужно покупать снова.   -  person Han Tran    schedule 22.10.2013
comment
Вы пробовали выше предложение, 2-й комментарий? В приведенной ссылке я объяснил, почему мы должны вызывать Async для многократной покупки, в вашем случае это не нужно. Так что просто удалите прослушиватель ConsumerAsync() из onIabPurchaseFinishlistener.   -  person Maulik    schedule 22.10.2013
comment
@Maulik Я постараюсь и отвечу вам позже, но похоже, что это правильно :-)   -  person Han Tran    schedule 22.10.2013
comment
проверьте мой ответ ниже.   -  person Maulik    schedule 22.10.2013


Ответы (1)


just comment or remove your code from OnIabPurchaseFinishedListener "mHelper.consumeAsync(purchase, mConsumeFinishedListener);"

Если вы предпочитаете тривиальную демоверсию по умолчанию для Android, сделайте покупку продукта премиум-класса для единовременной покупки продукта.

Прослушиватель OnIabPurchaseFinished()

// Callback for when a purchase is finished
    IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
        public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
            Log.d(TAG, "Purchase finished: " + result + ", purchase: "
                    + purchase);
            if (result.isFailure()) {
                complain("Error purchasing: " + result);
                // setWaitScreen(false);
                return;
            }
            if (!verifyDeveloperPayload(purchase)) {
                complain("Error purchasing. Authenticity verification failed.");
                // setWaitScreen(false);
                return;
            }

            Log.d(TAG, "Purchase successful.");


                if (purchase.getSku().equals(SKU_PREMIUM)) {
                          // bought the premium upgrade! 
                          Log.d(TAG, "Purchase is premium upgrade. Congratulating user.");
                  alert("Thank you for upgrading to premium!");
                    }

        }
    };  

Объяснение, почему он дает нулевые данные:

Имейте в виду, что Google будет хранить данные со своей стороны только тогда, когда вы пытаетесь приобрести одноразовый продукт. Но всякий раз, когда вы покупаете расходный материал, магазин Google Play не будет управлять информацией о приобретенном продукте и другими вещами в консоли Google Play. Вот почему мы должны вызвать метод ConsumerAsync(). когда мы купили товар, магазин Google Play сохраняет запись о том, что товар был куплен один раз, и позволяет вам купить его во второй раз.

для получения дополнительной информации: android: Inapp billing: Error response: 7:Товар уже принадлежит

Но здесь вы пытаетесь приобрести продукт как разовую покупку, поэтому вам не нужно вызывать метод ConsumerAsync() в onIabPurchasedFinishListener.

Надеюсь, это решит вашу проблему.

person Maulik    schedule 22.10.2013
comment
добавлен метод OnIabPurchaseFinishedListener() в ответ. проверьте мой отредактированный ответ. - person Maulik; 22.10.2013