13

最近、アプリのユーザーから奇妙な 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)

私は GCM lib の Rev. 3 を使用しており、ドキュメントに関しては、senderID をコンストラクターから渡す必要はもうありません (C2DM の時代はそうでした)。他の多くのユーザー。誰かがこれらのデバイスで何が起こっているのかを明らかにし、理想的にはいくつかの回避策を持っていますか? デバイスのプッシュはオプションであるため、これらのユーザー向けの非動作 GCM はオプションですが、クラッシュさせたくありません..

ここで編集は、使用されるソースです: https://github.com/ligi/gobandroid/blob/master/src/org/ligi/gobandroid_hd/GCMIntentService.java

4

2 に答える 2

18

getSenderIds(Context context)GCMBaseIntentServiceのメソッドをオーバーライドしましたか? ソースコードから、コンストラクターで SenderID を渡さない場合は、SenderIDgetSenderIds(Context context)を提供するためにオーバーライドする必要があることが示されています。

コンストラクターからのコメントは次のとおりです。

/**
 * 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;
}
于 2012-08-17T15:07:08.797 に答える
12

Google グループの回答からの引用:

getSenderIds() メソッドをオーバーライドせずにデフォルトのコンストラクターを使用しているようです。コンストラクターのjavadocが説明しているように:

送信者 ID を設定しないコンストラクター。送信者 ID がコンテキスト固有である場合に役立ちます。このコンストラクターを使用する場合、サブクラスは getSenderIds(Context) をオーバーライドする必要があります。そうしないと、onHandleIntent(Intent) などのメソッドが実行時に IllegalStateException をスローします。

動的な送信者 ID が必要ない場合は、代わりに送信者 ID を受け取るコンストラクターを使用する必要があります。

更新:解決したと思います。

GCM の例の中を見てください。静的な YOUR_GCM_SENDER_ID (

public GCMIntentService() {
        super(YOUR_GCM_SENDER_ID);
}

それ以外の場合、パラメーターなしでスーパー コンストラクターを使用する場合は、getSenderIds(Context) をオーバーライドする必要があります。

JavaDoc ドキュメントで説明されているすべて

更新: YOUR_GCM_SENDER_ID とは何かを説明する

Google API コンソールページで Google API プロジェクトを構成するときは、独自のプロジェクトを作成し、その上で GCM API を有効にする必要があります。

プロジェクトのURLは次のようになります

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

#project: の後の値 (この例では 4815162342) はプロジェクト番号であり、後で GCM 送信者 ID として使用されます。

于 2012-09-20T12:56:22.073 に答える