アプリ内課金を初めて実装し、静的SKUIDを使用して最初の購入をテストしています。
それは最初は非常にうまくいきました。電話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's 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");
2回目にアイテムを購入しようとすると、OnIabPurchaseFinishedListener
が呼び出さpurchase failed
れ、ログに「アプリ内請求エラー:アイテムを購入できません。エラー応答:7:アイテムは既に所有されています」と表示されます。
それは理にかなっていますが、別のアイテムを購入しようとすると、次のエラーでアプリがクラッシュします。
java.lang.IllegalStateException:別の非同期操作(launchPurchaseFlow)が進行中であるため、非同期操作(launchPurchaseFlow)を開始できません。
失敗したonActivityResult
購入を実行しようとしてもコールバックが発生しないため、失敗した起動フローは処理およびクリーンアップされません。したがって、別の購入を試みると、最後に失敗したトランザクションの途中にあると思われるため、クラッシュするのはそのためです。
私は何が間違っているのですか?失敗後にlaunchPurchaseFlow()が確実にクリーンアップされるようにするにはどうすればよいですか?