2013-04-04 4 views
19

miei crash app Android e questo è il logcat: -In che modo Intent può essere nullo in onHandleIntent()?

java.lang.NullPointerException 
    at com.google.android.gcm.GCMBaseIntentService.onHandleIntent(GCMBaseIntentService.java:194) 
    at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.os.HandlerThread.run(HandlerThread.java:60) 

ho guardato in fonte GCM r3 Android e ho trovato che l'argomento intento è nullo in onHandleIntent().

È possibile? Come sistemarlo?

(lo so intento nulla poteva essere visto con Service.onStartCopmmand ritorno START_STICKY ma IntentService.onStartCommand non usa START_STICKY.)

+0

Come si può dire che l'intento è nullo ?? Concentrati sulla riga 194 nel tuo onHandleIntent(), potrebbe esserci qualcos'altro che sta diventando nullo ... –

+0

Grazie per la risposta. Perché ho il vaso e la fonte da Android SDK. la riga 194 è "String action = intent.getAction();" – NoraBora

+0

L'intento è nullo su alcuni sistemi ed è del tutto normale nel caso in cui msg.obj che viene passato sia nullo. Non c'è nessun controllo nulla lì. – Edison

risposta

0

Penso agli arresti di applicazione solo in alcuni dispositivi durante i tempi di installazione. È perché durante l'installazione il servizio GCM riceve anche alcuni Intent da un'altra fonte di Google e il destinatario della trasmissione non è preparato a gestire questo tipo di Intent.

Se si desidera ricevere GCM Intent da cui si desidera prelevare dal server tramite notifica push, è sufficiente utilizzarlo nella propria chiamata Intent handle.

protected void onHandleIntent(Intent intent) { 
Bundle extras = intent.getExtras(); 
     //String msg = intent.getStringExtra("message"); 
     String from=extras.getString("from"); 
     GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this); 
     String messageType = gcm.getMessageType(intent); 

     if (!extras.isEmpty()) { 

      if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType)) { 
       sendErrorNotification("Send error: " + extras.toString()); 
      } else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED.equals(messageType)) { 
       sendErrorNotification("Deleted messages on server: " + extras.toString()); 
       // If it's a regular GCM message, do some work. 
      } else if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)) { 
       // This loop represents the service doing some work. 
       for (int i = 0; i < 5; i++) { 
        Log.i(TAG, "Working... " + (i + 1) + "/5 @ " + SystemClock.elapsedRealtime()); 
        try { 
         Thread.sleep(500); 
        } catch (InterruptedException e) { 
        } 
       } 
       Log.i(TAG, "Completed work @ " + SystemClock.elapsedRealtime()); 
       // Post notification of received message. 
       // sendNotification("Received: " + extras.toString()); 
       /*********ERROR IN SOME DEVICES*****************/ 

       if(from.equals("google.com/iid")) 
       { 
        //related to google ... DO NOT PERFORM ANY ACTION 
       } 
       else { 
        //HANDLE THE RECEIVED NOTIFICATION 
        String msg = intent.getStringExtra("message"); 
        sendNotification(msg); 
        Log.i(TAG, "Received: " + extras.toString()); 
        } 
       /**************************/ 
      } 
     } 
     GcmBroadcastReceiver.completeWakefulIntent(intent); 
} 
+0

Sono d'accordo, il mio GCMBroadcastReceiver riceve qualche intento nullo di volta in volta, quindi devo verificare se l'intento in entrata è nullo o meno. Non so cosa succede, ma ottengo un intento nullo durante l'installazione. – Lev

+0

Qualche aggiornamento su questo come risolvere e controllare questo problema? –