Icono que no se muestra en la notificación: se muestra un cuadrado blanco en su lugar

Mi aplicación genera una notificación, pero no se muestra el icono que establezco para esa notificación. En cambio, me dan un cuadrado blanco.

He intentado cambiar el tamaño del png del icono (dimensiones 720×720, 66×66, 44×44, 22×22). Curiosamente, al usar dimensiones más pequeñas el cuadrado blanco es más pequeño.

He googled este problema, así como la forma correcta de generar notificaciones, y de lo que he leído mi código debe ser correcta. Lamentablemente las cosas no son como deberían ser.

Mi teléfono es un Nexus 5 con Android 5.1.1. 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 (ambos de los cuales tomé prestado, y no tengo ahora)

Sigue el código para 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); } 

Sin abrir la notificaciónNotificaciones abiertas

Causa: Para 5.0 Lollipop "Los iconos de notificación deben ser completamente blancos".

Si quieres apoyar a Lollipop Material Icons entonces haz iconos transparentes para Lollipop y por encima de la versión. Consulte el siguiente apartado : https://design.google.com/icons/

Implementación de Notification Builder por debajo y por encima de la versión de Lollipop OS sería:

 NotificationCompat.Builder builder = new NotificationCompat.Builder(this); if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { builder.setSmallIcon(R.drawable.icon_transperent); } else { builder.setSmallIcon(R.drawable.icon); } 

Si desea configurar un único icono de color para todas las versiones de SO,

Solución: Para los iconos coloreados, utilice

 defaultConfig { applicationId "com.your.app.pkj" minSdkVersion xx targetSdkVersion 20 // < 21 (target sdk version in manifest file will be less than 21). versionCode x versionName "xx" } 

En el archivo app / build.gradle. ¡Solucionará su problema totalmente !!

Realmente sugiero seguir las directrices de diseño de Google :

"Los iconos de notificación deben ser completamente blancos."

Aquí es cómo puede implementarlo:

Si está utilizando Gradle / Android Studio para crear sus aplicaciones, use build.gradle:

 defaultConfig { targetSdkVersion 20 } 

De lo contrario (Eclipse etc) use AndroidManifest.xml:

 <uses-sdk android:minSdkVersion="..." android:targetSdkVersion="20" /> 

Podemos hacer como a continuación:

Cree un nuevo objeto del constructor de notificaciones y llame a setSmallIcon() utilizando el objeto de constructor de notificaciones como en código inferior.

Crear un método en el que vamos a comprobar en qué versión del sistema operativo estamos instalando nuestra aplicación. Si está por debajo de Lolipop es decir, API 21, entonces se llevará el icono de la aplicación normal con el color de fondo, más que tendrá el icono de la aplicación transparente sin ningún fondo. Por lo tanto, los dispositivos que utilizan la versión os => 21 establecerán el color de fondo del icono usando el método setColor() de la clase constructor Notificación.

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; } else { return R.drawable.app_icon_lolipop_below; } } 

Si desea proporcionar el icono de notificación de soporte de lollipop y luego hacer dos tipo de icono de notificación:

  1. Icono de notificación normal: por debajo de la versión lollipop.
  2. Icono de notificación con fondo transparente: para lollipop y versión anterior.

Ahora configure el icono apropiado para el constructor 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); } 

Finalmente tengo la solución para este problema.

Este problema se produce sólo cuando la aplicación no se ejecuta en absoluto. (Ni en segundo plano 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)

Así que lo que tenemos que configurar es la misma configuración para el icono de notificación en las API de backend que el de Frontend.

En el frontend hemos utilizado React Native y para la notificación push hemos utilizado 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 backend para la notificación push y configurando la estructura de la carga útil 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 la imagen notification_icon almacenada localmente en nuestro sistema Android.

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 útil para usted.

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(); 

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 resistencia de red.

Antes de la API 21 (Lollipop 5.0), los iconos de color funcionan. Podría forzar a su aplicación a orientar la API 20, pero eso limita las funciones 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 de forma adecuada, pero probablemente no valga la pena. En la mayoría de los casos, lo mejor es ir con un icono de escala de grises.

Las imágenes tienen cuatro canales, RGBA (rojo / verde / azul / alfa). Para los iconos 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 da control sobre el valor Alpha de sus colores de dibujo.

Cómo los valores Alpha generan una imagen en escala de grises:

  • Alpha = 0 (transparente) – Estos píxeles son transparentes, mostrando el color de fondo.
  • Alpha = 255 (opaco) – Estos píxeles son blancos.
  • Alpha = 1 … 254 – Estos píxeles son exactamente lo que cabría esperar, proporcionando las tonalidades entre transparente y blanco.

setColor con setColor :

  • Llame a NotificationCompat.Builder.setColor(int argb) . De la documentación de Notification.color :

    El color de acento (un entero ARGB como las constantes en Color) que se aplicará en las plantillas de estilo estándar 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) encima de un campo de este color. Los componentes alfa se ignoran.

    Mi prueba con setColor muestra que los componentes Alpha no se ignoran. Los valores Altos más altos dan vuelta a un pixel blanco. Los valores de Alfa Inferior cambian 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.

Puede utilizar diferentes iconos para diferentes versiones. Simplemente establezca la lógica en su icono de esta manera:

 int icon = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? R.drawable.colored_: R.drawable.white_tint_icon_for_lolipop_or_upper; 

Requisitos para solucionar este problema:

  1. Formato de imagen: PNG de 32 bits (con alfa)

  2. La imagen debe ser transparente

  3. Índice de color de transparencia: Blanco (FFFFFF)

Fuente: http://gr1350.blogspot.com/2017/01/problem-with-setsmallicon.html

Prueba esto

Yo estaba enfrentando el mismo problema que intenté mucho de anwers pero no obtuve ninguna solución, finalmente encontré la manera de resolver mi problema.

– haz un icono de notificación con fondo transparente. El ancho y la altura de la aplicación deben ser como los de debajo de los tamaños y pegar todos estos en tu proyecto-> app-> src-> main-> res

  • MDPI 24 * 24

  • HDPI 36 * 36

  • XHDPI 48 * 48

  • XXHDPI 72 * 72


Después de la anterior pegar esta línea debajo de 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()); 

Foreground Captura de pantalla

Fondo de pantalla

  • Cómo parpadear icono de notificación en android?
  • Android a veces tengo android.app.RemoteServiceException: Notificación incorrecta enviada desde el paquete. ¿Por qué?
  • ¿Cómo agregar sonido a la notificación?
  • ¿Cómo crear notificaciones que no desaparecen cuando se hace clic en Android?
  • Notificación de Push en Android?
  • Cómo reproducir un sonido de notificación de Android
  • Cómo puedo fijar la hora y la fecha para la notificación
  • El icono de notificación de Android es un círculo blanco
  • Actividad de reanudación de notificaciones
  • Generador de notificaciones de Android getNotification () vs build ()
  • Deshabilitado Bloqueo de teclado Bloqueo se vuelve a habilitar después de hacer clic en una notificación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.