web-dev-qa-db-fra.com

Comment ajouter une notification Push dans ma propre application Android

J'ai développé une application de notification Push dans Android à partir de ce tutoriel: Notification Push dans Android app . Le bouton d'enregistrement s'affiche lorsque j'exécute l'application Lorsque je clique sur le bouton d'enregistrement et lorsque l'enregistrement est réussi, une notification s'affiche sur mon appareil.

Comment puis-je l'inclure dans ma propre application? Mon application possède une application d'exemple d'analyse XML. Ici, lorsqu'un nouvel article est ajouté, je souhaite afficher (la nouvelle commande s'affiche) un message de notification sur l'appareil. Il est généré automatiquement ici.

16
user1676640

Je publie une application de démonstration de Google Cloud Messaging .

Assurez-vous de créer une application de démonstration avec un niveau d'API égal ou supérieur à Android OS 2.2 avec Google API

L'utilisateur doit se connecter à au moins un compte Google pour utiliser ce service.

Vous devez d'abord ajouter bibliothèque GCM .

Ensuite, créez sur la classe que j'ai nommée GCMIntentService qui étend GCMBaseIntentService comme suit:

package com.example.gcmdemo;

import Android.content.Context;
import Android.content.Intent;
import Android.util.Log;

import com.google.Android.gcm.GCMBaseIntentService;
import com.google.Android.gcm.GCMConstants;

public class GCMIntentService extends GCMBaseIntentService {

     private static final String TAG = "Push Notification Demo GCMIntentService";

    @Override
    protected void onError(Context context, String errorId) {

        if(GCMConstants.ERROR_ACCOUNT_MISSING.equalsIgnoreCase(errorId)) {
            Log.v(TAG, "Error Account Missing");
        } else if(GCMConstants.ERROR_AUTHENTICATION_FAILED.equalsIgnoreCase(errorId)) {
            Log.v(TAG, "Error Authentication Failed");
        } else if(GCMConstants.ERROR_INVALID_PARAMETERS.equalsIgnoreCase(errorId)) {
            Log.v(TAG, "Error Invalid Parameters");
        } else if(GCMConstants.ERROR_INVALID_SENDER.equalsIgnoreCase(errorId)) {
            Log.v(TAG, "Error Invalid Sender");
        } else if(GCMConstants.ERROR_PHONE_REGISTRATION_ERROR.equalsIgnoreCase(errorId)) {
            Log.v(TAG, "Error Phone Registration Error");
        } else if(GCMConstants.ERROR_SERVICE_NOT_AVAILABLE.equalsIgnoreCase(errorId)) {
            Log.v(TAG, "Error Service Not Available");
        } 
    }

    @Override
    protected void onMessage(Context context, Intent intent) {

        // App Server Sends message as key value pairs 
        String value1 = intent.getStringExtra("key1");
        String value2 = intent.getStringExtra("key2");

        Log.v(TAG, "key1: "+value1 );
        Log.v(TAG, "key2: "+value2 );
    }

    @Override
    protected void onRegistered(Context context, String regId) {

        Log.v(TAG, "Successfull Registration : "+regId);
    }

    @Override
    protected void onUnregistered(Context context, String regId) {

        Log.v(TAG, "Successfully Unregistred : "+regId);
    }

    @Override
    protected String[] getSenderIds(Context context) {
        return super.getSenderIds(context);
    }

    @Override
    protected void onDeletedMessages(Context context, int total) {
        super.onDeletedMessages(context, total);
    }

    @Override
    protected boolean onRecoverableError(Context context, String errorId) {
        return super.onRecoverableError(context, errorId);
    }
}

Voici comment vérifier l'inscription dans l'activité de démonstration suivante:

package com.example.gcmdemo;

import Android.app.Activity;
import Android.os.Bundle;
import Android.util.Log;
import Android.view.Menu;

import com.google.Android.gcm.GCMRegistrar;

public class MainActivity extends Activity {

    private static final String TAG = "Push Notification Demo Activity";
    private static final String SENDER_ID = "1069713227710";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

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

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

Et enfin le manifeste de démonstration:

<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.example.gcmdemo"
    Android:versionCode="1"
    Android:versionName="1.0" >

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

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

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

    <!-- App receives GCM messages. -->
    <uses-permission Android:name="com.google.Android.c2dm.permission.RECEIVE" />
    <!-- GCM connects to Google Services. -->
    <uses-permission Android:name="Android.permission.INTERNET" />
    <!-- GCM requires a Google account. -->
    <uses-permission Android:name="Android.permission.GET_ACCOUNTS" />
    <!-- Keeps the processor from sleeping when a message is received. -->
    <uses-permission Android:name="Android.permission.WAKE_LOCK" />

    <application
        Android:icon="@drawable/ic_launcher"
        Android:label="@string/app_name"
        Android:theme="@style/AppTheme" >
        <activity
            Android:name=".MainActivity"
            Android:label="@string/title_activity_main" >
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />

                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <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.example.gcmdemo" />
            </intent-filter>
        </receiver>

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

</manifest>

Vous aurez également besoin de script côté serveur tiers tel que spécifié ici .

17
Vaibhav Jani

Envoi d'une notification push à l'aide de FCM

Google a déconseillé Google Cloud Messaging (GCM) et a lancé un nouveau serveur de notification Push qui est Firebase Cloud Messaging (FCM). FCM est identique à GCM, FCM est également une solution de messagerie multiplateforme pour les plates-formes mobiles

La messagerie Firebase Cloud peut envoyer trois types de messages ( types de messages )

1.Message de notification

2.Message de données

3. message avec notification et données

Messagerie cloud Firebase Étapes d'intégration: -

1. Configurer un nouveau projet ou un projet d'importation dans la console Firbase (https://firebase.google.com/)

2.Ajoutez le même nom de package d'application dans l'application Firebase.

3.Obtenez le fichier "google-services.json" et placez-le dans le dossier d'application de votre projet.Ce fichier contient toutes les URL et les clés des services Google, alors ne modifiez pas ou ne modifiez pas ce fichier.

4.Ajoutez de nouvelles dépendances Gradle dans Project for Firebase.

//app/build.gradle
dependencies {
  compile 'com.google.firebase:firebase-messaging:9.6.0'
}

apply plugin: 'com.google.gms.google-services'

5.Créez une classe qui contient toutes les valeurs constantes que nous utilisons dans l'application pour FCM.

public class Config {
 public static final String TOPIC_GLOBAL = "global";
 // broadcast receiver intent filters
public static final String REGISTRATION_COMPLETE = "registrationComplete";
public static final String Push_NOTIFICATION = "pushNotification";

// id to handle the notification in the notification tray
public static final int NOTIFICATION_ID = 100;
public static final int NOTIFICATION_ID_BIG_IMAGE = 101;
public static final String SHARED_PREF = "ah_firebase";
 }

6. Créez une classe nommée MyFirebaseInstanceIDService.Java qui recevra l'ID d'enregistrement Firebase qui sera unique à chaque application. L'ID d'enregistrement est utilisé pour envoyer un message à un seul appareil.

    public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {
    private static final String TAG = MyFirebaseInstanceIDService.class.getSimpleName();

    @Override
    public void onTokenRefresh() {
        super.onTokenRefresh();
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();

        // Saving reg id to shared preferences
        storeRegIdInPref(refreshedToken);

        // sending reg id to your server
        sendRegistrationToServer(refreshedToken);

        // Notify UI that registration has completed, so the progress indicator can be hidden.
        Intent registrationComplete = new Intent(Config.REGISTRATION_COMPLETE);
        registrationComplete.putExtra("token", refreshedToken);
        LocalBroadcastManager.getInstance(this).sendBroadcast(registrationComplete);
    }

    private void sendRegistrationToServer(final String token) {
        // sending gcm token to server
        Log.e(TAG, "sendRegistrationToServer: " + token);
    }

    private void storeRegIdInPref(String token) {
    SharedPreferences pref =     getApplicationContext().getSharedPreferences(Config.SHARED_PREF, 0);
        SharedPreferences.Editor editor = pref.edit();
        editor.putString("regId", token);
        editor.commit();
    }
    }

7.Créez une classe de service supplémentaire nommée MyFirebaseMessagingService.Java. Cela recevra des messages Firebase.

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    private static final String TAG = MyFirebaseMessagingService.class.getSimpleName();

    private NotificationUtils notificationUtils;

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        Log.e(TAG, "From: " + remoteMessage.getFrom());

        if (remoteMessage == null)
            return;

        // Check if message contains a notification payload.
        if (remoteMessage.getNotification() != null) {
            Log.e(TAG, "Notification Body: " + remoteMessage.getNotification().getBody());
            handleNotification(remoteMessage.getNotification().getBody());
        }
    }
 private void handleNotification(String message) {
        if (!NotificationUtils.isAppIsInBackground(getApplicationContext())) {
            // app is in foreground, broadcast the Push message
            Intent pushNotification = new Intent(Config.Push_NOTIFICATION);
            pushNotification.putExtra("message", message);
            LocalBroadcastManager.getInstance(this).sendBroadcast(pushNotification);

            // play notification sound
            NotificationUtils notificationUtils = new NotificationUtils(getApplicationContext());
            notificationUtils.playNotificationSound();
        }else{
            // If the app is in background, firebase itself handles the notification
        }
    }
 /**
     * Showing notification with text only
     */
    private void showNotificationMessage(Context context, String title, String message, String timeStamp, Intent intent) {
        notificationUtils = new NotificationUtils(context);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        notificationUtils.showNotificationMessage(title, message, timeStamp, intent);
    }

    /**
     * Showing notification with text and image
     */
    private void showNotificationMessageWithBigImage(Context context, String title, String message, String timeStamp, Intent intent, String imageUrl) {
        notificationUtils = new NotificationUtils(context);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        notificationUtils.showNotificationMessage(title, message, timeStamp, intent, imageUrl);
    }
}

