私はGCMを実装しています-最初に行うことは、GCMRegistrar.getRegistrationIdを呼び出して、デバイスが登録されているかどうかを確認することです。そうではないので(空の文字列が返されます)、GCMRegistrar.registerを非同期で呼び出します。予想どおり、私のインテントサービス(GCMBaseIntentServiceから派生)は、サーバーがこのデバイスにGCMメッセージを送信するために使用できるトークンとともにonRegistered()メソッドを呼び出します。ここまでは順調ですね。
ただし、次にアプリを実行するときは、最初にGCMRegistrar.getRegistrationIdを呼び出して、インテントサービスのonRegistered関数で取得したトークンを返すことを期待しています。しかし、私は再び空の文字列を取得します。GCMクライアントライブラリ(gcm.jar)は、GCM登録ID(トークン)をプライベートSharedPreferencesオブジェクトに保存すると思いました。実際、GCMRegistrarクラスのドキュメント(http://developer.android.com/guide/ google / gcm / client-javadoc / com / google / android / gcm / GCMRegistrar.html)は、「注:このクラスはプライベートSharedPreferencesオブジェクトを使用して登録トークンを追跡します」と述べています。
デバイスの登録を解除したり、アプリケーションをアンインストールしたり、versionCodeを更新したりしていません。私が欠けているアイデアはありますか?ありがとう
注-この質問は、android-gcmタグの下のGoogleグループに投稿されています。URLはここにあります:
https://groups.google.com/forum/#!topic/android-gcm/4FPqZLzlvE4
Mark Murphy(Commons Guy)は問題の初期診断に非常に役立ちましたが、具体的なものは何も表面化されていません。
更新編集-これが私のAndroidManifest.xmlの関連部分です
<receiver android:name=".push.GCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.myapp.package.name" />
</intent-filter>
</receiver>
<service android:name=".push.GCMIntentService" />