2016-06-26 17 views
24

Rozpoczęto uzyskiwanie tego błędu w wersji produkcyjnej mojej aplikacji.Intent.migrateExtraStreamToClipData() na odwołanym obiekcie o wartości zerowej

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.content.Intent.migrateExtraStreamToClipData()' on a null object reference 

Nie ma wyraźnego wiersza, w którym to faktycznie występuje, ale ostatnio zmieniłem wersję biblioteki wsparcia na 24.0.0. Oto pełna StackTrace:

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.content.Intent.migrateExtraStreamToClipData()' on a null object reference 
    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1494) 
    at android.app.Activity.startActivityForResult(Activity.java:3745) 
    at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:48) 
    at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:75) 
    at android.app.Activity.startActivityForResult(Activity.java:3706) 
    at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:871) 
    at com.google.android.gms.common.internal.zzi$1.zztD(Unknown Source) 
    at com.google.android.gms.common.internal.zzi.onClick(Unknown Source) 
    at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:162) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:135) 
    at android.app.ActivityThread.main(ActivityThread.java:5254) 
    at java.lang.reflect.Method.invoke(Method.java) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

EDIT: Chcę również zwrócić uwagę, że 100% użytkowników otrzymuję ten błąd również zakorzenione. Dzieje się tak również w 23.4.0 ... Mam również potencjalny błąd, który pojawił się w tym samym czasie, co ma związek z funkcją Base64.decode w odniesieniu do Firebase.

EDYTOWANIE 2: Otrzymałem pomoc od Androida Dev na drugi dzień. Zasugerowali, że zaktualizuję wersję Usług Google Play mojego projektu i wydaje się, że do tej pory pomogło. Będę czekać jeszcze kilka dni, aby uzyskać wyniki od moich użytkowników, ale początkowe logi są obiecujące.

Poprzednio używałem wersji 9.0.2, ale mam teraz 9.2.0.

EDYCJA 3: Aktualizacja do wersji 9.2.0 nie pomogła awariom. Wciąż dostaję ten sam błąd od zrootowanych użytkowników. Zauważyłem, że u użytkowników powodujących awarie są poniżej Androida 6.0, więc będę testować na urządzeniu na żywo i zaktualizować ASAP.

+2

To samo dzieje się na moim emulatorze. Najpierw dostaję wyskakujące okienko z informacją: ... Korzysta z Usług Google Play, które nie są obsługiwane przez twoje urządzenie. Skontaktuj się z producentem, aby uzyskać pomoc. Spróbuję debugować. – Wirling

+0

@Wirling Teraz, kiedy o tym wspomniałeś, mam pewne podejrzenie, że raporty o błędach pochodzą z urządzeń laboratoryjnych Google Cloud Cloud zamiast z urządzeń mojego użytkownika. Właśnie niedawno zrootowałem moje urządzenie, aby przetestować ten błąd i nie widziałem jeszcze tego. – c0deblooded

+0

Jestem w stanie odtworzyć to za pomocą biblioteki Vision Usług Google Play (9.2). Zrobiłem prosty test, używając metody 'isGooglePlayServicesAvailable' przed uruchomieniem aparatu w celu wykrycia kodu QR. Jeśli nie będzie dostępny, pokażę okno dialogowe z metody 'getErrorDialog'. Spowoduje to awarię podczas próby aktualizacji. Dzieje się tak tylko na urządzeniach zrootowanych. – Brian

Odpowiedz

6

Wygląda na to, że błąd występuje na urządzeniach, na których Usługi Google Play nie są zainstalowane, przekazany zamiar będzie wtedy pusty.

Możesz upewnić się, że przekazany zamiar nie jest zerowy przez nadpisanie metody startActivityForResult w Twojej Działalności.

@Override  
public void startActivityForResult(Intent intent, int requestCode) { 
    if (intent == null) {  
     intent = new Intent();   
    }  
    super.startActivityForResult(intent, requestCode); 
} 
+0

Hmm nie działa dla mnie, nadal mam awarię. – jlively

+0

@jlivelyare można alternatywnie wywołać super w bloku catch catch. W ten sposób wyjątek zerowego wskaźnika zostanie przechwycony bez wątpliwości. Jedyne, co należy się upewnić, że działanie, które przesłania startActivityForResult, jest właściwe. – MVojtkovszky

+0

Przepraszam, ale co na Ziemi jest punktem rozpoczęcia działalności z pustym zamiarem? –

-1

ów naprawdę działa

@Override 
public void startActivityForResult(Intent intent, int requestCode) { 
    try { 
     super.startActivityForResult(intent, requestCode); 
    } catch (Exception ignored){} 
} 
+2

Spróbuj bloków catch są wolne. Dla tego scenariusza wystarczyłaby kontrola zerowa. – Ajeet

3

To pytanie jest nieco stary, ale ja po prostu chciałem podzielić aktualizacji na nim. Zgodnie z this Github issue on the GCM project problem powinien zostać rozwiązany w Usługach Google Play w wersji 9.4.0. Przyjęta odpowiedź powinna również działać (jako łata pośrednia), ale jeśli zaktualizujesz bibliotekę Usług Google Play, problem ten powinien zostać rozwiązany.