8.Dans AndroidManifest.xml, ajoutez ces deux services Firebase MyFirebaseMessagingService et MyFirebaseInstanceIDService.

 <!-- Firebase Notifications -->
        <service Android:name=".service.MyFirebaseMessagingService">
            <intent-filter>
                <action Android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>

        <service Android:name=".service.MyFirebaseInstanceIDService">
            <intent-filter>
                <action Android:name="com.google.firebase.INSTANCE_ID_EVENT" />
            </intent-filter>
        </service>
        <!-- ./Firebase Notifications -->

Maintenant simplement Envoyez votre premier message

Remarques:

* 1.Lisez le document Google pour Firebase Cloud Messaging *

2.Si vous souhaitez migrer une application client GCM pour Android vers Firebase Cloud Messaging, suivez ces étapes et Doc ( Migrate une application client GCM )

3.Exemple de tutoriel et de code Android ( Recevoir des notifications de réengagement )

3
A-Droid Tech

vous suggère personnellement qu'au lieu de GCM, il existe également une autre bibliothèque nommée Parse pour PushNotification, cela fonctionne de la même manière que Google Cloud Messaging, mais c'est tellement tellement tellement facile que GCM

Il vous suffit de télécharger le fichier JAR et la simple ligne de code deux-trois pour Push-NOTIFICATION

pour apprendre à utiliser ce site https://parse.com/tutorials/Android-Push-notifications

Même vous n'avez pas à utiliser PHP ou tout type de code côté serveur qu'il vous fournit

regarde je vais te faire une démo

  Parse.initialize(this, "YOUR_APP_ID", "YOUR_CLIENT_KEY");
  PushService.setDefaultPushCallback(this, YourDefaultActivity.class);

du code ci-dessus est suffisant pour recevoir une notification Push

si vous voulez envoyer une notification ils fournissent Nice UI regardez l'image de UI qu'ils fournissent

enter image description here

2
Siddhpura Amit