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 ..
- Notificaciones push de Android: cómo obtener la identificación del dispositivo
- Actualización de token de Firebase
- Android GCM 403 error no autorizado con PHP
- ¿Hay alguna manera de usar GCM en Android sin un servidor dedicado?
- Registro de GCM con dos identificadores de registro de trabajo diferentes
Editar aquí es la fuente utilizada: https://github.com/ligi/gobandroid/blob/master/src/org/ligi/gobandroid_hd/GCMIntentService.java
- Confusión de registro Android GCM
- ¿Funcionará GCM Network Manager en dispositivos que no sean de Play?
- Notificación de empuje para actualizaciones de aplicaciones
- ¿Cómo implementar servidor GCM-CCS XMPP de terceros utilizando openfire?
- Cómo saber si mi aplicación está abierta cuando administré una notificación push
- Solicitud del ID de registro de Google Cloud Messaging (GCM) cada vez que se inicia la aplicación
- Haga clic en la notificación GCM para no abrir la actividad deseada en Android Kitkat
- Error en el registro de Google Cloud Messaging
¿ 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.