Google Cloud Messaging - GCM - SERVICE_NOT_AVAILABLE
Я пытаюсь, чтобы внедрить новый GCM, я следую за Google:
http://developer.android.com/guide/google/gcm/gs.html
Я застреваю при получении идентификатора регистрации устройства!
Мое приложение продолжает пытаться подключиться к серверу Google. Здесь мои журналы ошибок:
onReceive: com.google.android.gcm.intent.RETRY
GCM IntentService class: com.dombox.app.GCMIntentService
Acquiring wakelock
[GCMIntentService] start
Registering app com.dombox.app of senders _my_sender_id_
Releasing wakelock
onReceive: com.google.android.c2dm.intent.REGISTRATION
GCM IntentService class: com.dombox.app.GCMIntentService
Acquiring wakelock
[GCMIntentService] start
handleRegistration: registrationId = null, error = SERVICE_NOT_AVAILABLE, unregistered = null
Registration error: SERVICE_NOT_AVAILABLE
Scheduling registration retry, backoff = 912617 (768000)
Releasing wakelock
Вот мой код активности, запрашивающий идентификатор:
try{
Log.i(TAG, "[checkNotifRegistration] checkDevice");
GCMRegistrar.checkDevice(this);
Log.i(TAG, "[checkNotifRegistration] checkManifest");
GCMRegistrar.checkManifest(this);
if (GCMRegistrar.isRegistered(this)) {
Log.i(TAG, "[checkNotifRegistration] reg id : "+GCMRegistrar.getRegistrationId(this));
}
final String regId = GCMRegistrar.getRegistrationId(this);
if (regId.equals("")) {
// SENDER_ID is my project id into google account url
GCMRegistrar.register(this, SENDER_ID);
Log.i(TAG, "[checkNotifRegistration] reg id : "+GCMRegistrar.getRegistrationId(this));
} else {
Log.i(TAG, "[checkNotifRegistration] already registered as : " + regId);
}
} catch(Exception e){
Log.e(TAG, "[checkNotifRegistration] Exception : "+e.getMessage());
e.printStackTrace();
}
Здесь мой код обслуживания
public class GCMIntentService extends GCMBaseIntentService {
private static final String TAG = "GCMIntentService";
public GCMIntentService() {
super(SENDER_ID);
// SENDER_ID is my project id into google account url
// TODO Auto-generated constructor stub
Log.d(TAG, "[GCMIntentService] start");
}
public GCMIntentService(String senderId) {
super(senderId);
// TODO Auto-generated constructor stub
Log.d(TAG, "[GCMIntentService] start - sender Id : "+senderId);
}
}
И вот мой манифест Android:
<permission android:name="com.dombox.app.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="com.dombox.app.permission.C2D_MESSAGE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<application
android:icon="@drawable/icon"
android:label="@string/app_name" >
<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="com.myapp.app" />
</intent-filter>
</receiver>
<service android:name=".GCMIntentService" android:enabled="true"/>
<activity
android:name=".activity.Myapp"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Я следую инструкции Google, но я застрял с этой ошибкой SERVICE_NOT_AVAILABLE,
Что я делаю неправильно?
Ответы
Ответ 1
Проблема не связана с кодом, а связана с тестовым телефоном.
В тестовом телефоне нет SIM-карты, и часы не установлены. Таким образом, Google не может повторно отправить его с неправильным временем.
Мне удалось зарегистрировать идентификатор с помощью виртуального устройства Android с помощью google api и установить часы тестовых телефонов.
Ответ 2
android:enabled="true"
Удалите это ^
Если вы еще не добавили это в свой манифест
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="8"
Вам не нужен второй конструктор в GCMIntentService. только этот
public GCMIntentService() {
super(SENDER_ID); }
Убедитесь, что ваш SENDER_ID - это номер, скопированный из URL-адреса вашего браузера во время просмотра веб-сайта кода Google и просмотра службы GCM.
Ответ 3
Помните, что если вы находитесь за корпоративным брандмауэром, некоторые порты, которые использует GCM, не могут быть разрешены для связи по локальной беспроводной сети. У меня была эта проблема, когда я пытался заставить свой эмулятор работать на начальном этапе. Я должен был получить специальный IP-адрес, который разрешил перечисленные ниже порты.
Примечание. Если ваша организация имеет брандмауэр, который ограничивает трафик в Интернет или из Интернета, вам необходимо настроить его, чтобы разрешить подключение к GCM, чтобы ваши устройства Android могли получать Сообщения. Открытые порты: 5228, 5229 и 5230. Обычно GCM использует только 5228, но иногда использует 5229 и 5230. GCM не предоставлять определенные IP-адреса, поэтому вы должны разрешить брандмауэру принимать исходящие соединения со всеми IP-адресами, содержащимися в IP-блоках перечисленных в Google ASN 15169.
http://developer.android.com/google/gcm/gcm.html
Ответ 4
У меня была эта проблема... моим решением было отключить интернет-соединение и использовать телефонную службу.
Ответ 5
У меня была эта проблема, и это было вызвано соединением WIFI. Я выключил WIFI и снова провел тест (на 3g), и он работал. Затем я снова включил WIFI и снова получил ошибку. Вернитесь к 3g, чтобы убедиться, и он снова работал.
Итак, в заключение проблема была вызвана соединением.
Ответ 6
У меня возникла проблема с запуском моего приложения в genymotion. Установка игровых сервисов Google, таких как здесь, и все работает нормально.