No se pueden recibir mensajes con Google Cloud Messaging para Android (no la biblioteca de ayuda)

¿Alguien puede ayudarme con un ejemplo de trabajo para recibir mensajes de gcm con Google Cloud Messaging para Android. He intentado ambas maneras (biblioteca del ayudante y clase de GoogleCloudMessaging) y nada parece trabajar. Estoy usando un script PHP que muestra lo siguiente:

ID de multidifusión: 5.2108110103215E + 18 Número de mensajes procesados ​​correctamente: 1 Número de mensajes con errores de procesamiento: 0 IDs canónicos: 0

Así que aparentemente everithing está bien. Podría registrar el dispositivo en ambos sentidos, usando la biblioteca auxiliar (gcm.jar) y usando la clase GoogleCloudMessaging. El problema es que no hay manera de que el mensaje que envíe a través de PHP llegue, o al menos no sé cómo manejarlo correctamente. Aquí están los permisos y el receptor de mi manifiesto:

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

Finalmente aquí está la clase de servicio

 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) { //... } } 

Aquí está el código al usar la clase GoogleCloudMessaging (he cambiado el manifiesto para usar el receptor personalizado):

 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()); } 

}

La cosa es que todo parece estar bien, pero el mensaje nunca llega. ¿¿Algunas ideas?? Gracias por adelantado.

Agregue lo siguiente en su equipo

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

Su manifiesto no tiene permisos:

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

EDIT:

En tu manifiesto estás usando com.google.android.gcm.GCMBroadcastReceiver . Esa es una clase de la antigua biblioteca auxiliar ( gcm.jar ) que inicia un servicio intencionado. Si desea utilizar la biblioteca de ayuda, debe definir el servicio de intenciones en su manifiesto.

Si no desea utilizar la biblioteca auxiliar, debe cambiar el paquete de GCMBroadcastReceiver en el manifiesto para que sea el paquete de la clase GCMBroadcastReceiver que incluyó en su pregunta. De lo contrario, esa clase no se utilizará.

Después de corregir los problemas anteriores, todavía no hay mensajes de empuje. El problema fue el error 403. Parece que ese servicio no está disponible en Cuba, así que la solución es usar una herramienta como "tu libertad" o "thor", etc.

No olvide cambiar 'com.example.gcm' con el nombre del paquete, por ejemplo, 'com.sudominio.yourapp'

Está utilizando GCMBaseIntentService que ha sido rechazado por Google. (Pero debería seguir funcionando.) Seguí el último tutorial http://developer.android.com/google/gcm/client.html y recibí mensajes. Usted puede intentarlo también.

Otra posible razón es que puede haber recibido un mensaje pero no se ha mostrado en una notificación correctamente. Agregue esta línea en el método: sendNotification (String msg)

  Log.i(TAG, msg); 
  • Un servidor que envía notificaciones push a dispositivos Android e iOS
  • Firebase onMessageReceived no llamado cuando la aplicación está en segundo plano
  • No se puede iniciar la aplicación de receptor com.parse.ParseBroadcastReceiver en Trigger.io
  • Firebase Push Notification - Cómo mostrar mensaje multilínea en Notificación
  • Parse Push - Cómo abrir automáticamente una actividad sin la acción del usuario al recibir un empujón en Android
  • Aplicación Phonegap de Android: llevar la actividad al frente
  • Notificación lanza RemoteServiceException en el dispositivo de Motorola con OS 7
  • OneSignal: no se puede abrir la actividad después de hacer clic en el botón
  • ¿Por qué firebase push_token devuelve la lista negra?
  • ¿Las notificaciones no siempre se reciben por teléfono?
  • Al hacer clic en la notificación no se abre la actividad mencionada
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.