web-dev-qa-db-ja.com

Android GCMから登録IDを取得できません

この問題について他の答えを試してみましたが、解決できません。送信者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();

空の文字列を返します。

18
Anil Kocabiyik

アプリのルートパッケージで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キーを好きな場所に保存し、アプリケーションの他の部分(通常はサーバー上)で使用できます。

49
Amir Uval

アプリケーションが初めて起動する場合は、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ライブラリ用です。

11
EvanBlack

解決策を見つけて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" />
5
Dhaval Jivani

送信者「my_sender_id」のアプリcom.example.ilkgcmを登録しています-このエラーは、「my_sender_id」を12文字のコードである有効な送信者IDに変更していないことを示しています。

2
divanshu

登録から応答がない場合の主な理由の1つは、マニフェストファイルが正しく構成されていないことです。特に、「package_name」(com.xxx.yyyのようなアプリパッケージ名)を正しく指定してください。

1

たとえば、レシーバークラス名は「MyCustomIntentService.Java」です。この名前を「GCMIntentService.Java」に変更して、もう一度試してください。これは簡単な解決策です。 SRC領域でファイル名を変更するだけです。

1
Twinsens