web-dev-qa-db-fra.com

Google Cloud Messaging - GCM - SERVICE_NOT_AVAILABLE

J'essaie, pour implémenter le nouveau GCM, je suis Google obtenir déclaré : http://developer.Android.com/guide /google/gcm/gs.html

Je n'arrive pas à obtenir mon ID d'enregistrement de l'appareil!

Mon application continue d'essayer de se connecter au serveur Google, voici mes journaux d'erreurs:

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

Voici mon code d'activité, demandant un identifiant:

    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();
    }

Voici mon code de service

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);
}
}

Et voici mon Android Manifest:

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

Je suis les instructions de Google, mais je suis bloqué avec cette erreur SERVICE_NOT_AVAILABLE,

Qu'est-ce que je fais mal ?

23
Thomas Besnehard

Le problème n'était pas lié au code, mais lié au téléphone de test. Le téléphone de test n'a pas de carte SIM et l'horloge n'a pas été réglée. Google ne peut donc pas le réenregistrer avec un mauvais moment.

Je parviens à avoir un identifiant d'enregistrement en utilisant un Android Virtual Device, avec google api, et en réglage de l'horloge du téléphone de test.

39
Thomas Besnehard
Android:enabled="true"  

Supprimer ceci ^

Si vous ne l'ajoutez pas déjà à votre manifeste

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

Vous n'avez pas besoin du deuxième constructeur dans GCMIntentService. seulement celui ci

public GCMIntentService() {         
 super(SENDER_ID);  }

Assurez-vous que votre SENDER_ID est le numéro copié hors de l'URL de votre navigateur pendant que vous naviguez sur le site Web de code Google ET que vous naviguez sur le service GCM.

7
Ryan Gray

N'oubliez pas que si vous êtes derrière un pare-feu d'entreprise, certains ports utilisés par GCM peuvent ne pas être autorisés à communiquer via le réseau sans fil local. J'ai eu ce problème en essayant de faire fonctionner mon émulateur au départ. Je devais obtenir une adresse IP spéciale qui permettait aux ports listés ci-dessous de passer.


Remarque: Si votre organisation dispose d'un pare-feu qui limite le trafic vers ou depuis Internet, vous devez le configurer pour autoriser la connectivité avec GCM afin que vos appareils Android) reçoivent des messages. Les ports vers ouverts sont: 5228, 5229 et 5230. GCM n'utilise généralement que 5228, mais il utilise parfois 5229 et 5230. GCM ne fournit pas d'adresses IP spécifiques, vous devez donc autoriser votre pare-feu à accepter les connexions sortantes à toutes les adresses IP contenues dans l'IP blocs répertoriés dans l'ASN de Google de 15169.

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

3
Daniel

J'ai eu ce problème et il a été causé par la connexion WIFI. J'ai désactivé le WIFI et j'ai refait le test (sur 3g) et cela a fonctionné. Ensuite, j'ai rallumé le WIFI et j'ai de nouveau eu l'erreur. Revenons à la 3g, pour être sûr, et cela a fonctionné à nouveau.

Donc, en conclusion, le problème a été causé par la connexion.

2
Vinícius Barbosa

J'ai eu ce problème en exécutant mon application sur genymotion. Installer les services google play comme il le dit ici et tout a bien fonctionné.

1
kelvincer