2012-12-15 62 views
12

谷歌已經升級到IAB3(在應用內結算第3版)。 首先在示例代碼中錯過了一個問題。super.onDestroy()恢復在應用內結算(IAB第3版)的Android採購

我實現了V3與http://developer.android.com/google/play/billing/billing_integrate.html

它是手機測試的幫助下,不工作在emulator.It停留在仿真器。

我的問題是,我沒有看到API恢復交易。如何使用IAB3恢復購買?是mService.getPurchases(apiVersion, packageName, type, continuationToken)。有沒有人測試過?這會從本地存儲的物品中返回購買的物品還是恢復購買的物品? 卸載應用程序沒有continuationToken。應該是null

而且什麼時候購買狀態的變化?

請幫忙!

在此先感謝。

編輯:

谷歌已經更新了在應用程序內結算庫,解決了super.onDestroy()問題。 他們還增加了一些附加功能。

+0

設置後立即執行的查詢購買完成此操作。 我試圖爲相同的,但我有一個另一個問題是後我得到的結果java.lang.IllegalStateException「項目已擁有和我再次嘗試調用launchPurchaseFlow它放棄一個例外。」:無法啓動異步操作(launchPurchaseFlow),因爲正在進行另一個異步操作(launchPurchaseFlow)。 」。 我不知道如何去通過它。 – LuminiousAndroid

+0

爲了測試,我應該發佈應用程序或將與草案?? ..我的申請沒有公佈關於遊戲(不是單機版)做的。 –

+1

你只需要到發佈你的應用內產品,而不是應用 – LuminiousAndroid

回答

2

爲了使項目消耗品,你必須發送消耗請求,你需要做的是,在單獨的線程。

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == 1111) { 
     int responseCode = data.getIntExtra("RESPONSE_CODE", 0); 
     String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA"); 
     String dataSignature = data.getStringExtra("INAPP_DATA_SIGNATURE"); 
     Logger.printMessage(TAG, "on activity result reponse" 
       + responseCode, Logger.DEBUG); 
     if (resultCode == RESULT_OK && responseCode == 0) { 
      try { 
       JSONObject jo = new JSONObject(purchaseData); 
       String sku = jo.getString("productId"); 
       String title = jo.getString("title"); 
       addChipsToBalance(sku); 
       final String token = jo.getString("purchaseToken"); 
       Toast.makeText(BuyChipsActivity.this, 
         "You have bought " + title + ". Enjoy the game!", 
         Toast.LENGTH_SHORT).show(); 

       new Thread(new Runnable() { 

        @Override 
        public void run() { 
         // TODO Auto-generated method stub 
         Logger.printMessage(TAG, "inside run", Logger.DEBUG); 
         try { 
          int response = mService.consumePurchase(3, 
            getPackageName(), token); 
          Logger.printMessage(TAG, "inside run response" 
            + response, Logger.DEBUG); 
         } catch (RemoteException e) { 
          // TODO Auto-generated catch block 
          Logger.printMessage(TAG, "exception here 1", 
            Logger.DEBUG); 
          e.printStackTrace(); 
         } 
        } 
       }).start(); 
       // alert("You have bought the " + sku + 
       // ". Excellent choice, adventurer!"); 
      } catch (JSONException e) { 
       // alert("Failed to parse purchase data."); 
       e.printStackTrace(); 
      } 
     } 
    } 

但有時消耗請求沒有完成對谷歌結束,所以你可能要查詢的購買項目列表,並與購買令牌消耗它。我不喜歡這個

