2012-08-16 18 views
13

Ich habe einige seltsame stacktraces von den Benutzern meiner App vor kurzem bekommen:GCM FC/Absender-ID nicht gesetzt auf Konstruktor

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) 

I 3 des GCM lib bin mit Rev. und in Bezug auf die Dokumentation der SenderID ist nicht mehr notwendig, um vom Konstruktor übergeben zu werden (war so in C2DM Zeiten) - auch dies stürzt nicht auf meinen Geräten und auf den Geräten vieler anderer Benutzer ab. Kann jemand ein Licht auf das werfen, was auf diesen Geräten passiert und hat idealerweise ein Workaround? Ein nicht arbeiten GCM für diese Benutzer wäre eine Option für mich sein als Gerät Push ist optional - aber ich will es nicht zum Absturz zu bringen ..

bearbeiten hier die Quelle verwendet: https://github.com/ligi/gobandroid/blob/master/src/org/ligi/gobandroid_hd/GCMIntentService.java

Antwort

18

Haben Sie überschreiben die Methode getSenderIds(Context context) von GCMBaseIntentService? In dem Quellcode wird erwähnt, wenn Sie eine SenderID im Konstruktor nicht übergeben, müssen Sie getSenderIds(Context context) überschreiben, um eine SenderID bereitzustellen.

Hier ist der Kommentar von dem Konstruktor:

/** 
* 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); 
} 

Und der Kommentar für 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

Dank für Ihre Antwort, aber ich diesen Konstruktor hier nicht überschrieben haben, ist die Quelle https://github.com/ligi/gobandroid/blob/master/src/org/ligi/gobandroid_hd/GCMIntentService.java auch die doc hier: http://developer.android.com/guide/google/gcm/gs.html sagt nichts über das Überschreiben von getSenderIds – ligi

+0

Wenn Sie die GCM Extras installiert haben, dann haben Sie Zugriff auf den Quellcode von GCMBaseIntentService.java, Schauen Sie sich diese Datei an und das ist im Quellcode erwähnt. – azgolfer

+0

Ich bin noch nicht 100% über diese ganze Sache, aber ich akzeptiere und verbessere deine Antwort, wie ich dafür dankbar bin! – ligi

12

aus einer Google Group Antwort Zitiert:

Es aussieht wie du‘ Verwenden Sie den Standardkonstruktor ohne zu überschreiben die getSenderIds() -Methode. Wie der Javadoc des Konstruktors erklärt:

Konstruktor, der eine Absender-ID nicht festgelegt, nützlich, wenn die Absender-ID kontextspezifisch ist. Wenn Sie diesen Konstruktor verwenden, muss die Unterklasse Überschreibung getSenderIds (Context), sonst Methoden wie onHandleIntent (Intent) eine Illegal zur Laufzeit

werfen Wenn Sie nicht über eine dynamische Absender-ID benötigen, sollten Sie mit dem Konstruktor , die stattdessen die Absender-ID verwendet.

UPDATE: Ich denke, dass ich gelöst habe.

Blick in die GCM Beispiele, Sie haben dies implemnt, wenn Sie den supert Konstruktor mit statischen YOUR_GCM_SENDER_ID verwenden (

public GCMIntentService() { 
     super(YOUR_GCM_SENDER_ID); 
} 

Andernfalls, wenn Sie die Super-Konstruktor ohne params verwenden, müssen Sie getSenderIds außer Kraft setzen (Context)

Alles in JavaDoc documentation

UPDATE erklärt hat: zu erklären, was ist YOUR_GCM_SENDER_ID

Wenn Sie Ihr Google API-Projekt auf der Seite Google API Console konfigurieren, müssen Sie ein eigenes Projekt erstellen und die GCM-API darauf aktivieren.

Sie Projekt-URL wird so etwas wie

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

Der Wert nach #project sein: (4815162342 in diesem Beispiel) ist die Projektnummer, und es wird später als GCM-Absender-ID verwendet werden.

+4

Hier ist der "Global.GCM_SENDER_ID" der Wert wie 2372498294, den @StErMi über sein GCM-Setup bei Google erworben und in seiner App als Konstante abgelegt hat. Der Wert ist die gleiche Absender-ID, die in GCMRegistrar.register (dies, SENDER_ID) verwendet wird; – larham1

+0

ja, werde meinen Beitrag bearbeiten :) – StErMi