2012-12-15 16 views
12

Firma Google zaktualizowała program do wersji IAB3 (w wersji 3 rozliczeń aplikacji). Po pierwsze, nie udało się rozwiązać problemu z przykładowym kodem .. super.onDestroy().Przywróć zakupy w rozliczeniach w aplikacji (wersja IAB 3) Android

I wdrożone v3 z pomocą http://developer.android.com/google/play/billing/billing_integrate.html

jest testowany na telefonie, nie działa w emulator.It zatrzymany w emulatorze.

Mój problem polega na tym, że nie widziałem interfejsu API do przywracania transakcji. Jak mogę przywrócić zakupy za pomocą IAB3? Czy to mService.getPurchases(apiVersion, packageName, type, continuationToken). Czy ktoś to przetestował? Czy to powoduje zwrot zakupionych przedmiotów z przedmiotów przechowywanych lokalnie, czy przywraca zakupione przedmioty? Deinstalowanie aplikacji nie ma continuationToken. Czy powinien to być null?

Co się stanie, gdy zmieni się stan zakupu?

Proszę pomóc!

Z góry dziękuję.

EDIT:

Google zaktualizowała biblioteki w aplikacji rozliczeniowych i rozwiązał super.onDestroy() problem. Dodali także kilka dodatkowych funkcji.

+0

Zakup zapytania, który następuje zaraz po konfiguracji, powoduje to. Próbuję tego samego, ale mam inny problem, który jest po otrzymałem wynik "ITEM jest już własnością i ponownie próbuję wywołać launchPurchaseFlow.Zdaje się wyjątek" java.lang.IllegalStateException: Nie można uruchomić operacji asynchronicznej (launchPurchaseFlow), ponieważ trwa inna operacja asynchroniczna (launchPurchaseFlow). ".Nie wiem jak to zrobić – LuminiousAndroid

+0

Do testowania, czy powinienem opublikować aplikację lub Czy zrobię z projektem? .. Moja aplikacja nie jest opublikowana w grze (nie jest to pojedyncza wersja) –

+1

Po prostu potrzebujesz opublikuj swój produkt w aplikacji, nie aplikację.) – LuminiousAndroid

Odpowiedz

2

Aby uczynić przedmiot konsumpcyjnym, musisz wysłać żądanie zużycia i musisz to zrobić w oddzielnym wątku.

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

Ale czasem zużywają żądanie nie zostanie zakończona na google końcu więc może chcesz zapytać wykaz artykułów zakupiony i spożywać go z tokena zakupu. Zrobiłem jak ten

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

Zużyj oznacza, że ​​przedmiot będzie można kupić ponownie. Czy tak jest? ... Chcę dokonać jednorazowego zakupu, po zakupie użytkownika, może korzystać z życia pro pro Jeśli aplikacja zostanie odinstalowana, chcę przywrócić zakupy dla tego konkretnego użytkownika, więc daj mi znać, jak mogę przywrócić transakcję/zakup.Jeśli zwrócimy przedmiot, to w jaki sposób użytkownik otrzymuje powiadomienie? –

+0

Hej użytkownik1194037, Próbowałem Twojej funkcji, aby uzyskać informacje o najnowszym zakupie działa bardzo dobrze po raz pierwszy, ale jeśli spróbowałem go ponownie po odinstalowaniu aplikacji, to nic nie robi. Jeśli chodzi o to, że Google podaje nam identyfikator produktu, który może być możliwy do jednorazowego zakupu w aplikacji, nie ma sensu przywracać transakcji. Czy masz jakiś pomysł na ten temat? Używam "android.test.purchase" jako identyfikatora produktu. Spróbuj tego po odinstalowaniu aplikacji i uprzejmie daj mi znać, czy działa na Twoim końcu dzięki..kabir :) – LuminiousAndroid

+0

Jeśli użytkownik uruchamia aplikację po raz pierwszy, w takim przypadku można sprawdzić, czy są jakieś wcześniej zapisane w produktach aplikacji, jeśli następnie przywrócono tę konkretną funkcję. – Deepanshu

0

W swojej IabHelper.java który jest przykładem w pliku/android-sdk/dodatki/google/play_billing/samples/umieścić ten kod, aby uzyskać wszystkie element, który został zakupiony przez użytkownika . Spowoduje to zwrócenie tablicy JSON zakupionych danych. Możesz także użyć funkcji Purchase.java do analizy, która jest dostępna również w folderze samples.

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

A do swojej głównej działalności

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

     });   
    } 
} 

Mam nadzieję, że to pomoże.^_^Dzięki.

Powiązane problemy