private void showPreviousPurchases() { 
    Logger.printMessage(TAG, "previous purchases", Logger.DEBUG); 
    if (mService == null) { 
     Toast.makeText(this, "Something Went Wrong. Try later", 
       Toast.LENGTH_LONG).show(); 
     return; 
    } 
    Bundle ownedItems = null; 
    ; 
    try { 
     ownedItems = mService.getPurchases(3, getPackageName(), "inapp", 
       null); 
    } catch (RemoteException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    if (ownedItems == null) { 
     Logger.printMessage(TAG, "criical error ", Logger.DEBUG); 
     return; 
    } 
    int response = ownedItems.getInt("RESPONSE_CODE"); 
    if (response == 0) { 
     ArrayList<String> ownedSkus = ownedItems 
       .getStringArrayList("INAPP_PURCHASE_ITEM_LIST"); 
     ArrayList<String> purchaseDataList = ownedItems 
       .getStringArrayList("INAPP_PURCHASE_DATA_LIST"); 
    /* ArrayList<String> signatureList = ownedItems 
       .getStringArrayList("INAPP_DATA_SIGNATURE"); 
     String continuationToken = ownedItems 
       .getString("INAPP_CONTINUATION_TOKEN");*/ 

     for (int i = 0; i < purchaseDataList.size(); ++i) { 
      String purchaseData = purchaseDataList.get(i); 
      Logger.printMessage(TAG, "json = " + purchaseData, 
        Logger.DEBUG); 
      // String signature = signatureList.get(i); 
      String sku = ownedSkus.get(i); 

      addChipsAndMakeItConsumable(purchaseData); 
      // do something with this purchase information 
      // e.g. display the updated list of products owned by user 
     } 

     // if continuationToken != null, call getPurchases again 
     // and pass in the token to retrieve more items 
    } 

} 

private void addChipsAndMakeItConsumable(String purchaseData) { 

    try { 
     JSONObject jo = new JSONObject(purchaseData); 
     String sku = jo.getString("productId"); 
     // String title = jo.getString("title"); 
     addChipsToBalance(sku); 
     final String token = jo.getString("purchaseToken"); 
     Logger.printMessage(TAG, "id = " + sku, Logger.DEBUG); 

     Logger.printMessage(TAG, "inside run", Logger.DEBUG); 
     try { 
      int response = mService.consumePurchase(3, getPackageName(), 
        token); 
      Logger.printMessage(TAG, "inside run response" + response, 
        Logger.DEBUG); 
     } catch (RemoteException e) { 
      // TODO Auto-generated catch block 
      Logger.printMessage(TAG, "exception here 1", Logger.DEBUG); 
      e.printStackTrace(); 
     } 

     // alert("You have bought the " + sku + 
     // ". Excellent choice, adventurer!"); 
    } catch (JSONException e) { 
     // alert("Failed to parse purchase data."); 
     e.printStackTrace(); 
    } 
} 
+0

消費手段物品將可以再次購買。是這樣嗎??? ...我想做一次性購買,一旦用戶購買。他/她可以使用專業功能壽命。如果應用程序將被卸載,那麼我想恢復該特定用戶的購買。所以讓我知道如何恢復交易/購買。如果我退款的項目,那麼用戶如何得到通知? –

+0

嘿user1194037, 我試過你的功能,第一次很好地獲得最新購買作品的信息,但如果我卸載我的應用程序後再次嘗試它,那麼它什麼也不做。 如果Google提供的產品ID可以在整個應用程序中購買一次,那麼恢復交易沒有任何意義。 你有什麼想法嗎? 那麼我使用「android.test.purchase」作爲產品ID。 請在卸載您的應用程序後嘗試此操作,並請讓我知道它是否在您的最終效果 謝謝..kabir :) – LuminiousAndroid

+0

如果用戶第一次運行您的應用程序,那麼您可以檢查是否有任何預先在應用產品中,如果有,則恢復該特定功能。 – Deepanshu

0

在你IabHelper.java這是一個例子你的/ Android的SDK /演員/谷歌/ play_billing /樣品/把這個代碼以獲取已經由用戶購買的所有項。這將返回一個購買數據的JSON數組。您也可以使用Purchase.java進行解析,這也可以在samples文件夾中找到。

​​

和你的主要活動

public class MainActivity extends Activity{ 
    private IabHelper mHelper; 
     private String arrayString; 
     public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    mHelper = new IabHelper(this,"YOUR PUBLIC KEY"); 
     mHelper.enableDebugLogging(true); 
     mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { 

     public void onIabSetupFinished(IabResult result) { 

     if (!result.isSuccess()) { // Oh noes, there was a problem. 
      Toast.makeText(this,"Problem setting up in-app billing: " + result,Toast.LENGTH_LONG).show(); 
       return; 
      } 

     arrayString=mHelper.getAllPurchases().toString(); 

     Log.d("Purchases: ",""+arrayString); 


     array = new JSONArray(arrayString); 

     for (int i = 0; i < array.length(); i++) { 
      JSONObject row = array.getJSONObject(i);  
      productId=row.getString("productId"); //this will get the product id's that has been purchased. 

      Log.e("To be restored:", " PRODUCT ID's "+productId); 
     } 

     });   
    } 
} 

我希望這會幫助你。^_ ^謝謝。

相關問題