Ayer, Google presentó en Google I / O el nuevo sistema de notificación basado en la nueva Firebase. Probé este nuevo FCM (Firebase Cloud Messaging) con el ejemplo en Github.
El ícono de la notificación es siempre el ic_launcher a pesar de que he declarado un sorteo 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());
}
}
Respuestas:
Desafortunadamente, esta fue una limitación de las notificaciones de Firebase en SDK 9.0.0-9.6.1. Cuando la aplicación está en segundo plano, el icono 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, puede anular el valor predeterminado. En su AndroidManifest.xml puede configurar los siguientes campos para personalizar el icono y el color:
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 pantalla. También siempre puede personalizar el icono si envía el mensaje desde las API HTTP / XMPP.
fuente
Use una implementación de servidor para enviar mensajes a su cliente y use el tipo de datos de mensajes en lugar del tipo de notificación de mensajes.
Esto lo ayudará a obtener una devolución de llamada
onMessageReceived
independientemente de si su aplicación está en segundo plano o en primer plano y luego puede generar su notificación personalizadafuente
atm están trabajando en ese tema https://github.com/firebase/quickstart-android/issues/4
editar: con SDK 9.8.0 agregar a AndroidManifest.xml
fuente
Mi solución es similar a la de ATom, pero más fácil de implementar. No necesita crear una clase que sombree FirebaseMessagingService por completo, solo puede anular el método que recibe la Intención (que es público, al menos en la versión 9.6.1) y tomar la información que se mostrará de los extras. La parte "hacky" es que el nombre del método está realmente ofuscado y cambiará cada vez que actualice Firebase sdk a una nueva versión, pero puede buscarlo rápidamente inspeccionando FirebaseMessagingService con Android Studio y buscando un método público que requiera Una intención como único parámetro. En la versión 9.6.1 se llama zzm. Así es como se ve mi servicio:
fuente
Simplemente configure targetSdkVersion en 19. El ícono de notificación será de color. Luego espera a que Firebase solucione este problema.
fuente
También hay una forma fea pero funcional. Descompile FirebaseMessagingService.class y modifique su comportamiento. Luego, coloque la clase en el paquete correcto en su aplicación y dex úsela en lugar de la clase en la propia biblioteca de mensajes. Es bastante fácil y funciona.
Hay un método:
Este código es de la versión 9.4.0, el método tendrá diferentes nombres en diferentes versiones debido a la ofuscación.
fuente
si su aplicación está en segundo plano, el icono de notificación se establecerá en el método de recepción de mensajes, pero si su aplicación está en primer plano, el icono de notificación será el que definió en el manifiesto
fuente
Estoy activando mis notificaciones desde la consola FCM y a través de HTTP / JSON ... con el mismo resultado.
Puedo manejar el título, mensaje completo, pero el ícono siempre es un círculo blanco predeterminado:
Captura de pantalla de notificaciones
En lugar de mi icono personalizado en el código (setSmallIcon o setSmallIcon) o el icono predeterminado de la aplicación:
fuente
escribe esto
justo abajo
<application.....>
fuente
Pensé que agregaría una respuesta a esta, ya que mi problema era simple pero difícil de notar. En particular, había copiado / pegado un elemento de metadatos existente al crear mi
com.google.firebase.messaging.default_notification_icon
, que usaba unaandroid:value
etiqueta para especificar su valor. Esto no funcionará para el icono de notificación, y una vez que lo cambié aandroid:resource
todo funcionó como se esperaba.fuente
default_notification_color
meta, tiene que ser unandroid:resource
- ajuste queandroid:value
no va a funcionar