2012-05-11 18 views
1

私はアプリの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()); 
    } 
} 
+0

こんにちはvansi、 私はあまりにもここに立ち往生してまだいくつかのサンプルプロジェクトを与えることができますし、まだ2日間から外に出る方法はありません:(.. – LuminiousAndroid

答えて

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; 

     } 
    } 
+1

購入したitemIdをこのメソッドでチェックしてくださいありがとうございました – Vansi

+0

私のコードの復元トランザクションが役に立たないことがあります – Goofy

0

あなたはAndroidManifest.xmlをtrueに「デバッグ」フラグを設定する場合は、あなたのアプリにデバッガをアタッチすることができます。リリースキーで署名されているという事実は、デバッグとは関係ありません。アイテムが購入されたかどうかをアプリがどのように知っているかについては、管理対象アイテムを使用するとGoogleのアカウントに関連付けられます。 RESTORE_TRANSACTIONSをリクエストすると、アカウント(GMailアドレス)がGoogle Play/Marketサーバーに送信され、この人物/アカウントで購入されたアイテムが確認されます。管理されていないアイテムを使用する場合は、自分でアイテムを追跡する必要があり、RESTORE_TRANSACTIONSは使用できません。

+0

この方法でデバッグを試してみてください。ありがとう – Vansi

関連する問題