1

アプリの Google アプリ内購入に取り組んでいます。ID が「app.test.item」のマネージド プロダクト アイテムを作成しました。Google ドキュメントで指定されている他のすべての手順に従いました。初めての購入アプリは問題なく動作しています。しかし、アプリをアンインストールして再度インストールしようとすると。アプリは復元トランザクション リクエストを実行します。onRestoreTransactionsResponse() メソッドが呼び出され、Market から返された RESULT_OK に基づいて購入ステータスを true にします。私の疑問は、「app.test.item」という名前のアイテムのみが購入され、復元されたことをアプリがどのように認識しているのかということです。「app.test.second.item」など、他のアイテムもいくつか持っています。アプリ内課金では、この 2 つの違いをどのように認識していますか。Google が提供するアプリ内課金コードを使用しました。購入ステータスを保存するためのいくつかの共有設定について言及しました。私はここで何か間違ったことをしていますか?私を案内してください。

また、ワークフローを追跡できるように、このアプリをデバッグ モードでテストしたいと考えています。ただし、アプリはリリース バージョンで署名する必要があります。このアプリを完全に (復元トランザクションをテストするために) デバッグ バージョンで実行する方法はありますか。予約された productId を「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());
    }
}
4

2 に答える 2

4

管理対象製品は、アプリがリリース キーで署名されていないと使用できないため、デバッグが難しい場合があります。このため、IAB をテストするときにリリース キーを使用してデバッグ ビルドに署名します。

複数の商品については、アイテムIDを確認する必要があります。onPurchaseStateChange製品ごとに呼び出されます。

例えば

public void onPurchaseStateChange(PurchaseState purchaseState, String itemId, int quantity, long purchaseTime, String developerPayload) {

    if (itemId.equals("app.test.item") {
        switch (purchaseState) {

        case PURCHASED:
            Log.i("Billing","Purchased app.test.item");
            break;

        default:
            Log.i("Billing","Something else");
            break;

        }
    }
于 2012-05-11T07:35:16.143 に答える