Подтвердить что ты не робот

Идентификатор 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

4b9b3361

Ответ 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.