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

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

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

Однако, в следующий раз, когда я запустил приложение, я бы ожидал, что сначала вызовет GCMRegistrar.getRegistrationId, чтобы вернуть токен, который я получил в своем сервисе намерения в функцииRegistered. Но я снова получаю пустую строку. Я думал, что клиентская библиотека 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" />
4b9b3361

Ответ 1

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

Ответ 2

* "категория android: name=" запишите полное имя пакета "/" > " *

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

Ответ 3

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

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

Ответ 4

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

      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" />

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

Ответ 5

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

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

Ответ 6

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

Как только он будет зарегистрирован, вы получите идентификатор 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.
}

Ответ 7

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