130

私は現在、将来のアプリのアプリ内課金をテストしており、最初にテスト アイテム「android.test.purchased」を正常に「購入」した後、再度購入しようとするたびに応答コード 7 を受け取るようになりました。つまり、私はすでにこのアイテムを所有しています。

12-15 23:02:14.149: E/IabHelper(19829): アプリ内課金エラー: アイテムを購入できません、エラー応答: 7: アイテムは既に所有されています

私の理解では、この購入は常に可能であるはずですよね? 開発者が自分のアプリをテストできるように?

そうでない場合、その状態を所有されていない状態に「リセット」するにはどうすればよいですか? Google In-App Billing Sample の util パッケージを使用しています。

4

15 に答える 15

110

このコードをスレッドに追加して、消費リクエストを開始します。

int response = mService.consumePurchase(3, getPackageName(), purchaseToken);

ここで購入テストの場合、 purchaseToken は

purchaseToken = "inapp:" + getPackageName() + ":android.test.purchased";

if (response == 0)

その後、消費は成功します。

また、mService を公開することも忘れないでください。

IabHelper.Java

次に、次のようにアクセスできます。

int response = mHelper.mService.consumePurchase(3, getPackageName(), purchaseToken);
于 2012-12-20T08:27:00.500 に答える
99

特別な消費コードを書く必要はありません。Google Play ストアのデータを消去するには、adb コマンドを使用するだけです。

adb shell pm clear com.android.vending
于 2015-05-11T22:46:03.940 に答える
69

android.test.purchased アイテムは通常の ID のように動作することがわかりました。つまり、もう一度購入できるようにするには、コードのどこかでそれを消費する必要があります。Google のドキュメントはこの問題について誤解を招くものであり、テスト目的で無制限に購入できる別の静的 ID を追加する必要があると思います。

于 2012-12-16T00:30:19.560 に答える
28

アプリ内バージョン 3:

IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {

    public void onQueryInventoryFinished(IabResult result, Inventory inventory) {

        .....................

        if (inventory.hasPurchase(SKU_CONTENT)) {

            mHelper.consumeAsync(inventory.getPurchase(SKU_CONTENT), null);
        }
    }
};
于 2013-03-16T18:39:38.987 に答える
14

バージョン 3 - 最速の解決方法: Google Play ストアのキャッシュをクリアすると、「android.test.purchased」が再び利用できるようになります。

于 2016-04-07T08:25:34.220 に答える
9

これがアイテムを消費する方法です

 consume.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Thread t = new Thread(new Runnable() {
                @Override
                public void run() {
                    String purchaseToken = "inapp:" + getPackageName() + ":android.test.purchased";
                    try {
                        Log.d("","Running");
                        int response = mService.consumePurchase(3, getPackageName(), purchaseToken);
                        if(response==0)
                        {
                            Log.d("Consumed","Consumed");
                        }else {
                            Log.d("","No"+response);
                        }
                    }catch (RemoteException e)
                    {
                        Log.d("Errorr",""+e);
                    }

                }
            });
            t.start();
        }
    });
于 2014-09-13T14:47:01.643 に答える
6

私の意見では、プログラムがアイテムを消費するように設計されていない場合、外部ベンダーのメモリをクリアするためにコードを微調整する必要はありません。これにより、コードがより壊れやすくなり、ソフトウェアに属さないコードを追加および削除するために多くの時間を費やす必要があるため、そのようなソリューションを実装するのは悪い設計です.

android.test.purchased をクリアするために私のために働いた最良の解決策は

adb uninstall com.yourapp.name

その後

adb shell pm clear com.android.vending

現金を清算したり、アプリの設定を閲覧したり、そのためのコードを変更したりする必要はありませんでした. Windowsシステムのパス変数にadbを追加する必要がありましたが、これは非常に簡単でした。そうです、おそらくとにかく必要な adb を使用する必要があります..

C:\ ...\android-sdk\platform-tools; を追加するだけです。環境変数のWindowsパスで、MacやLinux OSでもかなり単純だと思います。アプリの請求にアンドロイドを実装することで、誰かが数日を節約するのに役立つことを願っています.

于 2015-07-01T12:02:47.547 に答える
6

Google Play デベロッパー コンソールに移動しOrder Management、左側のメニュー項目を開いて、払い戻しを希望する注文を選択します。また、資格を必ず削除してください。

于 2017-09-06T13:13:31.243 に答える
1

テスト環境の場合

1) android.test.purchased の場合、android デバイスを再起動する (インベントリを消費する) ことで、偽の支払いをリセットできます。

2) InApp util に Security.java というファイルがあるので、一時的に以下のようにします。セキュリティ例外のため、テスト支払い(偽)は常に false を返します。

public static boolean verifyPurchase(String base64PublicKey,
                                     String signedData, String signature) {
    return true; }

次に、OnIabPurchaseFinishedListener で fechInvForconsumeItem() を呼び出します

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener
            = new IabHelper.OnIabPurchaseFinishedListener() {
        public void onIabPurchaseFinished(IabResult result,
                                          Purchase purchase)
        {
            if (result.isFailure()) {
                // Handle error
                Log.e("123","Failure");

                return;
            }
            else if (purchase.getSku().equals(ITEM_SKU)) {
                Log.e("123","PURCAsed");
                fechInvForconsumeItem(); // Restart device if not consume

            }

        }
    };

fechInvForconsumeItem() は

    public void fechInvForconsumeItem() {
    mHelper.queryInventoryAsync(mReceivedInventoryListener);
}
IabHelper.QueryInventoryFinishedListener mReceivedInventoryListener
        = new IabHelper.QueryInventoryFinishedListener() {
    public void onQueryInventoryFinished(IabResult result,
                                         Inventory inventory) {


        if (result.isFailure()) {
            // Handle failure
            Log.e("11","Failure");



        } else {
            Log.e("11","suc");
            mHelper.consumeAsync(inventory.getPurchase(ITEM_SKU),
                    mConsumeFinishedListener);
        }


    }
};

消費リスナーは

    IabHelper.OnConsumeFinishedListener mConsumeFinishedListener =
        new IabHelper.OnConsumeFinishedListener() {
            public void onConsumeFinished(Purchase purchase,
                                          IabResult result) {

                if (result.isSuccess()) {
                } else {
                    // handle error
                    Log.e("11","sucConsume");
                }
            }
        };
于 2016-12-27T17:58:45.293 に答える
-1

私の場合、Google はアイテムの購入を記録していないようです。代わりに、Google Play Services のローカル コピーが購入をキャッシュします。そうすれば、同じデバイスで 2 番目の要求が行われると、が表示されandroid.test.purchased already ownedます。ただし、別のデバイスを使用するか、デバイスをリセットすると、キャッシュがクリアされ、購入を繰り返すことができます。

于 2015-04-22T08:23:59.560 に答える
-1

私の場合、アプリのキャッシュをクリアする必要がありました。キャッシュをクリアした後、購入フローを再度開始することができました。

私のデバイス (4.4.2) から、「設定 -> アプリケーション マネージャー」に移動しました。次に、「DOWNLOADED」タブからアプリを選択し、「Clear cache」を選択しました。

于 2016-03-20T15:34:10.287 に答える
-2

これが消耗品と非消耗品の違いです。非消耗品 (ここで扱っているように見えます) は、その状態が永続的に追跡されますが、消耗品は複数回購入できます。Play 管理コンソールに移動し、セールをキャンセルまたは払い戻して、もう一度テストする必要があります。

于 2012-12-15T22:52:53.817 に答える