web-dev-qa-db-fra.com

Je ne peux pas obtenir l'ID d'enregistrement de Android GCM

Bien que j'essaie une autre réponse à ce problème, il ne peut pas être résolu. L'identifiant de l'expéditeur est correct, les autorisations sont ajoutées, la clé API est vraie.

J'utilise ce post pour créer le projet: http://developer.Android.com/guide/google/gcm/gs.html#server-app

    GCMRegistrar.checkDevice(this);
    GCMRegistrar.checkManifest(this);
    String regId = GCMRegistrar.getRegistrationId(this);
    if (regId.equals("")) {
      GCMRegistrar.register(this, SENDER_ID);
      regId = GCMRegistrar.getRegistrationId(this);
    } else {
      Log.v(TAG, "Already registered");
    }
    String did = getDeviceID();

il renvoie une chaîne vide.

18
Anil Kocabiyik

Avez-vous GCMIntentService défini correctement dans le package racine de votre application?

<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="my_app_package" />
  </intent-filter>
</receiver>

Assurez-vous que "my_app_package" Est identique au package principal de votre application, sinon votre identifiant renverra une chaîne vide.

Notez également que

    GCMRegistrar.register(this, "...");

est asynchrone. Par conséquent, appeler GCMRegistrar.getRegistrationId(this) immédiatement après n'est pas fiable, vous devez donc l'éviter.

L'identifiant arrivera par rappel de diffusion sur votre GCMIntentService, dans le cadre de la procédure d'enregistrement. à partir de là, vous pouvez ensuite stocker la clé gcm/fcm où vous le souhaitez et l'utiliser dans d'autres parties de l'application (généralement sur le serveur).

49
Amir Uval

Si votre application est lancée pour la première fois, vous devez attendre le rappel OnRegistered sur votre fichier GCMIntentService.Java.

GCMRegistrar.register(this, SENDER_ID);
// Android does NOT wait for registration ends and executes immediately line below
// So your regId will be empty.
regId = GCMRegistrar.getRegistrationId(this);

GCMIntentService.Java:

@Override
protected void onRegistered(Context c, String regId) {
    // You can get it here!
}

Modifier : Une version plus récente de la bibliothèque GCM (fournie avec la bibliothèque des services google play) attend la réponse et renvoie l'ID d'enregistrement. Cette réponse concerne donc les anciennes bibliothèques GCM.

11
EvanBlack

J'ai le même problème après 1 journée de lutte, je trouve une solution. Tout d'abord, je mets mon code associé GCM dans mon package principal et j'apporte des modifications en fonction de mon package dans androidManifest.xml

je vous donne un exemple simple. Le nom de mon projet est GCMExample et j'ai trois packages 1. com.examle.GCMExample (package principal), 2. com.examle.GCMExample.activity (deuxième package), 3. com.example.GCMExample.adapter (troisième package)

Je ne reçois pas d'ID d'enregistrement lorsque mon fichier de classe lié à GCM dans mon deuxième package

Ma classe liée à GCM comme 1. GCMIntentService, 2. ServerUtilities, 3. CommonUtilities 4. WakeLocker placé dans mon package principal com.example.GCMExample

aussi mon androidManifest.xml

     <uses-permission Android:name="Android.permission.INTERNET" />
     <uses-permission Android:name="Android.permission.GET_ACCOUNTS" />
     <uses-permission Android:name="Android.permission.WAKE_LOCK" />
     <uses-permission Android:name="Android.permission.VIBRATE" />

     <permission Android:name="com.example.GCMExample.permission.C2D_MESSAGE"
        Android:protectionLevel="signature" />

     <uses-permission Android:name="com.example.GCMExample.C2D_MESSAGE" />

    <uses-permission Android:name="com.google.Android.c2dm.permission.RECEIVE" />
<receiver
        Android:name="com.google.Android.gcm.GCMBroadcastReceiver"
        Android:permission="com.google.Android.c2dm.permission.SEND" >
        <intent-filter>
        <!-- Receives the actual messages. -->
        <action Android:name="com.google.Android.c2dm.intent.RECEIVE" />
        <!-- Receives the registration id. -->
        <action Android:name="com.google.Android.c2dm.intent.REGISTRATION" />

        <category Android:name="com.example.GCMExample" />
      </intent-filter>
</receiver>  

<service Android:name="com.example.GCMExample.GCMIntentService" />
5
Dhaval Jivani

Enregistrement de l'application com.example.ilkgcm d'expéditeurs "my_sender_id" - Cette erreur suggère que vous n'avez pas changé votre 'my_sender_id' en un identifiant d'expéditeur valide qui serait un code à 12 lettres.

2
divanshu

Si vous n'obtenez pas de réponse de l'enregistrement. L'une des principales raisons est que votre fichier manifeste n'est pas configuré correctement ... donnez en particulier le "nom_package" (le nom de votre package d'application comme com.xxx.yyy) dans le et correctement.

1
Vinoth Prakash K

Par exemple, le nom de votre classe de récepteur est: "MyCustomIntentService.Java", changez simplement ce nom en "GCMIntentService.Java", puis réessayez. C'est une solution simple. Modifiez simplement le nom de votre fichier dans la zone SRC.

1
Twinsens