Notificación de envío extra enviada al dispositivo Android

He implementado Parse push notificaciones, pero hay un problema en el lado de Android para mí. Cada vez que envío una notificación de Parse, todos los dispositivos Android reciben dos notificaciones, una con el texto que he enviado y la otra con texto vacío.

Por favor, sugiera lo que podría estar mal aquí

Nota: También he añadido notificaciones nativas de Android (notificaciones de GCM) a mi proyecto. ¿Es posible que estén causando este problema?

Gracias.

El AndroidManifest está configurado de la siguiente manera:

<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="com.android.vending.BILLING" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <application android:name=".activityApplication" android:label="@string/app_name" android:icon="@drawable/icon"> <activity android:name=".activity" android:label="@string/app_name" android:screenOrientation="landscape" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:configChanges="orientation"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.google.android.gms.ads.AdActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/> <!-- gcm --> <receiver android:name="com.company.activity.GCBroadcastReceiver" android:exported="true" android:process=":remote" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <category android:name="com.company.activity" /> </intent-filter> </receiver> <service android:name=".GcmIntentService" /> <service android:name="com.parse.PushService" /> <receiver android:name="com.parse.ParseBroadcastReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.intent.action.USER_PRESENT" /> </intent-filter> </receiver> <receiver android:name="com.parse.GcmBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND"> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> <category android:name="com.company.activity" /> </intent-filter> </receiver> </application> 

Y este es mi Receptor Broadcast:

 public class GCBroadcastReceiver extends BroadcastReceiver { private static final String TAG = "GCBroadcastReceiver"; Context ctx; @Override public void onReceive(Context context, Intent intent) { ctx = context; // Local notification. Bundle bundle = intent.getExtras(); String message = bundle.getString("message"); String notificationID = bundle.getString("notificationID"); Log.v(TAG,"Notification message : " + message + "With ID : " + notificationID); sendNotification(message, notificationID); } // Put the GCM message into a notification and post it. private void sendNotification(final String message, final String notificationID) { Intent notificationIntent = new Intent(ctx, Activity.class); PendingIntent intent = PendingIntent.getActivity(ctx, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(ctx); mBuilder.setContentIntent(intent); mBuilder.setStyle(new NotificationCompat.BigTextStyle().bigText(message)); mBuilder.setWhen(System.currentTimeMillis()); mBuilder.setSmallIcon(R.drawable.icon); mBuilder.setContentTitle(ctx.getString(R.string.app_name)); mBuilder.setContentText(message); mBuilder.setLights(Color.RED, 400, 400); mBuilder.setAutoCancel(true); //mBuilder.setSound(Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + ctx.getPackageName() + "/raw/" + sound)); mBuilder.setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE); NotificationManager mNotificationManager = (NotificationManager) ctx .getSystemService(Context.NOTIFICATION_SERVICE); mNotificationManager.notify(0, mBuilder.build()); } } 

Parse utiliza GCM, por lo que si envía una notificación a una aplicación que utiliza Parse y además maneja el mensaje GCM con un código nativo de Android que muestra una notificación, la notificación se puede manejar dos veces (una vez por su código y una vez Por Parse), lo que hará que se muestre dos veces.

En cuanto a por qué una de las notificaciones tiene texto vacío – el código que muestra probablemente espera que el texto esté en un parámetro adicional que no fue enviado por el servidor y, por lo tanto, no había texto para mostrar.

ACTUALIZAR:

Ahora que te veo código, puedo agregar lo siguiente:

Usted tiene dos receptores de difusión que manejan mensajes entrantes de GCM – com.parse.GcmBroadcastReceiver y com.company.activity.GCBroadcastReceiver . Ambos intentan procesar las notificaciones enviadas a tu dispositivo desde Parse (de tu comentario a continuación, entiendo que el problema no ocurre cuando envías tus notificaciones "locales").

Supongo que la biblioteca de Parse se registra por sí sola en GCM. Si está utilizando un ID de proyecto diferente (ID de proyecto de API) para el registro de análisis y para su registro nativo de GCM, puede corregir el problema comprobando el intent.getExtras ().get("from") en su método onReceive . Si no contiene el ID de remitente de las notificaciones locales, no llame a sendNotification(message, notificationID); , Y no se mostrará la segunda notificación con el texto vacío.

 public void onReceive(Context context, Intent intent) { ctx = context; // Local notification. Bundle bundle = intent.getExtras(); String message = bundle.getString("message"); String notificationID = bundle.getString("notificationID"); Log.v(TAG,"Notification message : " + message + "With ID : " + notificationID); if (intent.getExtras ().get("from").equals (YOUR_SENDER_ID_FOR_LOCAL_NOTIFICATIONS)) sendNotification(message, notificationID); } 

Ahora, si está usando el mismo ID de remitente para ambos tipos de notificaciones, puede empezar a usar diferentes ID de remitente o puede usar una condición diferente: compruebe si intent.getExtras ().get("message") tiene un valor . Sus notificaciones locales requieren este parámetro, y estoy asumiendo que las notificaciones de análisis no (que explica las notificaciones sin texto que está viendo).

El uso de dos receptores de difusión GCM también puede causar otros problemas, por lo que le sugiero que mire esta pregunta para leerla más a fondo.

  • ADB push -p Descripción incorrecta del archivo
  • GcmBroadcastReceiver no se dispara en Android 4.0.3
  • NameError: uninitialized constant Rpush :: Gcm Estoy intentando usar rpush para mi aplicación móvil. Pero sigo recibiendo este error
  • Android OnNewIntent no se llama
  • El método setDefaultPushCallback del tipo PushService está obsoleto usando android
  • La aplicación se bloquea si la aplicación se cierra mediante el servicio Push: parse.com
  • ¿Puedo recibir mensajes de GCM de dos o más SENDER_ID de GCM en mi aplicación?
  • MQTT Eclipse Paho cliente en Android, desconectar se bloquea y nunca termina
  • Cómo dar contador si hay más de una notificación
  • Mensajes de GCM no se entregan
  • Notificaciones de la barra de estado de Android - Intención de obtener los extras antiguos por segunda vez
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.