Не удается получать сообщения с помощью Google Cloud Messaging для Android (а не вспомогательной библиотеки)

Кто-нибудь может помочь мне с рабочим примером для получения сообщений от gcm с помощью Google Cloud Messaging для Android. Я пробовал оба пути (вспомогательная библиотека и класс GoogleCloudMessaging), и ничего не работает. Я использую PHP-скрипт, который показывает следующее:

Идентификатор многоадресной рассылки: 5.2108110103215E + 18 Количество успешно обработанных сообщений: 1 Количество сообщений с ошибками обработки: 0 Канонические идентификаторы: 0

Так что, кажется, все в порядке. Я мог бы зарегистрировать устройство в обоих направлениях, используя вспомогательную библиотеку (gcm.jar) и используя класс GoogleCloudMessaging. Проблема в том, что я не отправляю сообщение, отправляемое через PHP, или, по крайней мере, я не знаю, как правильно его обрабатывать. Вот разрешения и получатель из моего манифеста:

<permission android:name="com.example.gcm.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="com.example.gcm.permission.C2D_MESSAGE" /> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.USE_CREDENTIALS" /> <uses-permission android:name="android.permission.READ_OWNER_DATA" /> <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.example.gcm" /> </intent-filter> </receiver> <service android:name=".GCMIntentService" /> 

Наконец, это класс обслуживания

 public class GCMIntentService extends GCMBaseIntentService { private static final String PROJECT_ID = "49XXXXXXXX6"; private static final String TAG = "GCM Intent Service"; public GCMIntentService() { super(PROJECT_ID); Log.d(TAG, "GCMIntentService init"); } @Override protected void onError(Context ctx, String sError) { Log.d(TAG, "Error: " + sError); } @Override protected void onMessage(Context ctx, Intent intent) { Log.d(TAG, "Message Received"); String message = intent.getStringExtra("message"); sendGCMIntent(ctx, message); } private void sendGCMIntent(Context ctx, String message) { Intent broadcastIntent = new Intent(); broadcastIntent.setAction("GCM_RECEIVED_ACTION"); broadcastIntent.putExtra("gcm", message); ctx.sendBroadcast(broadcastIntent); } @Override protected void onRegistered(Context ctx, String regId) { Log.d(TAG, regId); // Notify main UI to update registration status Intent registrationIntent = new Intent(); registrationIntent.setAction("registered"); registrationIntent.putExtra("regId", regId); sendBroadcast(registrationIntent); } @Override protected void onUnregistered(Context ctx, String regId) { //... } } 

Вот код при использовании класса GoogleCloudMessaging (я изменил манифест для использования настраиваемого ресивера):

 public class GCMBroadcastReceiver extends BroadcastReceiver { private static final String TAG = "GCM Receiver"; public static final int NOTIFICATION_ID = 1; private NotificationManager mNotificationManager; private Context ctx; @Override public void onReceive(Context context, Intent intent) { Log.d(TAG, "Message received"); GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context); ctx = context; String messageType = gcm.getMessageType(intent); if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType)) { sendNotification("Send error: " + intent.getExtras().toString()); } else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED .equals(messageType)) { sendNotification("Deleted messages on server: " + intent.getExtras().toString()); } else { sendNotification("Received: " + intent.getExtras().toString()); } setResultCode(Activity.RESULT_OK); } // Put the GCM message into a notification and post it. private void sendNotification(String msg) { mNotificationManager = (NotificationManager) ctx .getSystemService(Context.NOTIFICATION_SERVICE); PendingIntent contentIntent = PendingIntent.getActivity(ctx, 0, new Intent(ctx, MainActivity.class), 0); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder( ctx).setSmallIcon(R.drawable.ic_launcher_temp) .setContentTitle("GCM Notification") .setStyle(new NotificationCompat.BigTextStyle().bigText(msg)) .setContentText(msg); mBuilder.setContentIntent(contentIntent); mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build()); } 

}

Дело в том, что все, кажется, в порядке, но сообщение никогда не приходит. Есть идеи?? Заранее спасибо.

Solutions Collecting From Web of "Не удается получать сообщения с помощью Google Cloud Messaging для Android (а не вспомогательной библиотеки)"

Добавьте в свой мафиозите следующее:

  <permission android:name="PACKAGE_NAME.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="PACKAGE_NAME.permission.C2D_MESSAGE" /> <!-- App receives GCM messages. --> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 

В вашем манифестке отсутствуют некоторые разрешения:

 <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <permission android:name="com.example.gcm.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="com.example.gcm.permission.C2D_MESSAGE" /> 

РЕДАКТИРОВАТЬ :

В манифесте вы используете com.google.android.gcm.GCMBroadcastReceiver . Это класс из старой вспомогательной библиотеки ( gcm.jar ), которая запускает услугу намерения. Если вы хотите использовать вспомогательную библиотеку, вы должны определить службу намерения в своем манифесте.

Если вы не хотите использовать вспомогательную библиотеку, вы должны изменить пакет GCMBroadcastReceiver в манифесте как пакет класса GCMBroadcastReceiver который вы включили в свой вопрос. В противном случае этот класс не будет использоваться.

После исправления вышеперечисленных проблем до сих пор нет push-сообщений. Проблема была в ошибке 403. Похоже, что эта услуга недоступна на Кубе, поэтому решение заключается в использовании такого инструмента, как «ваша свобода» или «тора» и т. Д.

Не забудьте изменить «com.example.gcm» на название вашего пакета, например «com.yourdomain.yourapp»,

Вы используете GCMBaseIntentService, который устарел от Google. (Но он все равно должен работать.) Я выполнил последний учебник http://developer.android.com/google/gcm/client.html и получил сообщения. Вы тоже можете попробовать.

Другая возможная причина – вы получили сообщение, но оно не было показано в уведомлении успешно. Добавьте эту строку в метод: sendNotification (String msg)

  Log.i(TAG, msg);