2016-08-09 9 views
0

Die AndroidManifest.xml:Android GCM - Kann nicht empfangen Nachrichten

<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 

    <!-- Receiver for GCM Messages--> 
    <receiver 
     android:name="com.google.android.gms.gcm.GcmReceiver" 
     android:exported="true" 
     android:permission="com.google.android.c2dm.permission.SEND" > 
      <intent-filter> 
       <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> 
       <action android:name="com.google.android.c2dm.intent.GCM_RECEIVED_ACTION"/> 
       <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
       <category android:name="de.comp.module.client" /> 
      </intent-filter> 
    </receiver> 

    <service 
     android:name="de.comp.module.client.gcm.GCMBroadcastIntentService" 
     android:exported="false"> 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
     </intent-filter> 
    </service> 

Die GCMBroadcastIntentService Klasse:

public class GCMBroadcastIntentService extends GcmListenerService { 

    @Override 
    public void onMessageReceived(String from, Bundle extras) { 
     if (extras.containsKey("message")) {} 
    } 
} 

Die onMessageReceived() -Methode wird nie aufgerufen. Der Server funktioniert einwandfrei, die Nachrichten werden ohne Fehler an Google GCM gesendet, kommen aber nie auf dem Gerät an. Ich benutze auch google-services.json, die im Ordner/app gespeichert ist. In meiner App kann sich der Benutzer nach einer Neuinstallation anmelden. In diesem Fall wird ein neues GCM-Token angefordert und an den Server gesendet. Also sollte es korrekt und aktuell sein.

Was fehlt? Danke für Ihre Hilfe.

EDIT:

public class GCMRegistrationIntentService extends IntentService { 
    @Override 
     protected void onHandleIntent(Intent intent) { 

     try { 

      // register server key to GCM 
      GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this); 
      String regid = gcm.register(getString(R.string.gcm_defaultSenderId)); 

     // Request new token for this server key 
     InstanceID instanceID = InstanceID.getInstance(this); 
     String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId), GoogleCloudMessaging.INSTANCE_ID_SCOPE, null); 

     // Subscribe to topic channels 
     subscribeTopics(token); 
    ... 
} 
+0

haben Sie den Serverschlüssel zu GCM registriert ?? –

Antwort

0

müssen Sie die Absender-ID in dem GCM registrieren:

GoogleCloudMessaging gcm=null; 

try { 

    if (gcm == null) { 

     gcm = GoogleCloudMessaging.getInstance(getContext()); 

    } 

    String regid = gcm.register(SENDER_ID); 


} catch (IOException ex) { 

    msg = "Error :" + ex.getMessage(); 

} 

zur Kenntnis, dass SENDER_ID die ID des Servers, der die Benachrichtigung stattdessen

+0

Danke für deine Antwort. Ich werde überprüfen. Muss ich es einmal oder bei jedem Start der App registrieren? –

+0

Sie müssen es registrieren, aber wenn Sie es jedes Mal registrieren, wenn Sie die App starten, wird es auch gut funktionieren. –

+0

Es funktioniert nicht. Ist es ein Problem, dass die Registrierung in einem IntentService erfolgt? Siehe meine aktualisierte Frage oben. –

0

Versuchen Sie von vorne zu beginnen.

  1. Stellen Sie sicher, dass SENDER_ID mit der Projektnummer in der Konsole übereinstimmt.
  2. Stellen Sie sicher, dass Sie die Registrierung implementieren IntentService, die Registrierung des Geräts ist erfolgreich und Sie erhalten ein Push-Token (GCM-Registrierungs-ID).
  3. Stellen Sie sicher, dass Sie es an den Server übergeben.
  4. Vergessen Sie nicht InstanceIDListenerService zu implementieren.
  5. Fügen Sie fehlende Dienste zur Manifestation hinzu.
  6. alles von Anfang an beginnen und Aufmerksamkeit bei jedem https://developers.google.com/cloud-messaging/android/client

    nach
    https://developers.google.com/cloud-messaging/android/client

0

Richten Sie den GCM-Client Schritt zahlen Wenn Sie noch keinen Anruf zu onMessageReceived() erhalten, können Sie überprüfen, ob das Problem etwas ähnlich ist GcmListenerService.onMessageReceived() not called

Auch GCM erfordert ein Google-Konto für Pre-4.0.4-Geräte, wenn Sie die veraltete Bibliothek (GCMRegistrar.register) verwenden,. Wenn ja müssen Sie einen Eintrag in AndroidManifest als

machen
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 

Siehe GET_ACCOUNTS permission while using GCM - Why is this needed?

Verwandte Themen