Идентификатор GCM FC / идентификатор отправителя не установлен в конструкторе

Недавно у меня появилось несколько странных StackTraces от пользователей моего приложения:

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) 

Я использую Rev. 3 библиотеки GCM, и в отношении документации идентификатор senderID больше не требуется, чтобы передать конструктор (это было так в C2DM раз) – также это не сбой на моих устройствах и на устройствах Много других пользователей. Может кто-то пролил свет на то, что происходит на этих устройствах, и у идеализма есть какое-то решение? Неработающий GCM для этих пользователей был бы вариантом для меня, поскольку push устройства не является обязательным, но я не хочу, чтобы он разбился.

Здесь используется источник: https://github.com/ligi/gobandroid/blob/master/src/org/ligi/gobandroid_hd/GCMIntentService.java

Solutions Collecting From Web of "Идентификатор GCM FC / идентификатор отправителя не установлен в конструкторе"

Вы переопределили метод getSenderIds(Context context) из GCMBaseIntentService? Из исходного кода он упоминал, что если вы не передаете SenderID в конструкторе, вам необходимо переопределить getSenderIds(Context context) для предоставления SenderID.

Вот комментарий от конструктора:

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

И комментарий для 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; } 

Цитата из ответа группы Google :

Похоже, вы используете конструктор по умолчанию, не переопределяя метод getSenderIds (). Как объясняет javadoc конструктора:

Конструктор, который не устанавливает идентификатор отправителя, полезен, когда идентификатор отправителя специфичен для контекста. При использовании этого конструктора подкласс должен переопределять getSenderIds (Context), в противном случае методы, такие как onHandleIntent (Intent), будут вызывать исключение IllegalStateException во время выполнения

Если вам не нужен идентификатор динамического отправителя, вы должны использовать конструктор, который вместо этого отправляет идентификатор отправителя.

ОБНОВЛЕНИЕ: Думаю, я решил.

Просмотрите примеры GCM, вам нужно выполнить это, если вы используете конструктор supert со статическим YOUR_GCM_SENDER_ID (

 public GCMIntentService() { super(YOUR_GCM_SENDER_ID); } 

В противном случае, если вы используете супер-конструктор без параметров, вам нужно переопределить getSenderIds (Context)

Все, что объясняется в документации JavaDoc

ОБНОВЛЕНИЕ: Объяснение, что такое YOUR_GCM_SENDER_ID

Когда вы настраиваете свой проект API Google на странице консоли Google API, вам необходимо создать свой собственный проект и включить GCM API.

Вы проект url будет чем-то вроде

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

Значение после #project: (4815162342 в этом примере) – это номер вашего проекта, и он будет использоваться позже как идентификатор отправителя GCM.