34

たとえば、寄付ボタンを押したときに人々が$を寄付できるように、アプリにアプリ内課金を実装することを学んでいます。

ユーザーは複数回寄付することができます。つまり、購入は消耗品です。

以下のコードは、TrivalDrive サンプルと Web のいくつかのチュートリアルから入手したものです。

コード:

IabHelper mHelper;
static final String ITEM_SKU = "android.test.purchased"; 

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_in_app_billing);

    buy10Button = (Button) findViewById(R.id.buy10Button); 
    buy15Button = (Button) findViewById(R.id.buy15Button); 
    buy20Button = (Button) findViewById(R.id.buy20Button);      

    String base64EncodedPublicKey = "keykeykey";

    mHelper = new IabHelper(this, base64EncodedPublicKey);


    mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() 
    {
          public void onIabSetupFinished(IabResult result) 
          {
            if (!result.isSuccess()) 
            {
               Log.d(TAG, "In-app Billing setup failed: " + result);
               return;
            } 
            if (mHelper == null) 
            {
                return;
            }          
            Log.d(TAG, "In-app Billing is set up OK");
          }
    });     
}

public void buy10Click(View view) 
{
    mHelper.launchPurchaseFlow(this, ITEM_SKU, 10001,  mPurchaseFinishedListener, "");
}

public void buy15Click(View view) 
{

}

public void buy20Click(View view) 
{

}   

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{
    if (mHelper == null) return;  
    if (!mHelper.handleActivityResult(requestCode, resultCode, data)) 
    {     
        super.onActivityResult(requestCode, resultCode, data);
    }
}

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() 
{
    public void onIabPurchaseFinished(IabResult result, Purchase purchase) 
    {
        if (mHelper == null) return;
        if (result.isFailure()) 
        {
           // Handle error
               return;
        }      
        else if ((purchase.getSku().equals(ITEM_SKU)))   
        {
           consumeItem();
        }              
    }
};

public void consumeItem() 
{
    mHelper.queryInventoryAsync(mReceivedInventoryListener);
}

IabHelper.QueryInventoryFinishedListener mReceivedInventoryListener = new IabHelper.QueryInventoryFinishedListener() 
{
    public void onQueryInventoryFinished(IabResult result, Inventory inventory) 
    {
        if (mHelper == null) return;
        if (result.isFailure()) 
        {
            // Handle failure
        } 
        else 
        {
            mHelper.consumeAsync(inventory.getPurchase(ITEM_SKU), mConsumeFinishedListener);
        }
    }
};

IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() 
{
    public void onConsumeFinished(Purchase purchase, IabResult result) 
    {
        if (mHelper == null) return;
        if (result.isSuccess()) 
        {
            Toast.makeText(InAppBillingActivity.this, "Thank you for your donation!!", Toast.LENGTH_LONG).show();   
        } 
        else 
        {
            // handle error
        }
    }
};

質問:

それでもE/IabHelper(13392): In-app billing error: Unable to buy item, Error response: 7:Item Already Ownedエラーが発生し続け、Google Play の支払いダイアログがポップアップしません。

私は調査し、多くの同様の状況を発見しました.数分待ってから購入が自動的にリセットされることを提案した人もいました.

IabResult を変更してas isSuccess = truepublic boolean isSuccess() { return mResponse == IabHelper.BILLING_RESPONSE_RESULT_OK; }も返すように誰かが提案していることもわかりましたが、その ような修正方法がわかりません...BILLING_RESPONSE_RESULT_ITEM_ALREADY_OWNED

問題はどのように修正できますか?ありがとう!!

4

5 に答える 5

41

「android.test.purchased」を購入しましたが、消費しませんでした。ただし、すぐに飲み忘れてしまうと、再び飲み込むのは容易ではありません。14日間お待ちいただけます。偽の購入は自動的にクリアされます。しかし、それは受け入れられません。

私は解決策を見つけるのに多くの時間を費やしました:

この行を追加して、デバッグ情報を取得します。

_iabHelper.enableDebugLogging(true, "TAG");

アプリを実行します。LogCat では、次のような json 文字列が表示されます。

{"packageName":"com.example","orderId":"transactionId.android.test.purchased","productId":"android.test.purchased","developerPayload":"123","purchaseTime":0,"purchaseState":0,"purchaseToken":"inapp:com.example:android.test.purchased"}

手動で使用します (THAT_JSON_STRING を json 文字列に置き換えます)

    Purchase purchase;
    try {
        purchase = new Purchase("inapp", THAT_JSON_STRING, "");
        _iabHelper.consumeAsync(purchase, new OnConsumeFinishedListener() {

            @Override
            public void onConsumeFinished(Purchase purchase, IabResult result) {
                Log.d("TAG", "Result: " + result);
            }
        });
    } catch (JSONException e) {
        e.printStackTrace();
    }

_iabHelper は mHelper です。

于 2014-01-15T19:16:41.667 に答える
6

デバイスを再起動するだけで、なんとか「購入を消費」することができました。

于 2015-09-22T02:08:08.113 に答える