2014-12-15 28 views
14

Dziś odkryłem zgłoszenie awarii aplikacji dla mojego Android app obejmujący następujące ślad stosu:NullPointerException w IabHelper.queryPurchases

java.lang.NullPointerException: Attempt to invoke interface method 'android.os.Bundle com.android.vending.billing.IInAppBillingService.getPurchases(int, java.lang.String, java.lang.String, java.lang.String)' on a null object reference 
at com.myapp.utils.IabHelper.queryPurchases(IabHelper.java:878) 
at com.myapp.utils.IabHelper.queryInventory(IabHelper.java:572) 
at com.myapp.utils.IabHelper.queryInventory(IabHelper.java:545) 
at com.myapp.utils.IabHelper$2.run(IabHelper.java:645) 
at java.lang.Thread.run(Thread.java:818) 

(numery linii zostały zmienione z oryginału -lub co looks like to be the original powodu niestandardowego formatowania)

Zazwyczaj można modyfikować swój kod, aby sprawdzić nieprzypisanych członków klasy. Problemem jest to, że ten kod jest kopiowany & wklejony bezpośrednio z Android SDK, ponieważ IabHelper to klasa Android SDK provides jako dobry punkt wyjścia do realizacji w aplikacji v3 Billing

Winny linia jest drugim

logDebug("Calling getPurchases with continuation token: " + continueToken); 
Bundle ownedItems = mService.getPurchases(3, mContext.getPackageName(), itemType, continueToken); 

Wygląda na to, że usługa nie jest połączona w momencie wywołania metody. Ten błąd wystąpił na urządzeniu Nexus 5 (zgodnie z konsolą programisty)

  • Czy jest to znany problem z Androidem 5?
  • Czy istnieje aktualna wersja Pomocnika IAB?
  • Co mogę zrobić, zamiast ręcznie edytować kod do obsługi NPE?
+0

IabHelper jest teraz przestarzały i nie powinien być już używany. Google wydało bibliotekę BillingClient: https://developer.android.com/google/play/billing/billing_library.html – DSchmidt

+0

Pytanie jest w rzeczywistości bardzo stare. –

+1

To pytanie wciąż znajduje się na bardzo wysokim miejscu w Google. Natknąłem się na błąd i odkryłem, że kilka tygodni temu wydali nową bibliotekę. To tylko uwaga dla wszystkich pozostałych deweloperów. – DSchmidt

Odpowiedz

21

I zmodyfikowany kod ...

do { 
     logDebug("Calling getPurchases with continuation token: " + continueToken); 
     Bundle ownedItems = mService.getPurchases(3, mContext.getPackageName(), itemType, continueToken); 
     // ... 
    } 

Aby to być ...

do { 
     logDebug("Calling getPurchases with continuation token: " + continueToken); 
     if (mService == null || mContext == null) { 
      logError("Our service and/or our context are null. Exiting."); 
      return IABHELPER_UNKNOWN_ERROR; 
     } 
     Bundle ownedItems = mService.getPurchases(3, mContext.getPackageName(), itemType, continueToken); 
     // ... 
    } 

To prawie na pewno dlatego, że proces prowadzony jest w sposób asynchroniczny i aktywność/aplikacja ma (lub jest) zamknięty, gdy wynik zostanie zwrócony.

+0

Rozsądne: gdy działanie jest wstrzymane, nie wiem, co dzieje się z Looper. W każdym razie kontekst Spring jest właścicielem mojej instancji IabHelper, więc jest to trochę trudne, że magicznie staje się zerowa. --Misteria –

+6

Właśnie się dowiedziałem, że tak się dzieje w tym scenariuszu: otwórz swoją aplikację. Zminimalizuj i otwórz PlayStore. Cuknij przycisk urządzenia, który pokazuje wszystkie otwarte zadania. Przesuń palcem/zabij zadanie PlayStore. Kliknij swoją aplikację na ekranie, na którym widać wszystkie otwarte zadania. Twoje rozwiązanie zapobiega temu wyjątkowi NullException, dlatego bardzo dziękuję. –

Powiązane problemy