Идентификатор 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 для этих пользователей был бы вариантом для меня, поскольку нажатие на устройство необязательно - но я не хочу, чтобы он разбился.
Изменить здесь используется источник:
https://github.com/ligi/gobandroid/blob/master/src/org/ligi/gobandroid_hd/GCMIntentService.java
Ответы
Ответ 1
Вы переопределили метод 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;
}
Ответ 2
Цитата из ответа Google Group:
Похоже, вы используете конструктор по умолчанию без переопределения метод getSenderIds(). Как поясняет конструктор javadoc:
Конструктор, который не устанавливает идентификатор отправителя, полезен, когда идентификатор отправителя контекстно-зависимая. При использовании этого конструктора подкласс должен переопределить getSenderIds (контекст), в противном случае такие методы, как 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 Console, вам нужно создать свой собственный проект и включить GCM API.
Вы создаете URL-адрес, например,
https://code.google.com/apis/console/#project:4815162342
Значение после #project: (4815162342 в этом примере) - это номер вашего проекта, и он будет использоваться позже как идентификатор отправителя GCM.