2012-08-16 15 views
13

He conseguido algunos stacktraces extrañas de los usuarios de mi aplicación recientemente:GCM FC/ID del remitente no se establece en el constructor de

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 usando Rev. 3 de la lib GCM y en relación a la documentación que el SenderId es ya no es necesario que el constructor lo apruebe (fue así en tiempos de C2DM); también esto no se cuelga en mis dispositivos ni en los dispositivos de muchos otros usuarios. ¿Alguien puede arrojar luz sobre lo que está sucediendo en estos dispositivos y, idealmente, tiene alguna solución alternativa? Un GCM no trabajo para estos usuarios sería una opción para mí como dispositivo de empuje es opcional - pero no quiero que se caiga ..

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

Respuesta

18

quiso anular el método getSenderIds(Context context) de GCMBaseIntentService? Desde el código fuente, mencionó si no transfiere un SenderID en el constructor, entonces debe 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 para 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; 
} 
+0

gracias por su respuesta, pero no he sobrescrito este constructor aquí es la fuente https://github.com/ligi/gobandroid/blob/master/src/org/ligi/gobandroid_hd/GCMIntentService.java también la doc aquí: http://developer.android.com/guide/google/gcm/gs.html no menciona nada sobre sobrescribir getSenderIds – ligi

+0

Si tiene instalados los extras de GCM, tendrá acceso al código fuente de GCMBaseIntentService.java, Echa un vistazo a ese archivo y eso es lo que se menciona en el código fuente. – azgolfer

+0

Todavía no estoy al 100% sobre todo esto, pero acepto y voto su respuesta ya que estoy agradecido por ello. – ligi

12

Citando una respuesta Google Group:

Parece que' re utilizando el constructor predeterminado sin anular el método getSenderIds(). Como javadoc del constructor explica:

Constructor que no establece un id de remitente, útil cuando el ID del remitente es específico del contexto. Al utilizar este constructor, la subclase debe getSenderIds de anulación (en contexto), de lo contrario métodos como onHandleIntent (Intención) arrojará una IllegalStateException en tiempo de ejecución

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

ACTUALIZACIÓN: Creo que he resuelto.

Ver muestra los ejemplos GCM, hay que implemnt esta opción si utiliza el constructor supert con YOUR_GCM_SENDER_ID estática (

public GCMIntentService() { 
     super(YOUR_GCM_SENDER_ID); 
} 

De lo contrario, si se utiliza el super constructor sin parametros, usted tiene que anular getSenderIds (Contexto)

Todo se explica en JavaDoc documentation

ACTUALIZACIÓN: explicar lo que es YOUR_GCM_SENDER_ID

Cuando configura su Proyecto de API de Google en la página Google API Console, debe crear su propio proyecto y habilitar la API de GCM en él.

proyecto que url 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 será utilizado más adelante como ID de remitente de GCM.

+4

Aquí el "Global.GCM_SENDER_ID" es el valor como 2372498294 que @StErMi adquirió a través de su configuración de GCM con Google, y lo ha puesto en su aplicación como una constante. El valor es el mismo ID de remitente que se utiliza en GCMRegistrar.register (esto, SENDER_ID); – larham1

+0

sí, voy a editar mi publicación :) – StErMi

Cuestiones relacionadas