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

Хотя я пытаюсь ответить на другой вопрос об этой проблеме, ее нельзя решить. ID отправителя правильный, разрешения добавлены, ключ 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();

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


person Anil Kocabiyik    schedule 29.07.2012    source источник
comment
Расскажите подробнее о вашей проблеме. Что вернуло пустую строку? Каким был вывод logcat после вызова GCMRegistrar.register?   -  person azgolfer    schedule 30.07.2012
comment
спасибо @azgolfer, это решено, но теперь я не могу отправить regid и идентификатор устройства на сервлет, они кажутся нулевыми в сервлете. У вас есть какой-нибудь кодекс по этому поводу.   -  person Anil Kocabiyik    schedule 30.07.2012
comment
Я использовал первый ответ здесь: stackoverflow.com/ questions / 3505930 / Я использую расширенную AsyncTask.   -  person Anil Kocabiyik    schedule 30.07.2012
comment
Выход @azgolfer logcat 08-03 09: 24: 21.974: V / GCMRegistrar (14590): Регистрация приемника 08-03 09: 24: 21.974: D / GCMRegistrar (14590): сброс отсрочки для com.example.ilkgcm 08-03 09 : 24: 21.984: V / GCMRegistrar (14590): Регистрация приложения com.example.ilkgcm отправителей my_sender_id 08-03 09: 24: 36.248: A / libc (14590): Фатальный сигнал 6 (SIGABRT) по адресу 0x0000012f (код = 0 )   -  person Anil Kocabiyik    schedule 03.08.2012
comment
когда вызывается GCMRegistrar.register, вывод logcat, как указано выше. Фатальный сигнал появляется через 10-15 секунд.   -  person Anil Kocabiyik    schedule 03.08.2012
comment
@ user1451549 Если на ваш вопрос был дан ответ, вы должны принять ответ ...   -  person Amir Uval    schedule 21.09.2012


Ответы (6)


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" идентичен основному пакету вашего приложения, иначе ваш идентификатор вернет пустую строку.

Также обратите внимание, что

    GCMRegistrar.register(this, "...");

асинхронный. Следовательно, вызов GCMRegistrar.getRegistrationId(this) сразу после этого ненадежен, поэтому вам следует избегать этого.

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

person Amir Uval    schedule 31.07.2012
comment
для обратного звонка? Это происходит сразу же. Это связано с взаимодействием с системным процессом, и оттуда исходит обратный вызов. Если вы ждете, а он не приходит, значит, в вашей настройке что-то не так. - person Amir Uval; 02.08.2012
comment
нужно ли помещать класс в корневой пакет? - person stinepike; 24.06.2013
comment
Похоже, что да, хотя это не задокументировано. Моя первая попытка с GCM не была в пакете по умолчанию, и она не удалась. Сработало при перемещении в root. - person Amir Uval; 24.06.2013
comment
Это очень помогает .. Спасибо :) - person Umer Abid; 08.11.2013
comment
Спасибо, это очень помогло. Это не задокументировано, но, согласно вашему предложению, класс GCM должен находиться в корневом пакете. - person surhidamatya; 25.11.2013

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

person EvanBlack    schedule 15.02.2013
comment
Спасибо ... Точно в первый раз, когда я не получил regId, он пуст, и после того, как снова ланч в этих приложениях, мы получим regID, но следующие шаги следуют, тогда я буду в первый раз обедать приложения и получить этот токен gcm .. !!! :) - person NAP Developer; 28.04.2014

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

Приведу простой пример. Мой проект называется GCMExample, и у меня есть пакет Three 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

также мой 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" />
person Dhaval Jivani    schedule 20.02.2014
comment
Патель Дхавал, ваш волшебный ответ спасет меня, но это очень странно :) Спасибо за вашу огромную помощь! (Пальцы вверх) - person Saad Bilal; 24.12.2014

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

person divanshu    schedule 02.10.2012

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

person Vinoth Prakash K    schedule 28.06.2013

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

person Twinsens    schedule 28.07.2013