2016-08-09 2 views
0

AndroidManifest.xml:Android GCM - не может получать сообщения

<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> 

GCMBroadcastIntentService класс:

public class GCMBroadcastIntentService extends GcmListenerService { 

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

Метод onMessageReceived() никогда не вызывается. Сервер работает нормально, сообщения отправляются в Google GCM без каких-либо ошибок, но они никогда не поступают на устройство. Я также использую google-services.json, который хранится в папке/приложении. В моем приложении пользователь может loggin после новой установки. В этом случае запрашивается новый токен GCM и отправляется на сервер. Поэтому он должен быть правильным и актуальным.

Что не хватает? Спасибо за вашу помощь.

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

вы зарегистрировали ключ сервера к GCM ?? –

ответ

0

вы должны зарегистрировать идентификатор отправителя в GCM:

GoogleCloudMessaging gcm=null; 

try { 

    if (gcm == null) { 

     gcm = GoogleCloudMessaging.getInstance(getContext()); 

    } 

    String regid = gcm.register(SENDER_ID); 


} catch (IOException ex) { 

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

} 

к сведению, что SENDER_ID является идентификатор сервера, который отправляет уведомление о

+0

Спасибо за ваш ответ. Я проверю. Должен ли я регистрировать его один раз или каждый раз, когда приложение запускается? –

+0

, вам необходимо его зарегистрировать, но если вы регистрируете его каждый раз при запуске приложения, он также будет работать хорошо. –

+0

Не работает. Это проблема, связанная с регистрацией внутри IntentService? см. мой обновленный вопрос выше. –

0

Старайтесь начинать с самого начала.

  1. Убедитесь, что SENDER_ID соответствует номеру проекта в консоли.
  2. Убедитесь, что вы зарегистрировали IntentService, регистрация устройства прошла успешно и вы получаете токен ввода (идентификатор регистрации GCM).
  3. Убедитесь, что вы передали его на сервер.
  4. Не забудьте реализовать InstanceIDListenerService.
  5. Добавить отсутствующие службы для манифестации.
  6. начать все с самого начала, и обратить внимание на каждом шаге
    https://developers.google.com/cloud-messaging/android/client
0

Настройка клиента GCM согласно https://developers.google.com/cloud-messaging/android/client

Если вы все еще не получить вызов onMessageReceived(), вы можете проверить является ли проблема такой же, как и для GcmListenerService.onMessageReceived() not called

Также, если вы используете устаревшую библиотеку (GCMRegistrar.register), GCM требует учетную запись Google для устройств Pre-4.0.4. Если да, вам необходимо сделать запись в AndroidManifest, как

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

См GET_ACCOUNTS permission while using GCM - Why is this needed?