この問題について他の答えを試してみましたが、解決できません。送信者IDが正しく、権限が追加され、APIキーがtrueです。
私はこの投稿を使用してプロジェクトを作成します: http://developer.Android.com/guide/google/gcm/gs.html#server-app
GCMRegistrar.checkDevice(this);
GCMRegistrar.checkManifest(this);
String regId = GCMRegistrar.getRegistrationId(this);
if (regId.equals("")) {
GCMRegistrar.register(this, SENDER_ID);
regId = GCMRegistrar.getRegistrationId(this);
} else {
Log.v(TAG, "Already registered");
}
String did = getDeviceID();
空の文字列を返します。
アプリのルートパッケージでGCMIntentService
を定義 正しく していますか?
_<receiver Android:name="com.google.Android.gcm.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="my_app_package" />
</intent-filter>
</receiver>
_
_"my_app_package"
_がアプリのメインパッケージと同一であることを確認してください。そうでない場合、IDは空の文字列を返します。
また、
_ GCMRegistrar.register(this, "...");
_
非同期です。したがって、その直後にGCMRegistrar.getRegistrationId(this)
を呼び出すことは信頼できないため、回避する必要があります。
IDは、登録手順の一部として、ブロードキャストコールバックを介してGCMIntentService
に到着します。そこからgcm/fcmキーを好きな場所に保存し、アプリケーションの他の部分(通常はサーバー上)で使用できます。
アプリケーションが初めて起動する場合は、GCMIntentService.JavaファイルでOnRegisteredコールバックを待つ必要があります。
GCMRegistrar.register(this, SENDER_ID);
// Android does NOT wait for registration ends and executes immediately line below
// So your regId will be empty.
regId = GCMRegistrar.getRegistrationId(this);
GCMIntentService.Java:
@Override
protected void onRegistered(Context c, String regId) {
// You can get it here!
}
編集:新しいバージョンのGCMライブラリ(Google Play Servicesライブラリにバンドルされています)は応答を待ち、登録IDを返します。したがって、この答えは古いGCMライブラリ用です。
解決策を見つけて1日苦労した後も同じ問題があります。まず、GCM関連のコードをメインパッケージに配置し、androidManifest.xmlのマイパッケージに従って変更を加えます
簡単な例を挙げましょう。私のプロジェクト名はGCMExampleで、3つのパッケージがあります。1。com.examle.GCMExample(Main Package)、2。com.examle.GCMExample.activity(Second Package)、3。com.example.GCMExample.adapter(Third Package)
GCM関連のクラスファイルを2番目のパッケージに入れると、登録IDを取得できません
1. GCMIntentService、2。ServerUtilities、3。CommonUtilitiesなどのGCM関連クラス4. WakeLockerがメインパッケージcom.example.GCMExampleに追加
私のandroidManifest.xmlも
<uses-permission Android:name="Android.permission.INTERNET" />
<uses-permission Android:name="Android.permission.GET_ACCOUNTS" />
<uses-permission Android:name="Android.permission.WAKE_LOCK" />
<uses-permission Android:name="Android.permission.VIBRATE" />
<permission Android:name="com.example.GCMExample.permission.C2D_MESSAGE"
Android:protectionLevel="signature" />
<uses-permission Android:name="com.example.GCMExample.C2D_MESSAGE" />
<uses-permission Android:name="com.google.Android.c2dm.permission.RECEIVE" />
<receiver
Android:name="com.google.Android.gcm.GCMBroadcastReceiver"
Android:permission="com.google.Android.c2dm.permission.SEND" >
<intent-filter>
<!-- Receives the actual messages. -->
<action Android:name="com.google.Android.c2dm.intent.RECEIVE" />
<!-- Receives the registration id. -->
<action Android:name="com.google.Android.c2dm.intent.REGISTRATION" />
<category Android:name="com.example.GCMExample" />
</intent-filter>
</receiver>
<service Android:name="com.example.GCMExample.GCMIntentService" />
送信者「my_sender_id」のアプリcom.example.ilkgcmを登録しています-このエラーは、「my_sender_id」を12文字のコードである有効な送信者IDに変更していないことを示しています。
登録から応答がない場合の主な理由の1つは、マニフェストファイルが正しく構成されていないことです。特に、「package_name」(com.xxx.yyyのようなアプリパッケージ名)を正しく指定してください。
たとえば、レシーバークラス名は「MyCustomIntentService.Java」です。この名前を「GCMIntentService.Java」に変更して、もう一度試してください。これは簡単な解決策です。 SRC領域でファイル名を変更するだけです。