1

Я создал службу GCM Intent и устройство успешно зарегистрировалось, и сервер успешно отправил сообщение. но устройство не получает никаких уведомлений.GCM - GCMBroadcastReceiver не получает вызов

Ниже в журнале я вижу,

10-29 18:26:09.599: V/GCMBroadcastReceiver(30775): onReceive: com.google.android.c2dm.intent.RECEIVE 
10-29 18:26:09.599: V/GCMBroadcastReceiver(30775): GCM IntentService class: com.eye.hor.GCMIntentService 
10-29 18:26:09.599: V/GCMBaseIntentService(30775): Acquiring wakelock 

Ниже приведен код для GCMBroadcastReceiver,

public class GcmBroadcastReceiver extends WakefulBroadcastReceiver { 
@Override 
public void onReceive(Context context, Intent intent) { 

    Log.i(context.getPackageName(), intent.getExtras().toString()); 
    Log.d("brdR", "askd"); 
    // Explicitly specify that GcmIntentService will handle the intent. 
    ComponentName comp = new ComponentName(context.getPackageName(), GcmIntentService.class.getName()); 
    // Start the service, keeping the device awake while it is launching. 
    startWakefulService(context, (intent.setComponent(comp))); 
    setResultCode(Activity.RESULT_OK); 
} 

}

Ниже приведен код для GCMIntentService,

public class GcmIntentService extends IntentService { 
public static final int NOTIFICATION_ID = 1; 
private NotificationManager mNotificationManager; 
NotificationCompat.Builder builder; 

public GcmIntentService() { 
    super("GcmIntentService"); 
} 

@Override 
protected void onHandleIntent(Intent intent) { 
    Bundle extras = intent.getExtras(); 
    GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this); 
    // The getMessageType() intent parameter must be the intent you received 
    // in your BroadcastReceiver. 
    String messageType = gcm.getMessageType(intent); 

    if (!extras.isEmpty()) { // has effect of unparcelling Bundle 
     /* 
     * Filter messages based on message type. Since it is likely that 
     * GCM will be extended in the future with new message types, just 
     * ignore any message types you're not interested in, or that you 
     * don't recognize. 
     */ 
     if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType)) { 
      // sendNotification("Send error: " + extras.toString()); 
     } else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED.equals(messageType)) { 
      // sendNotification("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.d("", "Working... " + (i + 1) + "/5 @ " + 
      // SystemClock.elapsedRealtime()); 
      // try { 
      // Thread.sleep(5000); 
      // } catch (InterruptedException e) { 
      // } 
      // } 
      Log.d("true", "Completed work @ " + SystemClock.elapsedRealtime()); 
      // Post notification of received message. 
      sendNotification(extras.getString("msg"), extras.getString("title"), extras.getString("id")); 

      Log.d("true", "Received: " + extras.toString()); 
     } 
    } 
    // Release the wake lock provided by the WakefulBroadcastReceiver. 
    GcmBroadcastReceiver.completeWakefulIntent(intent); 
} 

// Put the message into a notification and post it. 
// This is just one simple example of what you might choose to do with 
// a GCM message. 
private void sendNotification(String msg, String title, String id) { 
    mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE); 
    int notification_id = Integer.parseInt(id); 

    // PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new 
    // Intent(this, CommonUtils.class), 0); 

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this).setSmallIcon(R.drawable.icon).setContentTitle(title) 
      .setStyle(new NotificationCompat.BigTextStyle().bigText(msg)).setContentText(msg); 

    // mBuilder.setContentIntent(contentIntent); 
    mNotificationManager.notify(notification_id, mBuilder.build()); 
} 

}

Это проявляется,

<!-- GCM requires a Google account. --> 
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 

<!-- Keeps the processor from sleeping when a message is received. --> 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 

<!-- Creates a custom permission so only this app can receive its messages. --> 
<permission 
    android:name="com.eye.hor.permission.C2D_MESSAGE" 
    android:protectionLevel="signature" /> 

<uses-permission android:name="com.eye.hor.permission.C2D_MESSAGE" /> 

<!-- This app has permission to register and receive data message. --> 
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 

<!-- Permission to vibrate --> 
<uses-permission android:name="android.permission.VIBRATE" /> 

Receiver Код в манифесте,

<receiver 
     android:name="com.google.android.gcm.GCMBroadcastReceiver" 
     android:permission="com.google.android.c2dm.permission.SEND" > 
     <intent-filter> 

      <!-- Receives the actual messages. --> 
      <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
      <!-- Receives the registration id. --> 
      <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> 

      <category android:name="com.eye.hor.service" /> 
     </intent-filter> 
    </receiver> 

    <service android:name="com.eye.hor.service.GCMIntentService" /> 

Мой главный имя пакета com.eye.hor, но я помещен GCMIntentService и GCMBroadcastReceiver Java-файлы в ком пакет .eye.hor.service. Я уже поставил log в этих двух классах, но они не доходят. пожалуйста, помогите

+0

Если кто-нибудь знает, где я ошибаюсь, пожалуйста, помогите мне решить эту проблему. – user3800832

+0

Проблема должна быть на стороне сервера. У меня такая же реализация, и она работает отлично. Какой сервер вы используете? – jvrodrigues

+0

У меня есть заставка, которая работает на php и MySql. Является ли моя реализация выше? Теперь я изменил код, как сказал @Eran. – user3800832

ответ

1

Похоже, вы уже знаете, у вас есть проблемы с именами пакетов:

Следующие выглядит для вашего класса обслуживания в неверном пакете:

ComponentName comp = 
    new ComponentName(context.getPackageName(), // this is the main package of 
               // your app - com.eye.hor 
         GcmIntentService.class.getName()); 

изменить его на:

ComponentName comp = 
    new ComponentName(GcmIntentService.class.getPackage().getName(), 
         GcmIntentService.class.getName()); 

Вы также должны изменить категорию в манифесте на основной пакет:

<category android:name="com.eye.hor.service" /> 

в

<category android:name="com.eye.hor" /> 
+0

Я изменил вышеупомянутую вещь, как вы сказали, но все еще получал ту же ошибку. – user3800832

+0

@ user3800832 Попробуйте также установить категорию в манифесте. – Eran

+0

все еще идет такая же ошибка. – user3800832

1
<category android:name="com.eye.hor.service" /> 

Это не должен быть пакет ваш BroadcastReceiver находится, это пакет определяется в консоли разработчика Google.

Я готов поспорить, в ваших разработчиков Google консоли вы определили пакет имеет com.eye.hor, в этом случае вы должны изменить эту строку:

<category android:name="com.eye.hor" /> 
+0

По-прежнему такая же ошибка. – user3800832

+0

Правильно ли вы установили допустимые ips в gdc? – jvrodrigues

+0

Я не понимаю, что вы спрашиваете? – user3800832

0
  1. Что такое устройство, на котором вы разработали приложение? На разных устройствах есть влияние экзотических настроек на фоновый режим работы, проверьте такие настройки на вашем устройстве («автозапуск», «push-уведомление» и т. Д., Они могут вызываться разными на некоторых устройствах, таких как Xiamo, Huawei и др.).

  2. Вы уверены, что ваш сервер push использует правильные параметры «идентификатор отправителя» и «api key», которые вы можете проверить в консоли разработчика?

  3. Убедитесь, что службы Google Play установлены правильно.

+0

@ user3800832, чтобы проблема не на стороне сервера пыталась отправить push-сообщение с сервера [test GCM] (http://1-dot-sigma-freedom-752.appspot.com /), которые я разработал для целей тестирования. Код клиента выглядит правильно. – Samik

Смежные вопросы