私はアプリのGoogleアプリ内購入に取り組んでいます。 idが "app.test.item"の管理対象商品アイテムを作成しました。私はgoogleのドキュメントで指定された他のすべての手順に従いました。初めて購入アプリが正常に動作しています。しかし、私は、アプリを一度アンインストールして、もう一度インストールしようとします。アプリは、トランザクションの復元要求を実行します。 onRestoreTransactionsResponse()メソッドが呼び出され、マーケットから返されたRESULT_OKに基づいて購入ステータスを真にします。私の疑問は、「app.test.item」という名前のアイテムしか購入されていないため、復元されていることをアプリがどのように知っているかです。私は他のアイテム、例えば "app.test.second.item"も持っています。アプリ内課金はどのように2つの違いが見えますか?私はGoogle提供のアプリ内課金コードを使用しました。ちょうど購入状況を保存するためにいくつかのsharedpreferencesを述べた。私はここで何か悪いことをしていますか?私を案内してください。Googleアプリ内課金:restoreTransactions()の動作
また、このアプリケーションをデバッグモードでテストして、ワークフローをトレースすることができます。しかし、アプリはリリース版で署名する必要があります。デバッグ版でこのアプリケーションを完全に(復元トランザクションをテストするために)実行できる方法はありますか?私は、予約商品IDを「android.test.purchased」として一般購入の一般的なワークフローを理解しました。しかし、私はrestoreTransactions()をテストする必要があります。どんな助けもありがとうございます。
PurchaseObserverのサンプルコードをここに掲載しています。
おかげで、
private class DungeonsPurchaseObserver extends PurchaseObserver {
public DungeonsPurchaseObserver(Handler handler) {
super(Dungeons.this, handler);
}
@Override
public void onBillingSupported(boolean supported) {
if (Consts.DEBUG) {
Log.i(TAG, "supported: " + supported);
}
if (supported) {
restoreDatabase();
} else {
showDialog(DIALOG_BILLING_NOT_SUPPORTED_ID);
}
}
@Override
public void onPurchaseStateChange(PurchaseState purchaseState, String itemId,
int quantity, long purchaseTime, String developerPayload) {
if (Consts.DEBUG) {
Log.i(TAG, "onPurchaseStateChange() itemId: " + itemId + " " + purchaseState);
}
if (developerPayload == null) {
logProductActivity(itemId, purchaseState.toString());
} else {
logProductActivity(itemId, purchaseState + "\n\t" + developerPayload);
}
if (purchaseState == PurchaseState.PURCHASED) {
mOwnedItems.add(itemId);
logProductActivity("APPLICATION", ": STATE PURCHASED");
SharedPreferences pref = getSharedPreferences(PREF_FILE, MODE_PRIVATE);
SharedPreferences.Editor editor = pref.edit();
editor.putString(PURCHASE_STATUS, "ITEM PURCHASED");
editor.commit();
}
if(purchaseState == PurchaseState.CANCELED)
{
logProductActivity("APPLICATION", ": STATE CANCELLED");
SharedPreferences pref = getSharedPreferences(PREF_FILE, MODE_PRIVATE);
SharedPreferences.Editor editor = pref.edit();
editor.putString(PURCHASE_STATUS, "ITEM CANCELLED");
editor.commit();
}
if(purchaseState == PurchaseState.REFUNDED)
{
logProductActivity("APPLICATION", ": STATE REFUNDED");
SharedPreferences pref = getSharedPreferences(PREF_FILE, MODE_PRIVATE);
SharedPreferences.Editor editor = pref.edit();
editor.putString(PURCHASE_STATUS, "ITEM REFUNDED");
editor.commit();
}
}
@Override
public void onRequestPurchaseResponse(RequestPurchase request,
ResponseCode responseCode) {
if (Consts.DEBUG) {
Log.d(TAG, request.mProductId + ": " + responseCode);
}
if (responseCode == ResponseCode.RESULT_OK) {
if (Consts.DEBUG) {
Log.i(TAG, "purchase was successfully sent to server");
}
logProductActivity(request.mProductId, "sending purchase request");
} else if (responseCode == ResponseCode.RESULT_USER_CANCELED) {
if (Consts.DEBUG) {
Log.i(TAG, "user canceled purchase");
}
logProductActivity(request.mProductId, "dismissed purchase dialog");
} else {
if (Consts.DEBUG) {
Log.i(TAG, "purchase failed");
}
logProductActivity(request.mProductId, "request purchase returned " + responseCode);
}
}
@Override
public void onRestoreTransactionsResponse(RestoreTransactions request,
ResponseCode responseCode) {
if (responseCode == ResponseCode.RESULT_OK) {
if (Consts.DEBUG) {
Log.d(TAG, "completed RestoreTransactions request");
}
// Update the shared preferences so that we don't perform
// a RestoreTransactions again.
SharedPreferences prefs = getSharedPreferences(PREF_FILE, MODE_PRIVATE);
SharedPreferences.Editor edit = prefs.edit();
edit.putBoolean(DB_INITIALIZED, true);
edit.putString(PURCHASE_STATUS, "ITEM PURCHASE RESTORED");
edit.commit();
logProductActivity("onRestoreTransactionsResponse() method in PurchaseObserver", "ITEM PURCHASE RESTORED");
} else {
if (Consts.DEBUG) {
Log.d(TAG, "RestoreTransactions error: " + responseCode);
}
}
logProductActivity("onRestoreTransactionsResponse() method in PurchaseObserver", responseCode.toString());
}
}
こんにちはvansi、 私はあまりにもここに立ち往生してまだいくつかのサンプルプロジェクトを与えることができますし、まだ2日間から外に出る方法はありません:(.. – LuminiousAndroid