In-App-Abrechnungstest: android.test.kaufte bereits besessen

Ich teste derzeit In-App-Abrechnung für eine zukünftige App und nachdem ich das Testobjekt "android.test.purchased" das erste Mal erfolgreich gekauft habe, bekomme ich jetzt den Antwortcode 7 jedes Mal, wenn ich versuche, es wieder zu kaufen, Das bedeutet, dass ich diesen Artikel bereits besitze.

12-15 23: 02: 14.149: E / IabHelper (19829): In-App-Abrechnungsfehler: Artikel konnte nicht gekauft werden, Fehlerreaktion: 7: Item bereits besessen

Von was ich verstehe, soll dieser Kauf immer möglich sein, richtig? Damit der Entwickler seine App testen kann?

Wenn nicht, wie kann ich seinen Zustand "zurücksetzen", um nicht zu besitzen? Ich benutze das util Paket aus dem Google In-App Billing Sample.

  • Spenden über In-App-Abrechnung
  • "Das Element, das du versucht hast zu kaufen, konnte nicht gefunden werden" Android in-App-Abrechnung
  • Android In-App-Abrechnung: Kaufstatus bleibt nach Auftragsannahme "gekauft"
  • Entkopplung In-App-Abrechnung von Aktivität
  • Haben die Benutzer die Erlaubnis com.android.vending.BILLING bei Upgrade / Installation zu erteilen?
  • Android inventory.getSkuDetails () return null
  • Unterschied zwischen IABHelper und IInAppBillingService in InAPPBilling
  • Android In-App-Abrechnung, fehlende Einkäufe
  • 15 Solutions collect form web for “In-App-Abrechnungstest: android.test.kaufte bereits besessen”

    Fügen Sie diesen Code zu einem Thread hinzu, um die Konsumanforderung zu initiieren.

    int response = mService.consumePurchase(3, getPackageName(), purchaseToken); 

    Hier für den Kauftest ist buyToken

     purchaseToken = "inapp:" + getPackageName() + ":android.test.purchased"; 

    Und

     if (response == 0) 

    Dann ist der verbrauch erfolgreich

    Keine Notwendigkeit, einen speziellen Verbrauchscode zu schreiben. Verwenden Sie einfach den Befehl adb, um die Google Play Store-Daten zu löschen:

     adb shell pm clear com.android.vending 

    Es stellt sich heraus, dass die android.test.purchased Artikel verhält sich wie eine reguläre ID. Es bedeutet, dass, wenn Sie wollen, um es wieder zu kaufen, müssen Sie es irgendwo in Ihrem Code zu konsumieren. Ich denke, dass die Google-Dokumentation in dieser Angelegenheit irreführend ist und dass sie eine weitere statische ID hinzufügen sollten, die Sie endlos für Testzwecke kaufen können.

    In-App Version 3:

     IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() { public void onQueryInventoryFinished(IabResult result, Inventory inventory) { ..................... if (inventory.hasPurchase(SKU_CONTENT)) { mHelper.consumeAsync(inventory.getPurchase(SKU_CONTENT), null); } } }; 

    Version3 : Durch das Löschen des Cache des Google Play Store wird "android.test.purchased" wieder verfügbar sein.

    So können wir den Gegenstand verbrauchen

      consume.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Thread t = new Thread(new Runnable() { @Override public void run() { String purchaseToken = "inapp:" + getPackageName() + ":android.test.purchased"; try { Log.d("","Running"); int response = mService.consumePurchase(3, getPackageName(), purchaseToken); if(response==0) { Log.d("Consumed","Consumed"); }else { Log.d("","No"+response); } }catch (RemoteException e) { Log.d("Errorr",""+e); } } }); t.start(); } }); 

    Meiner Meinung nach, wenn Ihr Programm nicht entworfen ist, um das Element zu verbrauchen, das Sie nicht brauchen, um den Code zu zwicken, um das Gedächtnis eines externen Verkäufers zu löschen. Dies wird Ihren Code zerbrechlicher machen und Sie haben dann eine Menge Zeit zu verbringen, um Code hinzuzufügen und zu entfernen, der nicht zu Ihrer Software gehört, also ist es ein schlechtes Design, eine solche Lösung zu implementieren.

    Die beste Lösung, die für mich gearbeitet hat, um android.test zu besiegen

     adb uninstall com.yourapp.name 

    und dann

     adb shell pm clear com.android.vending 

    Ich brauchte nicht, Bargeld zu löschen und meine Apps zu durchsuchen oder um Code zu ändern. Ich musste die adb zu Pfadvariablen des Windows-Systems hinzufügen, was ziemlich einfach war. Also ja musst du adb benutzen, was du wohl sowieso so brauchst.

    Sie fügen einfach Ihre C: \ … \ android-sdk \ platform-tools; In Windows-Pfad in Umgebungsvariablen, und ich stelle mir vor, dass es ziemlich einfach in Mac und Linux os auch ist. Hoffe, es hilft jemand, einige Tage weniger mit der Implementierung von Android in App-Rechnungen zu verbringen.

    Das Hauptproblem ist, dass du den "android.test.purchased" Artikel verbrauchen musst. Aber dieses Element wird nicht in Ihrem Abfrage-Inventar verfügbar sein, so dass Sie nicht mit dem normalen Fluss verbrauchen können.

    Wenn du also IabHelper einsetzst, kannst du in der IabHelper-Klasse den "IInAppBillingService mService" vorübergehend ändern. Zu öffentlich, so dass es von Ihrem IabHelper zugänglich ist.

    Dann kannst du in deiner Klasse so verbrauchen,

     int response = mHelper.mService.consumePurchase(3, getPackageName(), "inapp:"+getPackageName()+":android.test.purchased"); 

    Wenn Erfolg, wird die Antwort 0 sein.

    Ich hoffe das hilft.

     IabHelper.QueryInventoryFinishedListener mQueryFinishedListener = new IabHelper.QueryInventoryFinishedListener() { public void onQueryInventoryFinished(IabResult result, Inventory inventory) { if (result.isFailure()) { return; } try { if(inventory.hasPurchase("product_sku_id")) { isItemEnable= true; mHelper.consumeAsync(inventory.getPurchase("product_sku_id"),null); } else { isItemEnable = false; } } catch (Exception e) { e.printStackTrace(); } } }; 

    Wenn Sie in der Testumgebung sind

    1) Im Falle von android.test.purchased, kann ich die gefälschte Zahlung durch den Neustart von Android-Gerät (verbraucht das Inventar) zurücksetzen.

    2) In InApp util gibt es eine Datei namens Security.java machen es wie folgt, für temporäre. Da die Testzahlung (Fake) immer false aufgrund der Sicherheitsausnahme zurückgibt.

     public static boolean verifyPurchase(String base64PublicKey, String signedData, String signature) { return true; } 

    Dann in deinem OnIabPurchaseFinishedListener call fechInvForconsumeItem ()

     IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() { public void onIabPurchaseFinished(IabResult result, Purchase purchase) { if (result.isFailure()) { // Handle error Log.e("123","Failure"); return; } else if (purchase.getSku().equals(ITEM_SKU)) { Log.e("123","PURCAsed"); fechInvForconsumeItem(); // Restart device if not consume } } }; 

    Das fechInvForconsumeItem () ist

      public void fechInvForconsumeItem() { mHelper.queryInventoryAsync(mReceivedInventoryListener); } IabHelper.QueryInventoryFinishedListener mReceivedInventoryListener = new IabHelper.QueryInventoryFinishedListener() { public void onQueryInventoryFinished(IabResult result, Inventory inventory) { if (result.isFailure()) { // Handle failure Log.e("11","Failure"); } else { Log.e("11","suc"); mHelper.consumeAsync(inventory.getPurchase(ITEM_SKU), mConsumeFinishedListener); } } }; 

    Verbrauchen hörer ist

      IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() { public void onConsumeFinished(Purchase purchase, IabResult result) { if (result.isSuccess()) { } else { // handle error Log.e("11","sucConsume"); } } }; 

    Für Testzwecke schlage ich auch vor, dass du ein Stück Code einfügt, das alle Produkte, die du gekauft hast, beheben musst, bevor du eine Methode anrufst, die den gp-Kauffluss initialisiert. Das ist besonders komfortabel, wenn man gerade einen Gegenstand im Moment testet. ZB wie folgt:

     PurchasesResult purchasesResult = mBillingClient.queryPurchases(BillingClient.SkuType.INAPP); for (Purchase sourcePurchase : purchasesResult.getPurchasesList()) { if(sourcePurchase != null){ ConsumeResponseListener listener = new ConsumeResponseListener() { @Override public void onConsumeResponse(String outToken, @BillingResponse int responseCode) { System.out.println("all consumed"); } }; mBillingClient.consumeAsync(sourcePurchase.getPurchaseToken(), listener); }else{ System.out.println("null"); } } // and then initiate whole process with clear "shoping basket" BillingFlowParams.Builder builder = new BillingFlowParams.Builder() .setSku(itemName).setType(BillingClient.SkuType.INAPP); 

    Ich habe Adb Shell verwendet:

     adb shell pm clear com.android.vending 

    Dies ist der Unterschied zwischen Verbrauchsmaterialien und nicht verbrauchbaren Gegenständen; Nicht verbrauchbare Gegenstände (was Sie hier zu behandeln scheinen) haben ihren Staat beständig verfolgt, während Verbrauchsmaterialien mehrfach gekauft werden können. Sie müssen in Ihre Play-Management-Konsole gehen und den Verkauf abbrechen / zurückerstatten, um es erneut zu testen.

    In meinem Fall scheint es, dass Google keinen Kauf für den Artikel aufzeichnet. Vielmehr speichert die lokale Kopie von Google Play Services den Kauf. Auf diese Weise, wenn eine zweite Anfrage auf dem gleichen Gerät gemacht wird, wird android.test.purchased already owned angezeigt. Wenn Sie jedoch ein anderes Gerät verwenden oder das Gerät zurücksetzen, wird der Cache gelöscht und der Kauf wird wiederholt.

    In meinem Fall musste ich nur den Cache der Apps löschen. Nachdem ich den Cache gelöscht hatte, konnte ich den Kaufablauf wieder einleiten.

    Von meinem Gerät (4.4.2) habe ich zu "Einstellungen-> Anwendungsmanager" navigiert. Als nächstes habe ich die App aus der Registerkarte "DOWNLOADED" ausgewählt und dann "Cache löschen".

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.