Los dispositivos Android 4.x reciben mensajes GCM, pero los dispositivos Android 2.3

Mi aplicación Android nunca recibe mensajes GCM en dispositivos 2.3, pero sí en dispositivos 4.x. Puedo registrar todos los dispositivos (2.3 y 4.x) con éxito. Pensé que podría tener algo que ver con este problema , pero parece que tengo mi manifiesto android configurado correctamente. ¿Alguien podría mirar mi IntentService y BroadcastReceiver y ver si notan algún problema? Cualquier ayuda sería muy apreciada. Tenga en cuenta que onHandeIntent () nunca se llama para Android 2.3 al enviar notificaciones mientras tengo el depurador adjunto. Comprobé los dispositivos 4.x y activan el depurador en onHandleIntent (). ¡Gracias!

Android Manfest:

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="my.package" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="17" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <uses-permission android:name="my.package.matchtracker.permission.C2D_MESSAGE" /> <permission android:name="my.package.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <receiver android:name=".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="my.package" /> </intent-filter> </receiver> <service android:name=".NotificationIntentService" android:enabled="true" /> <activity android:name="com.gigya.socialize.android.GSWebViewActivity" /> <activity android:name=".MainActivity" android:label="@string/app_name" android:configChanges="orientation|screenSize" android:theme="@android:style/Theme.NoTitleBar"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> 

Receptor de radiodifusión:

 package my.package; import android.app.*; import android.content.*; public class GcmBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { NotificationIntentService.runIntentInService(context, intent); setResultCode(Activity.RESULT_OK); } } 

Servicio de notificación de intenciones

 public class NotificationIntentService extends IntentService { private String TAG = "NotificationIntentService"; public NotificationIntentService() { super(AppConstants.GCM_SENDER_ID); } public NotificationIntentService(String name) { super(name); // TODO Auto-generated constructor stub } private static PowerManager.WakeLock sWakeLock; private static final Object LOCK = NotificationIntentService.class; static void runIntentInService(Context context, Intent intent) { synchronized(LOCK) { if (sWakeLock == null) { PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); sWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "my_wakelock"); } } sWakeLock.acquire(); intent.setClassName(context, NotificationIntentService.class.getName()); context.startService(intent); } public final void onHandleIntent(Intent intent) { try { String action = intent.getAction(); if (action.equals("com.google.android.c2dm.intent.REGISTRATION")) { //don't care. } else if (action.equals("com.google.android.c2dm.intent.RECEIVE")) { handleMessage(intent); } } finally { synchronized(LOCK) { sWakeLock.release(); } } } private void handleMessage(Intent intent) { Bundle b = intent.getExtras(); String text = b.getString("text"), title = b.getString("title"), largeImageUrl = b.getString("largeImageUrl"); Log.i(TAG, "Message is " + text); NotificationManager nm = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE); Bitmap bit=null; if (largeImageUrl != null && !largeImageUrl.isEmpty()) { try{bit = BitmapFactory.decodeStream((InputStream)new URL(largeImageUrl).getContent()); } catch (Exception e){} } NotificationCompat.Builder nc = new NotificationCompat.Builder(this) .setContentTitle(title) .setContentText(text) .setSmallIcon(R.drawable.ic_launcher) .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)) .setAutoCancel(true) //notification disappears when clicked .setContentIntent(PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), PendingIntent.FLAG_UPDATE_CURRENT)); //bit = Bitmap.createScaledBitmap(bit, android.R.dimen.notification_large_icon_width, android.R.dimen.notification_large_icon_height, true); if (bit != null) nc.setLargeIcon(bit); nm.notify(0, nc.build()); } } 

El primer problema potencial que puedo ver es este:

El nombre del paquete en el elemento permission no es el mismo que el del elemento uses-permission . En mi aplicación (que apunta a Android 2.2) son idénticos.

 <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <uses-permission android:name="my.package.matchtracker.permission.C2D_MESSAGE" /> <permission android:name="my.package.permission.C2D_MESSAGE" android:protectionLevel="signature" /> 

Si está utilizando el sabor del producto con applicationId diferente, vea mi respuesta a la pregunta Los mensajes de GCM no se reciben en android 2.3.6 v pero funciona bien en android 4.X v

GCM necesita los servicios de Google Play instalados en el dispositivo, pero en la versión 2.3 no se instala de forma predeterminada.

  • ¿Puedo anular el icono predeterminado de notificación push en android desde el icono de la aplicación hasta el icono personalizado?
  • Android, notificación Push mediante parse.com, inicia automáticamente la aplicación
  • Programación de Android: GCMIntentService Stuck at WakeLock
  • Iniciar la aplicación sólo si no está en ejecución
  • ADB push -p Descripción incorrecta del archivo
  • ¿Debo solicitar un nuevo token cada vez que lance mi aplicación para Android?
  • Notificaciones push en la plataforma Android
  • Registro de identificación del dispositivo directamente con Amazon SNS
  • Notificación de sonido, vibración y LED no funcionan
  • Notificación de cancelación automática no funciona para Android Lollipop
  • Gestionar notificaciones múltiples / apilar notificaciones desde GCM
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.