2016-06-26 78 views
24

Iniziare a ricevere questo errore nella versione di produzione della mia app.Intent.migrateExtraStreamToClipData() su un riferimento oggetto nullo

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

Non c'è nessuna linea chiara in cui ciò si verifica in realtà, ma di recente ho cambiato la mia versione della libreria di supporto al 24.0.0. Ecco lo stacktrace completo:

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: voglio anche notare che il 100% degli utenti che ottengono questo errore sono anche radicati. Questo si verifica anche su 23.4.0 ... Ho anche un potenziale errore correlato che è comparso allo stesso tempo che ha a che fare con la funzione Base64.decode in relazione a Firebase.

EDIT 2: Ho ricevuto aiuto da un Dev Dev di Android l'altro giorno. Mi hanno suggerito di aggiornare la versione dei servizi di Google Play del mio progetto e sembra aver contribuito finora. Aspetterò ancora qualche giorno per ottenere i risultati dai miei utenti ma i registri iniziali sono promettenti.

Precedentemente stavo usando 9.0.2 ma ora sono su 9.2.0.

MODIFICA 3: L'aggiornamento alla 9.2.0 non ha aiutato gli arresti anomali. Sto ancora ricevendo lo stesso errore dagli utenti rooted. Ho notato che gli utenti che subiscono arresti anomali sono inferiori a Android 6.0, quindi eseguirò un test su un dispositivo live e aggiornerò il più presto possibile.

+2

Questo succede anche sul mio emulatore. Innanzitutto ricevo un popup che dice: ... Si affida a Google Play Services, che non è supportato dal tuo dispositivo. Contattare il produttore per assistenza. Proverò a eseguire il debug. – Wirling

+0

@Wirling Ora che ne parli, ho il sospetto che i rapporti di errore provengano dai dispositivi di laboratorio di Google Test di Google anziché dai dispositivi dei miei utenti. Recentemente ho effettuato il root del mio dispositivo per testare questo errore e non l'ho ancora visto. – c0deblooded

+0

Sono in grado di riprodurlo utilizzando la libreria di Google Play Services Vision (9.2). Faccio un semplice controllo usando il metodo 'isGooglePlayServicesAvailable' prima di avviare la fotocamera per il rilevamento del codice QR. Se non è disponibile, mostrerò la finestra di dialogo dal metodo 'getErrorDialog'. Quindi si bloccherà durante il tentativo di aggiornamento. Succede solo su dispositivi rooted. – Brian

risposta

6

Sembra che l'errore si verifichi sui dispositivi su cui Google Play Services non è installato, l'intento passato sarà quindi nullo.

È possibile assicurarsi che l'intento passato non sia nullo eseguendo l'override del metodo startActivityForResult nell'attività.

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

Hmm non funziona per me, ho ancora l'incidente. – jlively

+0

@jlivelyare puoi in alternativa chiamare super in un blocco catch try. In questo modo l'eccezione del puntatore nullo verrà catturata senza dubbio. L'unica cosa da verificare è che l'attività che sovrascrive startActivityForResult sia quella giusta. – MVojtkovszky

+0

Scusami, ma che diavolo è il punto di iniziare l'attività con intenzioni vuote? –

-1

questo è funziona davvero

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

I blocchi di cattura sono lenti. Un controllo nulla sarebbe sufficiente per questo scenario. – Ajeet

3

Questa domanda è un po 'vecchio, ma ho solo voluto condividere un aggiornamento su di esso. Secondo lo this Github issue on the GCM project, il problema dovrebbe essere risolto nella versione 9.4.0 di Google Play Services. La risposta accettata dovrebbe funzionare altrettanto bene (come una patch intermedia), ma se aggiorni la tua libreria di Google Play Services questo problema dovrebbe essere risolto.