Notificaciones de Android Push: 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 el ícono que configuro para esa notificación no se muestra. En cambio, tengo un cuadrado blanco.

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

He buscado este problema en Google, así como la forma correcta de generar notificaciones, y por lo que he leído, mi código debe ser correcto. Tristemente 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)

El código para notificaciones sigue, 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 icons de notificación deben ser completamente blancos”.

Si resolvemos el problema del icono blanco estableciendo el SDK de destino en 20, nuestra aplicación no se dirigirá a Android Lollipop, lo que significa que no podemos usar funciones específicas de Lollipop.

Solución para objective Sdk 21

Si desea admitir icons de material de Lollipop, haga icons transparentes para Lollipop y la versión anterior. Consulte lo siguiente: https://design.google.com/icons/

Consulte 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 ícono de notificación blanca. Referir enlace: https://developer.android.com/about/versions/android-5.0-changes.html

Donde sea que queramos agregar colores https://developer.android.com/reference/android/support/v4/app/NotificationCompat.Builder.html#setColor(int)

La implementación de Notification Builder para la versión de Lollipop OS inferior y superior 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 ícono.

¡¡Solucionará tu problema por completo !!

Si está usando Google Cloud Messaging, este problema no se resolverá simplemente cambiando su ícono. 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 se debe definir en los metadatos de Manifiesto, de la siguiente manera:

   

Los metadatos van debajo de la etiqueta de la application , para referencia.

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

que dice “Los íconos de notificación deben ser completamente blancos”.

Declara este código en el Manifiesto de Android:

  

Espero que esto te sea útil.

Podemos hacer lo siguiente:

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

Cree un método en el cual comprobaremos en qué versión del sistema operativo estamos instalando nuestra aplicación. Si está debajo de Lolipop, es decir, API 21, tomará el icono de la aplicación normal con el color de fondo, de lo contrario tomará el ícono transparente de la aplicación sin ningún fondo. Por lo tanto, los dispositivos que usen os version> = 21 establecerán el color de fondo del ícono usando el método setColor() de la clase del 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; } 

Finalmente, tengo la solución para este problema.

Este problema ocurre solo cuando la aplicación no se ejecuta en absoluto. (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 tenemos que establecer es la misma configuración para el icono de notificación en las API de Backend que en Frontend.

En la interfaz utilizamos React Native y para notificaciones automáticas 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 back-end para la notificación push y configuramos la estructura de la 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 la imagen de notification_icon almacenada localmente en nuestro sistema Android.

Si desea proporcionar el ícono de notificación de soporte de lollipop, haga dos tipos de icono de notificación:

  1. icono de notificación normal: para la siguiente versión de piruleta.
  2. icono de notificación con fondo transparente: para lollipop y versión anterior.

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

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 íconos con múltiples sombras, como barras de resistencia de red.

Antes de API 21 (Lollipop 5.0), los icons de color funcionan. Podría forzar a su aplicación a apuntar a API 20, pero eso limita las funciones disponibles para su aplicación, por lo que no es recomendable. Puede probar el nivel de la API en ejecución y establecer un icono de color o un icono de escala de grises de manera apropiada, pero es probable que esto 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 icons de notificación, Android ignora los canales R, G y B. El único canal que cuenta es Alpha, también conocido como opacidad. Diseña tu ícono con un editor que te dé control sobre el valor alfa de tus colores de dibujo.

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

  • Alpha = 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 usted esperaría, proporcionando los tonos entre transparente y blanco.

Cambiándolo con setColor :

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

    Color de énfasis (un entero ARGB como las constantes en Color) para ser aplicado por las plantillas de Estilo estándar al presentar esta notificación. El diseño de la plantilla actual construye una imagen de encabezado colorida al superponer la imagen del icono (en blanco) sobre un campo de este color. Los componentes alfa son ignorados.

    Mi prueba con setColor muestra que los componentes Alpha no son ignorados. Los valores alfa superiores convierten un píxel en blanco. Los valores de Alpha inferior convierten un píxel en el color de fondo (negro en mi dispositivo) en el área de notificación o en el color especificado en la notificación desplegable.

Prueba esto

Estaba enfrentando el mismo problema. Probé muchas torres pero no obtuve ninguna solución, finalmente encontré la manera de resolver mi problema.

– hacer un icono de notificación con fondo transparente. El ancho y alto de la aplicación debe ser como los siguientes tamaños y pegar todo esto en su proyecto-> app-> src-> main-> res

  • MDPI 24 * 24

  • HDPI 36 * 36

  • XHDPI 48 * 48

  • XXHDPI 72 * 72


después de lo anterior, pegue esta línea debajo 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

  

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

   

agregue esta línea en el archivo manifest.xml en el bloque de aplicaciones

Puede usar un icono diferente para diferentes versiones. Simplemente configure 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; 

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

Encontré un enlace donde podemos generar nuestro propio icono blanco,

prueba este enlace para generar un ícono blanco del icono de tu iniciador.

Abra este enlace y suba su ic_launcher o icono de notificación

Cuando quieras, mantén el icono de colores: solución
Agregue píxeles con un color ligeramente diferente en el icono.
En mi caso, tengo un icono negro con tonos y luz. Cuando se agrega un pixel azul oscuro, funciona.

Tengo un problema similar en Android 8.0. Intenta usar el recurso de icono BLANCO. Tengo un cuadrado blanco cuando bash usar una imagen coloreada para el icono, cuando lo reemplazo por un icono blanco, comienza a funcionar.