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
- Android: administrar múltiples notificaciones push en el dispositivo de una aplicación
- Android, notificación Push mediante parse.com, inicia automáticamente la aplicación
- Enviar Notificaciones push a iOS / Android en WiFi cerrado (sin conexión a Internet)
- Implementación de la notificación push del servidor
- ¿Está com.google.android.c2dm.intent.RECEIVE todavía en uso?
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.
- Cómo mostrar las notificaciones Heads up android
- FCM: onMessageReceived no se llama, la notificación no llegó incluso después de enviar msg a fcm?
- La intención del receptor de mensajes de la nube de Google no se inicia (devolución de llamada de intención de difusión: resultado = CANCELADO paraIntención)
- Analizar: enviar notificaciones push desde la aplicación
- Notificación de la mensajería en la nube de Firebase Vibración
- BroadcastReceiver no se llama cuando la pantalla está bloqueada en Android
- Enviar difusión al hacer clic en la notificación
- El clic de Android en la notificación no abre la Actividad adjunta
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);
- Flujo de trabajo de desarrollo de aplicaciones Android más eficiente?
- Android: adb.exe extraer /mnt/sdcard/somefile.txt no funciona?