Ícono de notificación con el nuevo sistema Firebase Cloud Messaging
Ayer Google presentó en el Google I/O el nuevo sistema de notificaciones basado en el nuevo Firebase. Probé este nuevo FCM (Firebase Cloud Messaging) con el ejemplo en Github.
El ícono de la notificación es siempre ic_launcher a pesar de haber declarado un elemento de diseño específico.
Por qué ? Aquí debajo el código oficial para manejar el mensaje.
public class AppFirebaseMessagingService extends FirebaseMessagingService {
/**
* Called when message is received.
*
* @param remoteMessage Object representing the message received from Firebase Cloud Messaging.
*/
// [START receive_message]
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
// If the application is in the foreground handle both data and notification messages here.
// Also if you intend on generating your own notifications as a result of a received FCM
// message, here is where that should be initiated. See sendNotification method below.
sendNotification(remoteMessage);
}
// [END receive_message]
/**
* Create and show a simple notification containing the received FCM message.
*
* @param remoteMessage FCM RemoteMessage received.
*/
private void sendNotification(RemoteMessage remoteMessage) {
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
PendingIntent.FLAG_ONE_SHOT);
Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
// this is a my insertion looking for a solution
int icon = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? R.drawable.myicon: R.mipmap.myicon;
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(icon)
.setContentTitle(remoteMessage.getFrom())
.setContentText(remoteMessage.getNotification().getBody())
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}
}
Desafortunadamente, esta fue una limitación de las notificaciones de Firebase en el SDK 9.0.0-9.6.1. Cuando la aplicación está en segundo plano, el ícono del iniciador se usa desde el manifiesto (con el tinte requerido de Android) para los mensajes enviados desde la consola.
Sin embargo, con SDK 9.8.0, puedes anular el valor predeterminado. En su AndroidManifest.xml puede configurar los siguientes campos para personalizar el icono y el color:
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/notification_icon" />
<meta-data android:name="com.google.firebase.messaging.default_notification_color"
android:resource="@color/google_blue" />
Tenga en cuenta que si la aplicación está en primer plano (o se envía un mensaje de datos), puede usar completamente su propia lógica para personalizar la visualización. También siempre puede personalizar el icono si envía el mensaje desde las API HTTP/XMPP.
Utilice una implementación de servidor para enviar mensajes a su cliente y utilice mensajes de tipo de datos en lugar de mensajes de tipo de notificación .
Esto le ayudará a recibir una devolución de llamada onMessageReceived
independientemente de si su aplicación está en segundo plano o en primer plano y luego podrá generar su notificación personalizada.