sobre - Notificaciones push de Android: el icono no se muestra en la notificación, en su lugar se muestra un cuadrado blanco
quitar notificaciones permanentes android (19)
Mi aplicación genera una notificación, pero el icono que configuré para esa notificación no se muestra. En cambio, obtengo un cuadrado blanco.
Intenté cambiar el tamaño del png del icono (dimensiones 720x720, 66x66, 44x44, 22x22). Curiosamente, cuando se usan dimensiones más pequeñas, el cuadrado blanco es más pequeño.
He buscado en Google este problema, así como la forma correcta de generar notificaciones, y por lo que he leído, mi código debe ser correcto. Lamentablemente, las cosas no son como deberían ser.
Mi teléfono es un Nexus 5 con Android 5.1.1. El problema también está presente en los emuladores, un Samsung Galaxy s4 con Android 5.0.1 y un Motorola Moto G con Android 5.0.1 (los cuales tomé prestados y no tengo ahora)
Sigue el código para las notificaciones y dos capturas de pantalla. Si necesita más información, no dude en solicitarla.
Gracias a todos.
@SuppressLint("NewApi") private void sendNotification(String msg, String title, String link, Bundle bundle) {
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Intent resultIntent = new Intent(getApplicationContext(), MainActivity.class);
resultIntent.putExtras(bundle);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
resultIntent, Intent.FLAG_ACTIVITY_NEW_TASK);
Notification notification;
Uri sound = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.notificationsound);
notification = new Notification.Builder(this)
.setSmallIcon(R.drawable.lg_logo)
.setContentTitle(title)
.setStyle(new Notification.BigTextStyle().bigText(msg))
.setAutoCancel(true)
.setContentText(msg)
.setContentIntent(contentIntent)
.setSound(sound)
.build();
notificationManager.notify(0, notification);
}
Prueba esto
Estaba enfrentando el mismo problema que probé muchas respuestas pero no obtuve ninguna solución, finalmente encontré la manera de resolver mi problema.
- haga un icono de notificación con fondo transparente. El ancho y la altura de la aplicación deben ser como los tamaños inferiores y pegue todo esto en su proyecto-> aplicación-> src-> main-> res
-
MDPI 24 * 24
-
HDPI 36 * 36
-
XHDPI 48 * 48
-
XXHDPI 72 * 72
después de lo anterior, pegue esta línea a continuación en su método onMessageReceived
Intent intent = new Intent(this, News.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
PendingIntent.FLAG_ONE_SHOT);
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this);
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
{
notificationBuilder.setSmallIcon(R.drawable.notify)
// .setContentTitle(title)
// .setContentText(message)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
} else
{
notificationBuilder.setSmallIcon(R.drawable.notify)
// .setContentTitle(title)
// .setContentText(message)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
}
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, notificationBuilder.build());
No olvides agregar este código en el archivo de manifiesto
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/app_icon" />
Realmente sugiero seguir las pautas de diseño de Google :
que dice "Los iconos de notificación deben ser completamente blancos".
Declare este código en el Manifiesto de Android:
<meta-data android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/ic_stat_name" />
Espero que esto te sea útil.
Encontré un enlace donde podemos generar nuestro propio icono blanco,
prueba este enlace para generar el ícono blanco del ícono del iniciador.
Abra este Link y cargue su ic_launcher o icono de notificación
Finalmente tengo la solución para este problema.
Este problema ocurre solo cuando la aplicación no se está ejecutando. (ni en el fondo ni en primer plano) . Cuando la aplicación se ejecuta en primer plano o en segundo plano, el icono de notificación se muestra correctamente (no el cuadrado blanco)
Entonces, lo que debemos establecer es la misma configuración para el ícono de notificación en las API de backend que la de Frontend.
En la interfaz hemos usado React Native y para notificaciones push hemos usado el paquete react-native-fcm npm .
FCM.on("notification", notif => {
FCM.presentLocalNotification({
body: notif.fcm.body,
title: notif.fcm.title,
big_text: notif.fcm.body,
priority: "high",
large_icon: "notification_icon", // notification icon
icon: "notification_icon",
show_in_foreground: true,
color: ''#8bc34b'',
vibrate: 300,
lights: true,
status: notif.status
});
});
Hemos utilizado el paquete fcm-push npm usando Node.js como back-end para notificaciones push y configuramos la estructura de carga de la siguiente manera.
{
to: ''/topics/user'', // required
data: {
id:212,
message: ''test message'',
title: ''test title''
},
notification: {
title: ''test title'',
body: ''test message'',
icon : ''notification_icon'', // same name as mentioned in the front end
color : ''#8bc34b'',
click_action : "BROADCAST"
}
}
Lo que básicamente busca es la imagen de sondeo_notificación almacenada localmente en nuestro sistema Android.
He resuelto el problema agregando el siguiente código para manifestar,
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/ic_stat_name" />
<meta-data
android:name="com.google.firebase.messaging.default_notification_color"
android:resource="@color/black" />
donde
ic_stat_name
creado en Android Studio Haga clic derecho en res >> Nuevo >> Image Assets >> IconType (Notification)
Y un paso más que tengo que hacer en el lado del servidor php con la carga de notificación
$message = [
"message" => [
"notification" => [
"body" => $title ,
"title" => $message
],
"token" => $token,
"android" => [
"notification" => [
"sound" => "default",
"icon" => "ic_stat_name"
]
],
"data" => [
"title" => $title,
"message" => $message
]
]
];
Tenga en cuenta la sección
"android" => [
"notification" => [
"sound" => "default",
"icon" => "ic_stat_name"
]
]
donde el nombre del icono es
"icon" => "ic_stat_name"
debe ser el mismo conjunto en el manifiesto.
Las notificaciones son en escala de grises como se explica a continuación. No son en blanco y negro, a pesar de lo que otros han escrito. Probablemente haya visto iconos con varios tonos, como barras de fuerza de red.
Antes de API 21 (Lollipop 5.0), los iconos de color funcionan. Puede obligar a su aplicación a apuntar a la API 20, pero eso limita las características disponibles para su aplicación, por lo que no se recomienda. Puede probar el nivel de API en ejecución y establecer un icono de color o un icono de escala de grises adecuadamente, pero esto probablemente no valga la pena. En la mayoría de los casos, es mejor ir con un ícono en escala de grises.
Las imágenes tienen cuatro canales, RGBA (rojo / verde / azul / alfa). Para los íconos de notificación, Android ignora los canales R, G y B. El único canal que cuenta es Alpha, también conocido como opacidad. Diseñe su icono con un editor que le dé control sobre el valor Alfa de sus colores de dibujo.
Cómo los valores alfa generan una imagen en escala de grises:
- Alfa = 0 (transparente): estos píxeles son transparentes y muestran el color de fondo.
- Alfa = 255 (opaco): estos píxeles son blancos.
- Alfa = 1 ... 254: estos píxeles son exactamente lo que esperarías, proporcionando los tonos entre transparente y blanco.
Cambiándolo con
setColor
:
-
Llame a
NotificationCompat.Builder.setColor(int argb)
. De la documentación paraNotification.color
:Color de acento (un entero ARGB como las constantes en color) que las plantillas de estilo estándar deben aplicar al presentar esta notificación. El diseño actual de la plantilla construye una imagen de encabezado colorida superponiendo la imagen del icono (estampada en blanco) sobre un campo de este color. Los componentes alfa se ignoran.
Mi prueba con setColor muestra que los componentes Alpha no se ignoran. Los valores alfa más altos convierten un píxel en blanco. Los valores alfa más bajos convierten un píxel al color de fondo (negro en mi dispositivo) en el área de notificación, o al color especificado en la notificación desplegable.
Para SDK> = 23, agregue setLargeIcon
notification = new Notification.Builder(this) .setSmallIcon(R.drawable.ic_launcher) .setLargeIcon(context.getResources(), R.drawable.lg_logo)) .setContentTitle(title) .setStyle(new Notification.BigTextStyle().bigText(msg)) .setAutoCancel(true) .setContentText(msg) .setContentIntent(contentIntent) .setSound(sound) .build();
Para reducir las versiones específicas del SDK, simplemente puede hacer esto: (reemplace ''#'' a ''0x'')
Notification notification = new NotificationCompat.Builder(this); notification.setSmallIcon(R.drawable.icon_transperent); notification.setColor(0x169AB9); //for color: #169AB9
Podemos hacer lo siguiente:
Cree un nuevo objeto de generador de notificaciones y llame a
setSmallIcon()
usando el objeto generador de notificaciones como se muestra en el siguiente código.
Cree un método en el que verifiquemos en qué versión del sistema operativo estamos instalando nuestra aplicación.
Si está debajo de Lolipop, es decir, API 21, tomará el ícono de la aplicación normal con el color de fondo; de lo contrario, tomará el ícono de la aplicación transparente sin fondo.
Entonces, los dispositivos que usan la versión del sistema
setColor()
> = 21 establecerán el color de fondo del icono usando el método
setColor()
de la clase de generador de notificaciones.
Código de muestra:
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this);
notificationBuilder.setSmallIcon(getNotificationIcon(notificationBuilder));
private int getNotificationIcon(NotificationCompat.Builder notificationBuilder) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
int color = 0x008000;
notificationBuilder.setColor(color);
return R.drawable.app_icon_lolipop_above;
}
return R.drawable.app_icon_lolipop_below;
}
Puede usar diferentes íconos para diferentes versiones. Simplemente configure la lógica en su icono de esta manera:
notification = new Notification.Builder(this)
.setSmallIcon(R.drawable.ic_launcher)
.setLargeIcon(context.getResources(), R.drawable.lg_logo))
.setContentTitle(title)
.setStyle(new Notification.BigTextStyle().bigText(msg))
.setAutoCancel(true)
.setContentText(msg)
.setContentIntent(contentIntent)
.setSound(sound)
.build();
Requisitos para solucionar este problema:
-
Formato de imagen: PNG de 32 bits (con alfa)
-
La imagen debe ser transparente.
-
Índice de color de transparencia: blanco (FFFFFF)
Fuente: http://gr1350.blogspot.com/2017/01/problem-with-setsmallicon.html
Si desea proporcionar el ícono de notificación de soporte de lollipop, haga dos íconos de notificación de tipo:
- icono de notificación normal: para la versión de lollipop a continuación.
- icono de notificación con fondo transparente: para piruletas y versiones superiores.
Ahora configure el icono apropiado para el generador de notificaciones en la base de tiempo de ejecución en la versión del sistema operativo:
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
mBuilder.setSmallIcon(R.drawable.ic_push_notification_transperent);
} else {
mBuilder.setSmallIcon(R.drawable.ic_push_notification);
}
Si está utilizando Google Cloud Messaging, este problema no se resolverá simplemente cambiando su icono. Por ejemplo, esto no funcionará:
Notification notification = new Notification.Builder(this)
.setContentTitle(title)
.setContentText(text)
.setSmallIcon(R.drawable.ic_notification)
.setContentIntent(pIntent)
.setDefaults(Notification.DEFAULT_SOUND|Notification.DEFAULT_LIGHTS|Notification.DEFAULT_VIBRATE)
.setAutoCancel(true)
.build();
Incluso si ic_notification es transparente y blanco. También debe definirse en los metadatos Manifiesto, así:
<meta-data android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/ic_notification" />
Los metadatos van bajo la etiqueta de la
application
, como referencia.
Tengo un problema similar en Android 8.0. Intenta utilizar el recurso de icono BLANCO. Tengo un cuadrado blanco cuando intento usar una imagen en color para el ícono, cuando lo reemplazo al ícono blanco, comienza a funcionar.
(Android Studio 3.5) Si es una versión reciente de Android Studio, puede generar sus imágenes de notificación. Haga clic derecho en su carpeta res > Nuevo> Activo de imagen . Luego verá Configurar activos de imagen como se muestra en la imagen a continuación. Cambiar el tipo de icono a iconos de notificación . Sus imágenes deben ser blancas y transparentes. Esta configuración de activos de imagen hará cumplir esa regla. Importante: Si desea que los íconos se usen para notificaciones en la nube / push, debe agregar los metadatos debajo de la etiqueta de su aplicación para usar los íconos de notificación recién creados.
int icon = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? R.drawable.colored_: R.drawable.white_tint_icon_for_lolipop_or_upper;
Causa: para 5.0 Lollipop "Los iconos de notificación deben ser completamente blancos".
Si resolvemos el problema del icono blanco configurando el SDK de destino en 20, nuestra aplicación no apuntará a Android Lollipop, lo que significa que no podemos usar las funciones específicas de Lollipop.
Solución para el objetivo Sdk 21
Si desea admitir los iconos de material de Lollipop, haga iconos transparentes para Lollipop y la versión anterior. Consulte lo siguiente: https://design.google.com/icons/
Mire http://developer.android.com/design/style/iconography.html , y veremos que el estilo blanco es cómo se deben mostrar las notificaciones en Android Lollipop.
En Lollipop, Google también sugiere que usemos un color que se mostrará detrás del icono de notificación blanco. Enlace de referencia: https://developer.android.com/about/versions/android-5.0-changes.html
Donde queramos agregar colores https://developer.android.com/reference/android/support/v4/app/NotificationCompat.Builder.html#setColor(int)
La implementación del generador de notificaciones para la versión del sistema operativo Lollipop anterior y posterior sería:
Notification notification = new NotificationCompat.Builder(this);
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
notification.setSmallIcon(R.drawable.icon_transperent);
notification.setColor(getResources().getColor(R.color.notification_color));
} else {
notification.setSmallIcon(R.drawable.icon);
}
Nota: setColor solo está disponible en Lollipop y solo afecta al fondo del icono.
¡Resolverá su problema por completo!
Cuando quieras mantener un ícono colorido - Solución alternativa
Agregue píxeles con un color ligeramente diferente al icono.
En mi caso, tengo un icono negro con sombras y luz.
Cuando se agrega un píxel azul oscuro, funciona.
<meta-data android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/ic_notification" />
agregue esta línea en el archivo manifest.xml en el bloque de aplicación