GCM FC / ID de remitente no establecido en el constructor

He recibido algunos StackTraces extraños de los usuarios de mi aplicación recientemente:

Android Version: 2.3.5 Phone Model: GT-I9001 Stacktrace: java.lang.IllegalStateException: sender id not set on constructor at com.google.android.gcm.GCMBaseIntentService.getSenderIds(GCMBaseIntentService.java:125) at com.google.android.gcm.GCMBaseIntentService.onHandleIntent(GCMBaseIntentService.java:237) at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:59) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:130) at android.os.HandlerThread.run(HandlerThread.java:60) 

Estoy utilizando la Rev. 3 de la biblioteca de GCM y con respecto a la documentación el senderID no es necesario que sea pasado por el constructor más (fue así en C2DM veces) – también esto no se bloquea en mis dispositivos y en los dispositivos de un Muchos otros usuarios. ¿Puede alguien arrojar una luz sobre lo que está sucediendo en estos dispositivos y, idealmente, tiene alguna solución? Un GCM que no funciona para estos usuarios sería una opción para mí como dispositivo de empuje es opcional – pero no quiero que se bloquee ..

Editar aquí es la fuente utilizada: https://github.com/ligi/gobandroid/blob/master/src/org/ligi/gobandroid_hd/GCMIntentService.java

¿ getSenderIds(Context context) el método getSenderIds(Context context) de GCMBaseIntentService? Desde el código fuente, mencionó que si no pasas un SenderID en el constructor, entonces necesitas anular getSenderIds(Context context) para proporcionar un SenderID.

Aquí está el comentario del constructor:

 /** * Constructor that does not set a sender id, useful when the sender id * is context-specific. * <p> * When using this constructor, the subclass <strong>must</strong> * override {@link #getSenderIds(Context)}, otherwise methods such as * {@link #onHandleIntent(Intent)} will throw an * {@link IllegalStateException} on runtime. */ protected GCMBaseIntentService() { this(getName("DynamicSenderIds"), null); } 

Y el comentario de getSenderIds ():

 /** * Gets the sender ids. * * <p>By default, it returns the sender ids passed in the constructor, but * it could be overridden to provide a dynamic sender id. * * @throws IllegalStateException if sender id was not set on constructor. */ protected String[] getSenderIds(Context context) { if (mSenderIds == null) { throw new IllegalStateException("sender id not set on constructor"); } return mSenderIds; } 

Citando una respuesta de Google Group :

Parece que está utilizando el constructor predeterminado sin reemplazar el método getSenderIds (). Como explica el javadoc del constructor:

Constructor que no establece un identificador de remitente, útil cuando el identificador de remitente es específico del contexto. Cuando se utiliza este constructor, la subclase debe reemplazar getSenderIds (Context), de lo contrario métodos como onHandleIntent (Intent) lanzarán una IllegalStateException en tiempo de ejecución

Si no necesita un identificador de remitente dinámico, debe utilizar el constructor que toma el identificador del remitente en su lugar.

ACTUALIZACIÓN: Creo que he resuelto.

Mire dentro de los ejemplos de GCM, debe implemnt esto si utiliza el constructor supert con static YOUR_GCM_SENDER_ID (

 public GCMIntentService() { super(YOUR_GCM_SENDER_ID); } 

De lo contrario, si utiliza el super constructor sin params, tiene que anular getSenderIds (Context)

Todo lo que se explica en la documentación de JavaDoc

ACTUALIZACIÓN: explica qué es YOUR_GCM_SENDER_ID

Cuando configuró su proyecto de API de Google en la página de la Consola de API de Google, debe crear su propio proyecto y habilitar la API de GCM en él.

Tu url proyecto será algo así como

 https://code.google.com/apis/console/#project:4815162342 

El valor después de #project: (4815162342 en este ejemplo) es el número de su proyecto y se utilizará más adelante como ID de remitente de GCM.

  • Android GCM Java Server - notificación de emisión sin datos de mensajes
  • Android NotificationManager que me da "ningún icono pequeño válido" error
  • GCM de Android: el mismo identificador de remitente para más aplicaciones
  • Gestionar notificaciones múltiples / apilar notificaciones desde GCM
  • Codificación GCM de Android
  • GCM Cloud Connection Server - cómo empezar a usarlo?
  • ¿Debo usar GCM para la comunicación en tiempo real entre dispositivos?
  • ¿Pueden dos dispositivos diferentes tener el mismo ID de registro de GCM?
  • Java.lang.NoClassDefFoundError: com.google.android.gms.gcm.GoogleCloudMessaging
  • No se puede autenticar en el servidor GCS CCS
  • GCM y caracteres especiales
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.