web-dev-qa-db-fra.com

Comment obtenir RegistrationID en utilisant GCM dans android

J'essaie de faire une notification push dans Android utilisant GCM. J'ai lu les documents Google pour GCM et leur application de démonstration. J'ai créé le programme côté client mentionné ici http://Android.amolgupta.in/. Mais je ne reçois pas d'ID d'enregistrement. De plus, je ne reçois pas de points comme:

  1. dois-je aussi programmer le serveur avec ce
  2. sur l'application de démonstration Google, ils mentionnent que je dois changer la clé api à "samples/gcm-demo-server/WebContent/WEB-INF/classes/api.key" est-il nécessaire de le faire à chaque fois que je crée un nouveau projet

Quelqu'un peut-il me fournir un projet approprié autre que Google fourni pour que j'efface mes concepts.

Toute aide serait appréciée.

23
Neha

Ici, j'ai écrit quelques étapes pour savoir comment obtenir RegID et notification à partir de zéro

  1. Créer/enregistrer une application sur Google Cloud
  2. Configurer le SDK Cloud avec le développement
  3. Configurer le projet pour GCM
  4. Obtenir l'ID d'enregistrement de l'appareil
  5. Envoyer des notifications push
  6. Recevoir des notifications push

Vous pouvez trouver un tutoriel complet ici:

Mise en route avec Android Notification push: dernière messagerie Google Cloud (GCM) - tutoriel complet étape par étape

enter image description here

Extrait de code pour obtenir l'ID d'enregistrement (jeton d'appareil pour la notification push).

Configurer le projet pour GCM


Mettre à jour le fichier AndroidManifest

Pour activer GCM dans notre projet, nous devons ajouter quelques autorisations à notre fichier manifeste. Aller à AndroidManifest.xml et ajoutez ce code: Ajouter des autorisations

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

<uses-permission Android:name=“.permission.RECEIVE" />
<uses-permission Android:name=“<your_package_name_here>.permission.C2D_MESSAGE" />
<permission Android:name=“<your_package_name_here>.permission.C2D_MESSAGE"
        Android:protectionLevel="signature" />

Ajoutez la déclaration GCM Broadcast Receiver dans votre balise d'application:

<application
        <receiver
            Android:name=".GcmBroadcastReceiver"
            Android:permission="com.google.Android.c2dm.permission.SEND" ]]>
            <intent-filter]]>
                <action Android:name="com.google.Android.c2dm.intent.RECEIVE" />
                <category Android:name="" />
            </intent-filter]]>

        </receiver]]>

<application/>

Ajouter une déclaration de service GCM

<application
     <service Android:name=".GcmIntentService" />
<application/>

Obtenir l'ID d'enregistrement (jeton d'appareil pour la notification push)

Maintenant, allez à votre activité de lancement/Splash

Ajouter des constantes et des variables de classe

private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;
public static final String EXTRA_MESSAGE = "message";
public static final String PROPERTY_REG_ID = "registration_id";
private static final String PROPERTY_APP_VERSION = "appVersion";
private final static String TAG = "LaunchActivity";
protected String SENDER_ID = "Your_sender_id";
private GoogleCloudMessaging gcm =null;
private String regid = null;
private Context context= null;

Mettre à jour les méthodes OnCreate et OnResume

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_launch);
    context = getApplicationContext();
    if (checkPlayServices()) {
        gcm = GoogleCloudMessaging.getInstance(this);
        regid = getRegistrationId(context);

        if (regid.isEmpty()) {
            registerInBackground();
        } else {
            Log.d(TAG, "No valid Google Play Services APK found.");
        }
    }
}

@Override
protected void onResume() {
    super.onResume();
    checkPlayServices();
}


// # Implement GCM Required methods(Add below methods in LaunchActivity)

private boolean checkPlayServices() {
    int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
    if (resultCode != ConnectionResult.SUCCESS) {
        if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) {
            GooglePlayServicesUtil.getErrorDialog(resultCode, this,
                PLAY_SERVICES_RESOLUTION_REQUEST).show();
        } else {
            Log.d(TAG, "This device is not supported - Google Play Services.");
            finish();
        }
        return false;
    }
    return true;
}

private String getRegistrationId(Context context) {
    final SharedPreferences prefs = getGCMPreferences(context);
    String registrationId = prefs.getString(PROPERTY_REG_ID, "");
    if (registrationId.isEmpty()) {
        Log.d(TAG, "Registration ID not found.");
        return "";
    }
    int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE);
    int currentVersion = getAppVersion(context);
    if (registeredVersion != currentVersion) {
        Log.d(TAG, "App version changed.");
        return "";
    }
    return registrationId;
}

private SharedPreferences getGCMPreferences(Context context) {
    return getSharedPreferences(LaunchActivity.class.getSimpleName(),
        Context.MODE_PRIVATE);
}

private static int getAppVersion(Context context) {
    try {
        PackageInfo packageInfo = context.getPackageManager()
            .getPackageInfo(context.getPackageName(), 0);
        return packageInfo.versionCode;
    } catch (NameNotFoundException e) {
        throw new RuntimeException("Could not get package name: " + e);
    }
}


private void registerInBackground() {
    new AsyncTask() {
        @Override
        protected Object doInBackground(Object...params) {
            String msg = "";
            try {
                if (gcm == null) {
                    gcm = GoogleCloudMessaging.getInstance(context);
                }
                regid = gcm.register(SENDER_ID);
                Log.d(TAG, "########################################");
                Log.d(TAG, "Current Device's Registration ID is: " + msg);
            } catch (IOException ex) {
                msg = "Error :" + ex.getMessage();
            }
            return null;
        }
        protected void onPostExecute(Object result) {
            //to do here
        };
    }.execute(null, null, null);
}

Remarque : veuillez stocker REGISTRATION_KEY, il est important d'envoyer un message PN à GCM. Gardez également à l'esprit: cette clé sera unique pour tous les appareils et GCM enverra des notifications push par REGISTRATION_KEY seulement.

22
swiftBoy

En réponse à votre première question: Oui, vous devez exécuter une application serveur pour envoyer les messages, ainsi qu'une application client pour les recevoir.

En réponse à votre deuxième question: Oui, chaque application a besoin de sa propre clé API. Cette clé est destinée à votre application serveur, pas au client.

5
Sparky

Utilisez ce code pour obtenir l'ID d'enregistrement à l'aide de GCM

String regId = "", msg = "";

public void getRegisterationID() {

    new AsyncTask() {
        @Override
        protected Object doInBackground(Object...params) {

            String msg = "";
            try {
                if (gcm == null) {
                    gcm = GoogleCloudMessaging.getInstance(Login.this);
                }
                regId = gcm.register(YOUR_SENDER_ID);
                Log.d("in async task", regId);

                // try
                msg = "Device registered, registration ID=" + regId;

            } catch (IOException ex) {
                msg = "Error :" + ex.getMessage();
            }
            return msg;
        }
    }.execute(null, null, null);
 }

et n'oubliez pas d'écrire des autorisations dans le manifeste ...
J'espère que ça aide!

4
Gagan Deep