2013-04-04 15 views
19

Moi android app ulega awarii i jest to logcat: -W jaki sposób Intent może mieć wartość null w 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) 

Spojrzałem na android źródła GCM R3 i stwierdziliśmy, że argument intencją jest nieważna w onHandleIntent().

Czy to możliwe? Jak to naprawić?

(wiem zerowy intencją było widać z Service.onStartCopmmand powrocie START_STICKY ale IntentService.onStartCommand nie używa START_STICKY.)

+0

Jak można powiedzieć, że intencja jest zerowa? Skoncentruj się na linii 194 w swojej funkcji onHandleIntent(), może być coś innego, co będzie miało wartość zerową ... –

+0

Dziękuję za odpowiedź. Ponieważ mam słoik i źródło z androida SDK. wiersz 194 to "String action = intent.getAction();" – NoraBora

+0

W niektórych systemach intencja ma wartość zerową i jest całkowicie normalna w przypadku, gdy msg.obj, która zostanie przekazana, ma wartość null. Tam nie ma zerowego czeku. – Edison

Odpowiedz

0

myślę awarie aplikacji tylko w niektórych urządzeniach podczas czasu instalacji. Dzieje się tak dlatego, że podczas instalacji usługa GCM otrzymuje również inne dane z innego źródła Google, a Twój odbiornik nie jest przygotowany do obsługi tego typu usługi.

Jeśli chcesz otrzymać zamiar GCM, który chcesz pobrać z serwera za pomocą powiadomienia push, użyj tego po prostu w klanie Intent call.

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

Zgadzam się, mój GCMBroadcastReceiver odbiera od czasu do czasu jakiś zerowy cel, więc muszę sprawdzić, czy intencja przychodząca ma wartość zerową czy nie. Nie wiem co się dzieje, ale podczas instalacji mam zamiar zero. – Lev

+0

Wszelkie aktualizacje na ten temat, jak rozwiązać i sprawdzić ten problem? –

Powiązane problemy