Poner iconos en las notificaciones en Android Studio

¡Hola Vikingos!

¿No os ha ocurrido alguna vez que mostráis notificaciones en Android Studio y os sale el icono horrible por defecto? Un círculo gris bastante feo. Esto es un gran problema de imagen de marca, ya que da la impresión de que la app no está bien hecha o personalizada, alejando al usuario de ese «enamoramiento» que queremos producir en él.

La solución al problema es bastante sencilla y requiere de una serie de pasos que hay que seguir con precisión:

  1. Crear la imagen tal cual se necesita
  2. Crear la notificación
  3. Añadir la imagen como small icon o large icon

Crear la imagen para icono de notificación

Este es el punto más delicado y en el que, la mayoría de veces, suele estar el problema. En la gran mayoría de ocasiones nos volvemos locos porque, tras haber seguido todos los pasos, el icono por defecto sigue apareciendo, aumentando nuestra frustración.

El problema radica en que Google ha definido unos parámetros muy estrictos por los que se deben regir los iconos creados y es por eso que la mayoría de veces, si los intentamos hacer a mano y sin leer la especificación, fallan.

Afortunadamente, Android Studio nos permite crearlos desde el propio editor. Para ello, buscamos en la pestaña del proyecto Android (a la derecha del todo) el paquete «res», pulsamos con el botón derecho y damos a New -> Image Asset. Se nos abrirá una ventana tal como aparece a continuación:

En Icon Type debemos seleccionar Notification Icons. Ahí podemos elegir entre tres tipos en la opción Asset Type: Imagen, Icono y texto. Hay que tener en cuenta que, si queremos el icono de la app como icono para las notificaciones, debemos crearlo en blanco sobre fondo negro (tal y como dice la especificación). Si elegimos Icono o texto, el propio Android studio se encarga de configurarlo y crearlo automáticamente.

Crear notificaciones en Android Studio

Como ya hicimos en el vídeo sobre crear alarma Android Studio, para mostrar la notificación pertinente hay que crear la instancia con un NotificationBuilder. Os dejo el código para la notificación aquí:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    final int NOTIFY_ID = 0; // ID of notification
    String id = NOTIFICATION_CHANNEL_ID; // default_channel_id
    String title = NOTIFICATION_CHANNEL_ID; // Default Channel
    PendingIntent pendingIntent;
    NotificationCompat.Builder builder;
    NotificationManager notifManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    if (notifManager == null) {
        notifManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    }
    int importance = NotificationManager.IMPORTANCE_HIGH;
    NotificationChannel mChannel = notifManager.getNotificationChannel(id);
    if (mChannel == null) {
        mChannel = new NotificationChannel(id, title, importance);
        mChannel.enableVibration(true);
        mChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
        notifManager.createNotificationChannel(mChannel);
    }
    builder = new NotificationCompat.Builder(context, id);
    mIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    pendingIntent = PendingIntent.getActivity(context, 0, mIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    builder.setContentTitle(getString(R.string.app_name)).setCategory(Notification.CATEGORY_SERVICE)
            .setSmallIcon(R.drawable.ic_notification)   // required
            .setContentText(message)
            .setLargeIcon(BitmapFactory.decodeResource(res, R.drawable.ic_notification))
            .setDefaults(Notification.DEFAULT_ALL)
            .setAutoCancel(true)
            .setSound(soundUri)

            .setContentIntent(pendingIntent)
            .setVibrate(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
    Notification notification = builder.build();
    notifManager.notify(NOTIFY_ID, notification);

    startForeground(1, notification);

} else {
    pendingIntent = PendingIntent.getActivity(context, 1, mIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    notification = new NotificationCompat.Builder(this)
            .setContentIntent(pendingIntent)
            .setSmallIcon(R.drawable.ic_notification)
            .setLargeIcon(BitmapFactory.decodeResource(res, R.drawable.ic_notification))
            .setSound(soundUri)
            .setAutoCancel(true)
            .setContentTitle(getString(R.string.app_name)).setCategory(Notification.CATEGORY_SERVICE)
            .setContentText(message).build();
    notificationManager.notify(NOTIFICATION_ID, notification);
}

Recordad que tenemos que distinguir entre Android O (o superior) y las otras versiones porque hubo un cambio en la forma de mostrarlas, y así llegamos a todas las posibilidades.
Para mostrar correctamente la notificación fijaos en la línea:

.setSmallIcon(R.drawable.ic_notification)

Y nada más. Si aplicáis este método a la hora de crear una app Android con Android studio, vuestras notificaciones se mostrarán con iconos personalizados.

Podéis ver este tutorial en vídeo en mi canal de youtube, pero os lo dejo aquí también:

Si necesitáis alguna aclaración, dejad un comentario, contactadme a través de youtube o en este mismo canal.

Podéis descargar el código en mi cuenta de github: https://github.com/vicksWalkiria/androidAlarmManagerSample

También puedes unirte a mis canales de telegram y WhatsApp:
https://t.me/joinchat/F4BaiBdxa8E-R9q-bJ2bBA
https://chat.whatsapp.com/EqzMrd7IH74DsmDvyQlaxh

Si quieres contratar mis servicios como Experto en Android, puedes contactarme en el formulario de contacto.

¿Y vosotros? ¿Habéis conseguido poner vuestro propio icono personalizado en las notificaciones en Android Studio? Podéis contárnoslo en los comentarios o en propio canal de Youtube. ¡Os esperamos!

Hasta aquí hemos llegado. Espero veros muy pronto. ¡Hasta la próxima!

victor
Últimas entradas de victor (ver todo)