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

Я не могу получить регистрационный идентификатор от Android GCM

Хотя я пробую другой ответ об этой проблеме, он не может быть решен. Идентификатор отправителя верен, добавлены разрешения, ключ API верен.

Я использую этот пост для создания проекта: 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();

он возвращает пустую строку.

4b9b3361

Ответ 1

У вас 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) сразу же после этого не является надежным, поэтому вы должны его избегать.

Идентификатор будет поступать через обратный вызов через широковещательную рассылку на ваш GCMIntentService, как часть процедуры регистрации. оттуда вы можете хранить ключ gcm в любом месте, где хотите, и использовать его в других частях приложения (обычно на сервере).

Ответ 2

Если ваше приложение запускается в первый раз, вам придется ждать обратного вызова OnRegistered в файле GCMIntentService.java.

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) ждет ответа и возвращает идентификатор регистрации. Таким образом, этот ответ предназначен для старых библиотек GCM.

Ответ 3

У меня такая же проблема после 1 дня борьбы Я нахожу решение. Сначала поставьте свой код GCM в мой основной пакет и внесите изменения в соответствии с My Package в androidManifest.xml

Я даю вам простой пример. Мое имя проекта - GCMExample, и у меня есть три пакета 1. com.examle.GCMExample(Основной пакет), 2. com.examle.GCMExample.activity(Второй пакет), 3. com.example.GCMExample.adapter(Третий пакет)

Я не получаю регистрационный идентификатор, когда мой файл класса GCM, связанный с моим вторым пакетом

Мой GCM Связанный класс, например 1. GCMIntentService, 2. ServerUtilities, 3. CommonUtilities 4. WakeLocker помещается в мой основной пакет com.example.GCMExample

также my 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" />

Ответ 4

Регистрация app com.example.ilkgcm отправителей "my_sender_id" - эта ошибка предполагает, что вы не изменили свой "my_sender_id" на действительный идентификатор отправителя, который был бы 12-буквенным кодом.

Ответ 5

Если вы не получаете ответа от регистрации. Одна из основных причин заключается в том, что ваш файл манифеста настроен неправильно... особенно укажите "имя_пакета" (ваше имя пакета приложения, такое как com.xxx.yyy) в правильно.

Ответ 6

Например, имя вашего получателя: "MyCustomIntentService.java", просто измените это имя как "GCMIntentService.java", затем повторите попытку. Это простое решение. Просто измените имя файла в области SRC.