GCMRegistrar.getRegistrationId (this) всегда возвращает пустую строку, даже после успешного вызова для регистрации

Я внедряю GCM – первое, что я делаю, это вызвать GCMRegistrar.getRegistrationId, чтобы узнать, зарегистрировано ли устройство. Это не (пустая строка возвращается), поэтому я делаю асинхронный вызов в GCMRegistrar.register. Как и ожидалось, моя служба намерений (полученная из GCMBaseIntentService) получает свой вызванный метод onRegistered () вместе с токеном, который мой сервер может использовать для отправки сообщений GCM на это устройство. Все идет нормально.

Однако в следующий раз, когда я запустил приложение, я бы ожидал, что сначала вызовет GCMRegistrar.getRegistrationId, чтобы вернуть токен, который я получил в функции onRegistered моей службы. Но я снова получаю пустую строку. Я думал, что клиентская библиотека GCM (gcm.jar) сохранит идентификатор регистрации GCM (токен) в частный объект SharedPreferences – на самом деле, документация для класса GCMRegistrar ( http://developer.android.com/guide/ Google / gcm / client-javadoc / com / google / android / gcm / GCMRegistrar.html ) указывает: «Этот класс использует закрытый объект SharedPreferences для отслеживания маркера регистрации»

Я не зарегистрировал устройство, не удалил приложение или не обновил версию. Любые идеи, что мне не хватает? благодаря

Примечание. Этот вопрос был отправлен в группах google под тегом android-gcm. URL-адрес здесь:

https://groups.google.com/forum/#!topic/android-gcm/4FPqZLzlvE4

Марк Мерфи (Commons Guy) был действительно полезен при первоначальном диагнозе проблемы, но ничего конкретного не всплыло

Update Edit – вот соответствующая часть моего 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" /> 

* "Android: name =" записать полное имя пакета "/>" *

Дайте свой пакет в манифесте, как указано выше.

Убедитесь, что вы вызвали GCMRegistrar.unregister(this); Метод, который вызывается, когда приложение закрыто. Может быть, в onDestroy() ?? В нашем случае это была проблема 🙂

Этот метод фактически не регистрирует устройство из сервисов Google, поэтому он не получает токен, пока вы не откроете приложение и не вызовете действие с регистром.

Пожалуйста, ознакомьтесь с документацией для примера приложения. В манифесте говорится:

  By default, it must be named .GCMIntentService, unless the application uses a custom BroadcastReceiver that redefines its name. 

В манифесте вы используете

 <service android:name=".push.GCMIntentService" /> 

Вы не размещаете эту службу на корневом уровне и не создаете собственный BroadcastReceiver. Это должно быть:

 <service android:name=".GCMIntentService" /> 

У меня была одна и та же проблема, перевод службы в корень моего пакета решил проблему. Это своего рода глупое решение.

Также добавьте разрешение GCM в свой манифест и проверьте ключ google gmc.

Приложение получает сообщения GCM.

Не стоит беспокоиться. Если getRegistrationId возвращает пустую строку, это потому, что иногда требуется время для регистрации в облаке GCM. Вы должны дождаться, когда метод onRegistration будет запущен в классе службы GCMIntent.

Как только он будет зарегистрирован, вы получите идентификатор registrationID, затем вы сможете делать все, что хотите с ним (скорее всего, вам придется отправить его в свою веб-базу данных, вы можете вызвать Async из метода обратного вызова onRegistration).

@Override protected void onRegistered (Контекст arg0, String arg1) {

  //Log.i("Registration", arg1.toString()); // This is where you need to call your server to record the device registration id. } 

Я дважды проверил AndroidManifest, чтобы убедиться, что наш сервис определен правильно, и это было. В итоге я пошел с взломом, который включал в себя запись в общие настройки.

Введите класс обслуживания, полученный из службы GCMIntent в корневом пакете приложения. Я имею в виду, если ваш пакет приложений com.stackoverflow.android, ваш класс обслуживания должен находиться в этом пакете не в одном пакете пакетов вашего проекта приложения. Заверить все необходимые разрешения в файле манифеста