2012-08-16 13 views
13

Dostałem jakieś dziwne StackTraces od użytkowników mojej aplikacji niedawno:GCM FC/nadawca id nie jest ustawiona na konstruktora

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) 

Używam Obj 3 z lib GCM i odnośnie do dokumentacji Sender jest nie musiał już być przekazywany przez konstruktora (tak było w czasach C2DM) - również to nie powoduje awarii na moich urządzeniach i urządzeniach wielu innych użytkowników. Czy ktoś może rzucić światło na to, co dzieje się na tych urządzeniach i czy ma jakiś sposób obejścia tego problemu? Non GCM pracy dla tych użytkowników będzie to opcja dla mnie jak pchnięcie urządzenie jest opcjonalna - ale ja nie chcę, żeby upaść ..

Edit tutaj jest źródłem używane: https://github.com/ligi/gobandroid/blob/master/src/org/ligi/gobandroid_hd/GCMIntentService.java

Odpowiedz

18

Czy przesłonić metoda getSenderIds(Context context) z GCMBaseIntentService? Z kodu źródłowego wynika, że ​​jeśli nie przekazujesz identyfikatora SenderID do konstruktora, musisz zastąpić getSenderIds(Context context), aby podać identyfikator SenderID.

Oto komentarz z konstruktora:

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

I komentarz do 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

dzięki za odpowiedź, ale ja nie nadpisane tego konstruktora jest tu także źródłem https://github.com/ligi/gobandroid/blob/master/src/org/ligi/gobandroid_hd/GCMIntentService.java dokument tutaj: http://developer.android.com/guide/google/gcm/gs.html nic nie mówi o nadpisywaniu getSenderIds – ligi

+0

Jeśli masz zainstalowane dodatki GCM, będziesz mieć dostęp do kodu źródłowego GCMBaseIntentService.java, spójrz na ten plik i to właśnie wspomniano w kodzie źródłowym. – azgolfer

+0

Nie jestem jeszcze w 100% na ten temat, ale akceptuję i popieram twoją odpowiedź, ponieważ jestem wdzięczny za to! – ligi

12

Cytując z Google Group odpowiedzi:

Wygląda jak ty” ponownie użyj domyślnego konstruktora bez przesłonięcia metody getSenderIds(). Jak wyjaśnia to javadoc konstruktora:

Konstruktor, który nie ustawia identyfikatora nadawcy, przydatny, gdy identyfikator nadawcy jest zależny od kontekstu. Podczas korzystania z tego konstruktora, podklasa musi getSenderIds ręcznym (kontekstu), poza metody, takie jak onHandleIntent (intent) rzuci IllegalStateException na starcie

Jeśli nie trzeba dynamiczny ID nadawcy, należy użyć konstruktora zamiast tego przyjmuje identyfikator nadawcy.

AKTUALIZACJA: Myślę, że rozwiązałem.

zajrzeć przykładach GCM, musisz implemnt to jeśli używasz konstruktora Supert z YOUR_GCM_SENDER_ID statycznej (

public GCMIntentService() { 
     super(YOUR_GCM_SENDER_ID); 
} 

W przeciwnym razie, jeśli używasz super konstruktora bez params, trzeba zastąpić getSenderIds (Context)

Wszystko to wyjaśnione w JavaDoc documentation

UPDATE: wyjaśniając, co jest YOUR_GCM_SENDER_ID

Po skonfigurowaniu projektu Google API na stronie Google API Console należy utworzyć własny projekt i włączyć do niego interfejs API GCM.

Państwo projekt url będzie coś

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

Wartość po #project (4815162342 w tym przykładzie) to numer projektu i będzie on używany później jako identyfikator nadawcy GCM.

+4

Tutaj "Global.GCM_SENDER_ID" to wartość podobna do 2372498294, którą @StErMi nabył poprzez swoją konfigurację GCM z Google i wstawił do swojej aplikacji jako stałą. Wartością jest ten sam identyfikator nadawcy, który jest używany w GCMRegistrar.register (this, SENDER_ID); – larham1

+0

tak, zamierzam edytować mój wpis :) – StErMi

Powiązane problemy