Buscar..


Introducción

Firebase Cloud Messaging (FCM) es una solución de mensajería multiplataforma que le permite entregar mensajes de manera confiable sin costo alguno.

Con FCM, puede notificar a una aplicación cliente que hay un nuevo correo electrónico u otros datos disponibles para sincronizar. Puede enviar mensajes de notificación para impulsar la reinserción y retención de usuarios. Para casos de uso, como la mensajería instantánea, un mensaje puede transferir una carga útil de hasta 4 4KB a una aplicación cliente.

Configurar una aplicación de cliente de mensajería en la nube Firebase en Android

  1. Complete la parte de Instalación y configuración para conectar su aplicación a Firebase.
    Esto creará el proyecto en Firebase.

  2. Agregue la dependencia para Firebase Cloud Messaging a su archivo build.gradle nivel de build.gradle :

dependencies {
     compile 'com.google.firebase:firebase-messaging:10.2.1'
}

Ahora estás listo para trabajar con el FCM en Android.

Los clientes de FCM requieren dispositivos con Android 2.3 o superior que también tengan instalada la aplicación Google Play Store o un emulador con Android 2.3 con API de Google.

Edita tu archivo AndroidManifest.xml

<service
    android:name=".MyFirebaseMessagingService">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT"/>
    </intent-filter>
</service>

<service
    android:name=".MyFirebaseInstanceIDService">
    <intent-filter>
        <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
    </intent-filter>
</service>

Token de registro

En el inicio inicial de su aplicación, FCM SDK genera un token de registro para la instancia de la aplicación cliente.
Si desea apuntar a dispositivos individuales o crear grupos de dispositivos, deberá acceder a este token extendiendo FirebaseInstanceIdService .

La onTokenRefresh llamada onTokenRefresh cada vez que se genera un token nuevo y puede usar el método FirebaseInstanceID.getToken() para recuperar el token actual.

Ejemplo:

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {

   /**
     * Called if InstanceID token is updated. This may occur if the security of
     * the previous token had been compromised. Note that this is called when the InstanceID token
     * is initially generated so this is where you would retrieve the token.
     */

    @Override
    public void onTokenRefresh() {
        // Get updated InstanceID token.
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
        Log.d(TAG, "Refreshed token: " + refreshedToken);

    }

}

Este código que he implementado en mi aplicación para enviar imágenes, mensajes y también enlaces para abrir en su webView

Este es mi FirebaseMessagingService

    public class MyFirebaseMessagingService extends FirebaseMessagingService { 
Bitmap bitmap;
@Override 
public void onMessageReceived(RemoteMessage remoteMessage) {
    String message = remoteMessage.getData().get("message");
    //imageUri will contain URL of the image to be displayed with Notification 
    String imageUri = remoteMessage.getData().get("image");
    String link=remoteMessage.getData().get("link");
 
    //To get a Bitmap image from the URL received 
    bitmap = getBitmapfromUrl(imageUri);
    sendNotification(message, bitmap,link);
 
} 
 
 
/** 
 * Create and show a simple notification containing the received FCM message. 
 */ 
 
private void sendNotification(String messageBody, Bitmap image, String link) {
    Intent intent = new Intent(this, NewsListActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.putExtra("LINK",link);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
            PendingIntent.FLAG_ONE_SHOT);
    Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
            .setLargeIcon(image)/*Notification icon image*/
            .setSmallIcon(R.drawable.hindi)
            .setContentTitle(messageBody)
            .setStyle(new NotificationCompat.BigPictureStyle()
                    .bigPicture(image))/*Notification with Image*/
            .setAutoCancel(true) 
            .setSound(defaultSoundUri)
            .setContentIntent(pendingIntent);
    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
 
    notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
} 
public Bitmap getBitmapfromUrl(String imageUrl) {
    try { 
        URL url = new URL(imageUrl);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoInput(true);
        connection.connect();
        InputStream input = connection.getInputStream();
        Bitmap bitmap = BitmapFactory.decodeStream(input);
        return bitmap;
 
    } catch (Exception e) {
        // TODO Auto-generated catch block 
        e.printStackTrace();
        return null; 
 
    } 
}} 

Y este es MainActivity para abrir el enlace en mi WebView u otro buscador de su requerimiento a través de intenciones.

if (getIntent().getExtras() != null) {
    if (getIntent().getStringExtra("LINK")!=null) {
        Intent i=new Intent(this,BrowserActivity.class);
        i.putExtra("link",getIntent().getStringExtra("LINK"));
        i.putExtra("PUSH","yes");
        NewsListActivity.this.startActivity(i);
        finish();
    }} 

Recibir mensajes

Para recibir mensajes, use un servicio que extienda FirebaseMessagingService y anule el método onMessageReceived .

public class MyFcmListenerService extends FirebaseMessagingService {
    
    /**
     * Called when message is received.
     *
     * @param remoteMessage Object representing the message received from Firebase Cloud Messaging.
     */
    @Override
    public void onMessageReceived(RemoteMessage message) {
        String from = message.getFrom();

        // Check if message contains a data payload.
        if (remoteMessage.getData().size() > 0) {
            Log.d(TAG, "Message data payload: " + remoteMessage.getData());
            Map<String, String> data = message.getData();
        }

        // Check if message contains a notification payload.
        if (remoteMessage.getNotification() != null) {
            Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
        }

        //.....
    }

Cuando la aplicación está en segundo plano, Android dirige los mensajes de notificación a la bandeja del sistema. Un toque de usuario en la notificación abre el iniciador de la aplicación de forma predeterminada.

Esto incluye mensajes que contienen tanto la notificación como la carga de datos (y todos los mensajes enviados desde la consola de notificaciones). En estos casos, la notificación se entrega a la bandeja del sistema del dispositivo, y la carga útil de datos se entrega en los extras de la intención de su Actividad del iniciador.

Aquí un breve resumen:

Estado de la aplicación Notificación Datos Ambos
Primer plano onMessageReceived onMessageReceived onMessageReceived
Fondo Bandeja del sistema onMessageReceived Notificación: bandeja del sistema
Datos: en extras de la intención.

Suscribirse a un tema

Las aplicaciones cliente pueden suscribirse a cualquier tema existente, o pueden crear un tema nuevo. Cuando una aplicación cliente se suscribe a un nuevo nombre de tema, se crea un nuevo tema con ese nombre en FCM y cualquier cliente puede subscribirse posteriormente.

Para suscribirse a un tema, use el método subscribeToTopic() que especifica el nombre del tema:

FirebaseMessaging.getInstance().subscribeToTopic("myTopic");


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow