Я не могу получить регистрационный идентификатор от 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();
он возвращает пустую строку.
Ответы
Ответ 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.