2015-11-23 10 views
7

Obecnie tworzę aplikację z opłatami za aplikacje. wszystko działa dobrze. i już opublikowałem aplikację w kanale Beta i przetestowałem ją z użytkownikami testowymi z prawdziwymi przedmiotami i to działa.Android w aplikacji Test płatności za zakupy zawiesza się Sklep Play

Jednak podczas debugowania używam przedmiotu android.test.purchased, mój sklep Play zawiesza się po naciśnięciu przycisku Kup.

enter image description here

i pojawia się następujący błąd (s):

E/AndroidRuntime: FATAL EXCEPTION: main 
         Process: com.android.vending, PID: 25463 
                java.lang.NullPointerException: Attempt to read from field 'com.google.android.finsky.protos.Acquisition$AutoDismissTemplate com.google.android.finsky.protos.Acquisition$PostAcquisitionPrompt.autoDismissTemplate' on a null object reference 
                 at com.google.android.finsky.billing.SuccessStep.getLayoutResId(SuccessStep.java:75) 
                 at com.google.android.finsky.billing.lightpurchase.PurchaseFragment.onStateChange(PurchaseFragment.java:31066) 
                 at com.google.android.finsky.fragments.SidecarFragment.notifyListener(SidecarFragment.java:255) 
                 at com.google.android.finsky.fragments.SidecarFragment.setState(SidecarFragment.java:250) 
                 at com.google.android.finsky.billing.lightpurchase.CheckoutPurchaseSidecar.confirmAuthChoiceSelected(CheckoutPurchaseSidecar.java:631) 
                 at com.google.android.finsky.billing.lightpurchase.PurchaseFragment.onStateChange(PurchaseFragment.java:32156) 
                 at com.google.android.finsky.fragments.SidecarFragment.notifyListener(SidecarFragment.java:255) 
                 at com.google.android.finsky.fragments.SidecarFragment.setState(SidecarFragment.java:250) 
                 at com.google.android.finsky.billing.lightpurchase.CheckoutPurchaseSidecar.access$1900$2f730cd3(CheckoutPurchaseSidecar.java:72) 
                 at com.google.android.finsky.billing.lightpurchase.CheckoutPurchaseSidecar$1.run(CheckoutPurchaseSidecar.java:1009) 
                 at android.os.Handler.handleCallback(Handler.java:739) 
                 at android.os.Handler.dispatchMessage(Handler.java:95) 
                 at android.os.Looper.loop(Looper.java:148) 
                 at android.app.ActivityThread.main(ActivityThread.java:5417) 
                 at java.lang.reflect.Method.invoke(Native Method) 
                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
11-23 02:22:43.202 590-739/? W/ActivityManager: Force finishing activity com.android.vending/com.google.android.finsky.billing.lightpurchase.IabV3Activity 


Purchase finished: IabResult: Null data in IAB result (response: -1002:Bad response received), purchase: null 
Error purchasing: IabResult: Null data in IAB result (response: -1002:Bad response received) 

czasami zakup nadal po tym, i inne czasy, moje awarii aplikacji.

Testowałem to na kilku urządzeniach (Nexus 7 z Androidem 6.0, Note 5 z Androidem 5.1.1, Galaxy S3 z Androidem 4.3, LG G3 z Androidem 4.4), wszystkie mają to samo zachowanie.

Co mnie denerwuje to to, że rzeczy prawdziwe w aplikacjach działają bezbłędnie. co sprawia, że ​​myślę, że to oznacza, że ​​mój kod jest w porządku. ale dzieje się tak z przedmiotami testowymi, więc martwię się, że po opublikowaniu może się to powtórzyć z prawdziwymi przedmiotami z prawdziwymi użytkownikami.

Doceniam twoją pomoc, aby poinformować mnie, gdy robię coś złego, co może doprowadzić do awarii sklepu lub może do tego dojść?

Proszę zauważyć, że jestem całkiem nowy w rozwoju Androida.

Dzięki.

Oto mój kod w App rozliczeń:

///... part of onCreate: 

