Виртуальные сообщения Google – 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,

Что я делаю не так ?

Solutions Collecting From Web of "Виртуальные сообщения Google – GCM – SERVICE_NOT_AVAILABLE"

Проблема не связана с кодом, а связана с тестовым телефоном. На тестовом телефоне нет SIM-карты, и часы не установлены . Таким образом, Google не может повторно отправить его с неправильным временем.

У меня есть идентификатор регистрации с использованием виртуального устройства Android с помощью google api, а также установка тестовых телефонных часов .

 android:enabled="true" 

Удалить это ^

Если вы еще не добавили это в свой манифест

 <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="8" 

Вам не нужен второй конструктор в GCMIntentService. Только этот

 public GCMIntentService() { super(SENDER_ID); } 

Убедитесь, что ваш SENDER_ID – это число, скопированное из URL-адреса вашего браузера во время просмотра веб-сайта google-кода и просмотра службы GCM.

Помните, что если вы находитесь за корпоративным брандмауэром, некоторые порты, которые использует GCM, не могут быть разрешены для связи по локальной беспроводной сети. У меня была эта проблема, когда я пытался заставить свой эмулятор работать на начальном этапе. Мне пришлось получить специальный IP-адрес, который разрешил перечисленные ниже порты.


Примечание. Если в вашей организации есть межсетевой экран, который ограничивает трафик в Интернете или из Интернета, вам необходимо настроить его, чтобы разрешить подключение к GCM, чтобы ваши устройства Android получали сообщения. Открытые порты: 5228, 5229 и 5230. GCM обычно использует только 5228, но иногда использует 5229 и 5230. GCM не предоставляет определенные IP-адреса, поэтому вы должны разрешить вашему брандмауэру принимать исходящие подключения ко всем IP-адресам, содержащимся В блоках IP, перечисленных в ASN от 15169.

http://developer.android.com/google/gcm/gcm.html

У меня была эта проблема … моим решением было отключить подключение к Интернету и использовать телефонную службу.

У меня была эта проблема, и это было вызвано соединением WIFI. Я выключил WIFI и снова провел тест (на 3g), и он работал. Затем я снова включил WIFI и снова получил ошибку. Вернитесь к 3g, чтобы убедиться, и он снова работал.

Итак, в заключение, проблема была вызвана связью.

У меня была проблема с запуском моего приложения в режиме genymotion. Установка игровых сервисов Google, как это сказано здесь, и все работает нормально.