Я внедряю In App Billing в первый раз, и я тестирую свои первые покупки, используя статические идентификаторы SKU.
Это сработало очень хорошо в первый раз. Я позвонил mHelper.launchPurchaseFlow(...)
и завершил пробную покупку. Моя активность получила обратный вызов onActivityResult
, и я обязательно обработал его с помощью mHelper.handleActivityResult(...)
. Все было здорово.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// Pass on the activity result to the helper for handling
log("onActivityResult");
if (!this.mHelper.handleActivityResult(requestCode, resultCode, data)) {
log("cleared the launch flow");
// not handled, so handle it ourselves (here where you'd
// perform any handling of activity results not related to in-app
// billing...
super.onActivityResult(requestCode, resultCode, data);
}
}
Однако я хотел протестировать следующую часть, поэтому я перезапустил приложение и попытался купить тот же SKU (статический purchased
SKU).
mHelper.launchPurchaseFlow(rootActivity, "android.test.purchased", 10002,
new IabHelper.OnIabPurchaseFinishedListener() {
@Override
public void onIabPurchaseFinished(IabResult result, Purchase purchaseInfo) {
if (result.isFailure()) {
log("purchased failed");
} else {
log("purchase succeeded");
}
}
}, "bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ");
Во второй раз, когда я пытаюсь купить элемент, мой OnIabPurchaseFinishedListener
вызывается, и я вижу purchase failed
в своем журнале: "Ошибка выставления счета в приложении: невозможно купить элемент, ответ об ошибке: 7: элемент уже принадлежит"
Это имеет смысл, но если я попытаюсь приобрести другой элемент, то мое приложение выйдет со следующей ошибкой:
java.lang.IllegalStateException: не удается запустить асинхронную работу (launchPurchaseFlow), потому что другой асинхронный выполняется операция (launchPurchaseFlow).
Обратный вызов onActivityResult
не происходит, когда я пытаюсь выполнить покупку, которая терпит неудачу, поэтому сбой при запуске не обрабатывается и не очищается. Поэтому, когда я пытаюсь выполнить другую покупку, это происходит потому, что она все еще предположительно находится в середине последней неудавшейся транзакции.
Что я делаю неправильно? Как я могу убедиться, что startPurchaseFlow() очищен после сбоя?