Google Cloud Messaging - GCM - SERVICE_NOT_AVAILABLE

Я пытаюсь реализовать новый GCM, я следую заявлению Google: http://developer.android.com/guide/google/gcm/gs.html

Я застреваю при получении регистрационного ID моего устройства!

Мое приложение продолжает пытаться соединиться с сервером 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,

Что я делаю неправильно?

6 ответов

Решение

Проблема была не в коде, а в ссылке на тестовый телефон.Тестовый телефон не имеет 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 Code и просматриваете службу GCM.

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


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

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

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

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

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

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

Другие вопросы по тегам