Inventory.getPurchase () всегда возвращает null, хотя уже приобрел

Я работаю с образцом покупки in-ap. Мое приложение имеет 2 кнопки, первая кнопка была отключена по умолчанию, нажмите вторую кнопку, чтобы купить и включить первую кнопку. Кнопка покупки работает правильно, но после покупки я проверяю инвентарь, но он всегда возвращает null, это значит, что я еще не приобрел.

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

Настроить:

@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.

Есть идеи?

Спасибо!

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

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

OnIabPurchaseFinishedListener ()

 // 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. Вот почему мы должны вызвать метод consumeAsync (). Когда мы приобрели товар, магазин Google Play сохранил запись, и он был куплен за один раз и позволит вам приобрести второй раз.

Для получения дополнительной информации: android: бинация Inapp: ошибка ответа: 7: элемент уже принадлежит

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

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