mHelper = new IabHelper(this, base64EncodedPublicKey); 

     mHelper.startSetup(new 
            IabHelper.OnIabSetupFinishedListener() { 
             public void onIabSetupFinished(IabResult result) { 
              if (!result.isSuccess()) { 
               Log.d(TAG, "In-app Billing setup failed: " + 
                 result); 
              } else { 
               // Hooray, IAB is fully set up. Now, let's get an inventory of 
               // stuff we own. 
               Log.d(TAG, "Setup successful. Querying inventory."); 
               mHelper.queryInventoryAsync(mGotInventoryListener);           } 
             } 
            }); 

/////////////////

public void startPurchase(String ITEM_SKU) { // Start the purchase process here 

    String purchaseToken = "inapp:" + getPackageName() + ":"+ ITEM_SKU; 

    Log.d(TAG, "Purchase started for : " + ITEM_SKU); 

    mHelper.launchPurchaseFlow(this, ITEM_SKU, 10002, 
       mPurchaseFinishedListener, purchaseToken); 
} 


// Callback for when a purchase is finished 
IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() { 
    public void onIabPurchaseFinished(IabResult result, Purchase purchase) { 
     Log.d(TAG, "Purchase finished: " + result + ", purchase: " 
       + purchase); 
     if (result.isFailure()) { 
      Log.d(TAG,"Error purchasing: " + result); 
      if (result.getResponse()==7){ 
       if(myInventory.hasPurchase(ITEM_SKU)) 
       { 
        Log.d(TAG,"Ooops, Item already purchased, consume it"); 
        mHelper.consumeAsync(myInventory.getPurchase(ITEM_SKU),mConsumeFinishedListener2); 
       } 
      } 
      return; 
     } 

     Log.d(TAG, "Purchase successful."); 

     if (purchase.getSku().equals(ITEM_SKU)) { 
      mHelper.consumeAsync(purchase, mConsumeFinishedListener); 

     } 
    } 
}; 

IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() { 
    public void onQueryInventoryFinished(IabResult result, 
             Inventory inventory) { 
     Log.d(TAG, "Query inventory finished."); 

     if (result.isFailure()) { 
      Log.d(TAG,"Failed to query inventory: " + result); 
      return; 
     } 

     Log.d(TAG, "Query inventory was successful."); 

     myInventory = inventory; 
     //Process inventory 


    } 
}; 

IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = 
     new IabHelper.OnConsumeFinishedListener() { 
      public void onConsumeFinished(Purchase purchase, 
              IabResult result) { 

       if (result.isSuccess()) { 
        Log.d(TAG,"consume successful for " + purchase.getSku() + " & " + result.getMessage()); 
        updateCoinsAndScore(coinsToAdd, 0); 
        Toast.makeText(getApplication(), "تم إضافة عدد " + coinsToAdd + " عملات إلى رصيدك", Toast.LENGTH_LONG).show(); 
        //reset values 
        coinsToAdd=0; 
        ITEM_SKU=""; 
       } else { 
        Log.d(TAG, "Consume failed " + result.getMessage());     } 
      } 
     }; 

IabHelper.OnConsumeFinishedListener mConsumeFinishedListener2 = 
     new IabHelper.OnConsumeFinishedListener() { 
      public void onConsumeFinished(Purchase purchase, 
              IabResult result) { 

       if (result.isSuccess()) { 
        Log.d(TAG,"consumed, starting purchase again"); 
        Log.d(TAG,"consume successful for " + purchase.getSku() + " & " + result.getMessage()); 

        startPurchase(ITEM_SKU); 

       } else { 
        Log.d(TAG,"Consume failed " + result.getMessage());     } 
      } 
     }; 
+0

Witam Mam w obliczu tego samego problemu. Czy znalazłeś jakieś rozwiązanie? –

+0

Jeszcze niestety. – Tamer

+0

ok zaktualizuj, jeśli znalazłeś jakieś rozwiązanie. –

Odpowiedz

3

Problem był w Google Play v6.0.0, jest teraz naprawiony w wersji 6.0.5 (potwierdzony zarówno na urządzeniu Samsung, jak i Nexusie).

Jeśli nie dostać aktualizację Google Play automatycznie, można go pobrać ręcznie z ApkMirror.com itp

+0

, jeśli nie otrzymałeś aktualizacji Google Play automatycznie, możesz ją pobrać ręcznie z ApkMirror.com – Tamer

+1

to znowu się zawiesza: https://stackoverflow.com/q/45240471/1472483 – MarsPeople

Powiązane problemy