2012-12-15 8 views
12

Google, IAB3 sürümüne yükseltildi (Uygulama İçi Faturalandırma sürüm 3). İlk örnek kod örneğinde ne .. super.onDestroy() cevaplandı. Uygulama İçi Faturalandırma (IAB Sürüm 3) uygulamasındaki geri alımları geri yükle android

Ben emulator.It emülatörü sıkışmış çalışmaz, http://developer.android.com/google/play/billing/billing_integrate.html

O telefonda test edilir yardımıyla v3 uyguladı.

Sorunum, geri yükleme işlemleri için API'yi görmedim. Alışverişleri IAB3 ile nasıl geri yükleyebilirim? mService.getPurchases(apiVersion, packageName, type, continuationToken) mu? Bunu test eden var mı? Bu, satın alınan öğeleri yerel olarak depolanan öğelerden mi iade ediyor yoksa satın alınan öğeleri mi geri yüklüyor? Kaldırma uygulamasının continuationToken bulunmuyor. null mu?

Peki ya satın alma durumu değiştiğinde ne olur?

Lütfen yardım edin!

Şimdiden teşekkürler.

DÜZENLEME: Google In uygulaması fatura kütüphane güncellenerek super.onDestroy() sorunu çözmüştür

. Ayrıca bazı ek özellikler eklediler.

+0

Kurulumdan hemen sonra oluşan sorgu satın alma işlemi bunu gerçekleştirir. Aynı şey için çalışıyorum ama "ITEM zaten sahip olunan ve launchPurchaseFlow çağırmaya çalışın." Bu bir özel durum "java.lang.IllegalStateException: denedikten sonra başka bir sorun var. (launchPurchaFlow) çünkü başka bir async işlemi (launchPurchaFlow) devam ediyor. ". Nasıl yapılacağını bilmiyorum. – LuminiousAndroid

+0

Test için, uygulama yayınlamalı mıyım yoksa taslak ile yapmalı mıyım? .. Uygulamam oyunda yayınlanmadı (tek bir sürümde değil) –

+1

Sadece Uygulama içi ürününüzü yayınlamayın, uygulamayı değil – LuminiousAndroid

cevap

2

Öğe sarf malzemesini yapmak için bir tükenme isteği göndermeniz gerekir ve bunu ayrı bir iş parçacığında yapmanız gerekir.

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(); 
      } 
     } 
    } 

Ama bazen satın alınan öğe listesini sorgulamak isteyebilirsiniz isteği google ucunda tamamlanmaz tüketmek ve satın alma belirteci ile tüketirler. Ben bir örnek olduğu için IabHelper.java bu

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

tüketim aracını tekrar satın alabileceğiniz anlamına gelir. öyle mi ??? ... Bir kez satın almak istiyorum, kullanıcı satın aldıktan sonra. Eğer uygulama kaldırılacaksa, o zaman o kullanıcı için satın alımları geri yüklemek istiyorum, bu yüzden nasıl işlem/satın alma işlemini geri yükleyeceğimi bildirin.Öğeyi iade edersem, kullanıcı nasıl haberdar olur? –

+0

Hey user1194037, En son satın alma işleri hakkında bilgi almak için ilk kez çok iyi çalıştığımı, ancak uygulamayı kaldırdıktan sonra tekrar denediyse, hiçbir şey yapmaz. Durum, Google'ın, uygulama boyunca bir kez satın alınabilecek bir ürün kimliği sunması durumunda, işlemi geri yüklemek için bir anlam ifade etmemektedir. Bu konuda herhangi bir fikriniz var mı? Eh, ürün kimliği olarak "android.test.purchase" kullanıyorum. Lütfen uygulamanızı kaldırdıktan sonra bunu deneyin ve son olarak teşekkürler .kabir :) – LuminiousAndroid

+0

Kullanıyorsa, uygulamayı ilk kez çalıştırıyorsanız, bu durumda önceden çağrılmış olup olmadığını kontrol edebilirsiniz. Uygulama ürünlerinde, söz konusu özelliği geri yüklerseniz. – Deepanshu

0

gibi yaptım senin/android-sdk/ekstralar/google/play_billing/numuneler/kullanıcı tarafından satın alındı ​​bütün öğeyi almak için bu kodu koymak . Bu, satın alınan bir JSON dizisini döndürür. Ayrıca ayrıştırmak için Purchase.java'yı da kullanabilirsiniz, bunlar da örnek klasöründe mevcuttur.

 public ArrayList<String> getAllPurchases() throws RemoteException{ 
    Bundle ownedItems = mService.getPurchases(3, mContext.getPackageName(),"inapp", null); 

    int response = getResponseCodeFromBundle(ownedItems); 
    logDebug("Owned items response: " + String.valueOf(response)); 
    if (response != BILLING_RESPONSE_RESULT_OK) { 
     logDebug("getPurchases() failed: " + getResponseDesc(response)); 

    } 
    if (!ownedItems.containsKey(RESPONSE_INAPP_ITEM_LIST) 
      || !ownedItems.containsKey(RESPONSE_INAPP_PURCHASE_DATA_LIST) 
      || !ownedItems.containsKey(RESPONSE_INAPP_SIGNATURE_LIST)) { 
     logError("Bundle returned from getPurchases() doesn't contain required fields."); 
    } 

    ArrayList<String> purchaseDataList = ownedItems.getStringArrayList(RESPONSE_INAPP_PURCHASE_DATA_LIST); 
    return purchaseDataList; 
} 

Ve Ana faaliyeti

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); 
     } 

     });   
    } 
} 

içine

Bunun size yardımcı olacağını umuyoruz.^_^Teşekkürler.