Erreur d'Android GCM. Les retours de serveur ne sont pas enregistrés lorsque le client est inscrit

J'ai suivi la démo donnée à http://developer.android.com/google/gcm/gs.html et j'ai obtenu une application d'essai, GCMTrial pour fonctionner correctement.

Mais, j'ai essayé de suivre les mêmes étapes sur une application existante, mais cela ne fonctionnait pas. J'ai donc fait un projet entièrement nouveau. Mais même alors, en suivant les mêmes étapes exactes, je ne pouvais pas obtenir GCM pour envoyer un message avec succès. J'ai donc essayé de renommer GCMTrial au nom requis, et cela ne fonctionne pas non plus.

  • CharSequence à int
  • Android: propagez l'état parent vers une vue enfant
  • Comment obtenir un bitmap à l'échelle de ImageView
  • Navigateur d'inventaire Android ne respectant pas le dépassement CSS
  • Impossible de résoudre com.android.tools.build:gradle:0.5.+
  • Comment garder un service en cours d'exécution même si l'utilisateur quitte l'application?
  • Je m'inscris pour GCM via l'activité principale et obtenez le journal suivant:

    12-19 21:30:13.102: V/GCMRegistrar(15889): Registering receiver 12-19 21:30:13.112: D/GCMBaseIntentService(15889): handleRegistration: registrationId = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, error = null, unregistered = null 12-19 21:30:13.112: D/GCMRegistrar(15889): resetting backoff for com.XXX.XXX 12-19 21:30:13.117: V/GCMRegistrar(15889): Saving regId on app version 1 

    Mais lorsque j'essaie d'envoyer un message GCM, il renvoie l'erreur suivante

     [ errorCode=NotRegistered ] 

    Code client:

     public class MainActivity extends Activity { TextView tve; String TAG = "GCMTrial"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); GCMRegistrar.checkDevice(this); GCMRegistrar.checkManifest(this); final String regId = GCMRegistrar.getRegistrationId(this); if (regId.equals("")) { GCMRegistrar.register(this, "XXXXXX"); Log.v(TAG, "Reg"); } else { Log.v(TAG, "Already registered"); } } GCMIntentService : public class GCMIntentService extends GCMBaseIntentService { @Override protected void onError(Context arg0, String arg1) { // TODO Auto-generated method stub } @Override protected void onMessage(Context arg0, Intent arg1) { // TODO Auto-generated method stub Log.d("GCM", "RECIEVED A MESSAGE"); // Get the data from intent and send to notificaion bar } @Override protected void onRegistered(Context arg0, String arg1) { // TODO Auto-generated method stub } @Override protected void onUnregistered(Context arg0, String arg1) { // TODO Auto-generated method stub } 

    }

    Manifeste:

    Code du serveur:

     System.out.println("Sending GCM"); String key = "XXX"; //Server API key taken from the site clientID = "XXXXXXXXX"; // copied from the logs Sender sender = new Sender(key); Message message = new Message.Builder().build(); Result result = sender.send(message, clientID, 1); System.out.println(result.toString()); 

    Cela me rend fou … Il s'affiche comme enregistré dans le téléphone Android, même s'il appelle la méthode OnRegistered de la classe GCMIntentService … mais quand j'essaie d'envoyer un message, il marque une "erreur non enregistrée" … Je ne sais pas quoi Je fais mal … aide-moi les gars …

  • Le tiroir de navigation et le téléavertisseur dans la même activité
  • Impossible de mettre à jour ADT à partir de 22.3.0. À 22.6.1, aucune mise à jour n'a été trouvée
  • Android Fragment et getWindow ()
  • Picasso image loading issue dans GoogleMap.InfoWindowAdapter
  • AsyncTask fils ne meurt jamais
  • GetActionBar (). SetDisplayHomeAsUpEnabled (true) lance NullPointerException
  • 3 Solutions collect form web for “Erreur d'Android GCM. Les retours de serveur ne sont pas enregistrés lorsque le client est inscrit”

    Bien, savez que c'est un bug courant lors de l'installation avec AdB.

    GCMRegistrar ne sait pas si l'appareil n'est pas enregistré sur le serveur GCM et ne vous inscrivez pas.

    Ce que vous pouvez faire, c'est de vous inscrire de toute façon:

     if (regId.equals("")) { GCMRegistrar.register(this, "XXXXXX"); Log.v(TAG, "Reg"); } else { //I SAY BULLSHIT ! GCMRegistrar.register(this, "XXXXXX"); Log.v(TAG, "Reg"); } 

    Ou désinstallez l'application sur le client puis exécutez une nouvelle installation depuis Adb.

    Gardez à l'esprit qu'il y a peu de chances qu'il se produise dans la production.

    Vous avez oublié d'ajouter le constructeur dans votre GCMIntentService

    Ajoutez ce qui suit à votre GCMIntentService

     public GCMIntentService(){ super(SENDER_ID); } 

    SENDER_ID est le XXXXXXX utilisé pour enregistrer votre application.

    Vous pouvez essayer de remplacer le contexte «ceci» par «getApplicationContext ()» pour utiliser le contexte de l'application. Voici mon exemple de code:

     private void registerGCM() { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) { //prevent crash caused by no google account or not support for gcm try { GCMRegistrar.checkDevice(this); } catch (Exception e) { Log.i("test", "!!!cgm " + e.toString()); return; } } final String regId = GCMRegistrar.getRegistrationId(this); if (TextUtils.isEmpty(regId)) { String gcmSenderId = PreferencesUtil.getStringPreference(PreferencesUtil.SETTING_GCM_SENDER_ID, "", getApplicationContext()); GCMRegistrar.register(getApplicationContext(), gcmSenderId); } mGCMRegisted = true; } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.