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 ?
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.
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.
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.
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.
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é.