studio - notification channel android oreo
NotificationCompat.Builder en desuso en Android O (8)
Muestra simple
public void showNotification (String from, String notification, Intent intent) {
PendingIntent pendingIntent = PendingIntent.getActivity(
context,
Notification_ID,
intent,
PendingIntent.FLAG_UPDATE_CURRENT
);
String NOTIFICATION_CHANNEL_ID = "my_channel_id_01";
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "My Notifications", NotificationManager.IMPORTANCE_DEFAULT);
// Configure the notification channel.
notificationChannel.setDescription("Channel description");
notificationChannel.enableLights(true);
notificationChannel.setLightColor(Color.RED);
notificationChannel.setVibrationPattern(new long[]{0, 1000, 500, 1000});
notificationChannel.enableVibration(true);
notificationManager.createNotificationChannel(notificationChannel);
}
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID);
Notification mNotification = builder
.setContentTitle(from)
.setContentText(notification)
// .setTicker("Hearty365")
// .setContentInfo("Info")
// .setPriority(Notification.PRIORITY_MAX)
.setContentIntent(pendingIntent)
.setAutoCancel(true)
// .setDefaults(Notification.DEFAULT_ALL)
// .setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher))
.build();
notificationManager.notify(/*notification id*/Notification_ID, mNotification);
}
Después de actualizar mi proyecto a Android O
buildToolsVersion "26.0.1"
Lint en Android Studio muestra una advertencia obsoleta para el siguiente método de creación de notificaciones:
new NotificationCompat.Builder(context)
El problema es: los desarrolladores de Android actualizan su documentación que describe NotificationChannel para admitir notificaciones en Android O, y nos proporcionan un fragmento, pero con la misma advertencia obsoleta:
Notification notification = new Notification.Builder(MainActivity.this)
.setContentTitle("New Message")
.setContentText("You''ve received new messages.")
.setSmallIcon(R.drawable.ic_notify_status)
.setChannelId(CHANNEL_ID)
.build();
Mi pregunta: ¿hay alguna otra solución para crear notificaciones y todavía es compatible con Android O?
Una solución que encontré es pasar el ID del canal como parámetro en el constructor Notification.Builder. Pero esta solución no es exactamente reutilizable.
new Notification.Builder(MainActivity.this, "channel_id")
Aquí está el código de muestra, que funciona en Android Oreo y menos que Oreo.
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
NotificationCompat.Builder builder = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
int importance = NotificationManager.IMPORTANCE_DEFAULT;
NotificationChannel notificationChannel = new NotificationChannel("ID", "Name", importance);
notificationManager.createNotificationChannel(notificationChannel);
builder = new NotificationCompat.Builder(getApplicationContext(), notificationChannel.getId());
} else {
builder = new NotificationCompat.Builder(getApplicationContext());
}
builder = builder
.setSmallIcon(R.drawable.ic_notification_icon)
.setColor(ContextCompat.getColor(context, R.color.color))
.setContentTitle(context.getString(R.string.getTitel))
.setTicker(context.getString(R.string.text))
.setContentText(message)
.setDefaults(Notification.DEFAULT_ALL)
.setAutoCancel(true);
notificationManager.notify(requestCode, builder.build());
En la documentación se menciona que el método de creación
NotificationCompat.Builder(Context context)
ha quedado en desuso.
Y tenemos que usar el constructor que tiene el parámetro
channelId
:
NotificationCompat.Builder(Context context, String channelId)
https://developer.android.com/reference/android/support/v4/app/NotificationCompat.Builder.html
Este constructor quedó en desuso en el nivel de API 26.0.0-beta1. use NotificationCompat.Builder (Context, String) en su lugar. Todas las notificaciones publicadas deben especificar un Id. De canal de notificación.
https://developer.android.com/reference/android/app/Notification.Builder.html
Este constructor quedó en desuso en el nivel 26 de la API. Use Notification.Builder (Context, String) en su lugar. Todas las notificaciones publicadas deben especificar un Id. De canal de notificación.
Si desea reutilizar los configuradores del generador, puede crear el generador con el ID de canal y pasar ese generador a un método auxiliar y establecer su configuración preferida en ese método.
En lugar de buscar
Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
como sugieren muchas respuestas, hay una forma un poco más simple:
Agrega la siguiente línea a la sección de
application
del archivo
AndroidManifest.xml
como se explica en la
Configuración de una aplicación de cliente Firebase Cloud Messaging en el
documento de
Android
:
<meta-data
android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="@string/default_notification_channel_id" />
Luego agregue una línea con un nombre de canal al archivo values / strings.xml :
<string name="default_notification_channel_id">default</string>
Después de eso, podrá utilizar la nueva versión del constructor NotificationCompat.Builder con 2 parámetros (ya que el antiguo constructor con 1 parámetro ha quedado en desuso en Android Oreo):
private void sendNotification(String title, String body) {
Intent i = new Intent(this, MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pi = PendingIntent.getActivity(this,
0 /* Request code */,
i,
PendingIntent.FLAG_ONE_SHOT);
Uri sound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this,
getString(R.string.default_notification_channel_id))
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(title)
.setContentText(body)
.setAutoCancel(true)
.setSound(sound)
.setContentIntent(pi);
NotificationManager manager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
manager.notify(0, builder.build());
}
Este constructor quedó en desuso en el nivel de API 26.1.0. use NotificationCompat.Builder (Context, String) en su lugar. Todas las notificaciones publicadas deben especificar un Id. De canal de notificación.
Aquí hay un código de trabajo para todas las versiones de Android a partir de API LEVEL 26+ con compatibilidad con versiones anteriores.
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(getContext(), "M_CH_ID");
notificationBuilder.setAutoCancel(true)
.setDefaults(Notification.DEFAULT_ALL)
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.drawable.ic_launcher)
.setTicker("Hearty365")
.setPriority(Notification.PRIORITY_MAX) // this is deprecated in API 26 but you can still use for below 26. check below update for 26 API
.setContentTitle("Default notification")
.setContentText("Lorem ipsum dolor sit amet, consectetur adipiscing elit.")
.setContentInfo("Info");
NotificationManager notificationManager = (NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(1, notificationBuilder.build());
ACTUALIZACIÓN para API 26 para establecer la prioridad máxima
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
String NOTIFICATION_CHANNEL_ID = "my_channel_id_01";
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "My Notifications", NotificationManager.IMPORTANCE_MAX);
// Configure the notification channel.
notificationChannel.setDescription("Channel description");
notificationChannel.enableLights(true);
notificationChannel.setLightColor(Color.RED);
notificationChannel.setVibrationPattern(new long[]{0, 1000, 500, 1000});
notificationChannel.enableVibration(true);
notificationManager.createNotificationChannel(notificationChannel);
}
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID);
notificationBuilder.setAutoCancel(true)
.setDefaults(Notification.DEFAULT_ALL)
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.drawable.ic_launcher)
.setTicker("Hearty365")
// .setPriority(Notification.PRIORITY_MAX)
.setContentTitle("Default notification")
.setContentText("Lorem ipsum dolor sit amet, consectetur adipiscing elit.")
.setContentInfo("Info");
notificationManager.notify(/*notification id*/1, notificationBuilder.build());
Llame al constructor de 2 argumentos:
para compatibilidad con Android O, llame a support-v4
NotificationCompat.Builder(Context context, String channelId)
.
Cuando se ejecuta en Android N o anterior, se
channelId
el
channelId
.
Cuando se ejecuta en Android O, también cree un
NotificationChannel
con el mismo
channelId
.
Código de muestra desactualizado:
el código de muestra en varias páginas JavaDoc como
https://developer.android.com/reference/android/app/Notification.Builder.html
llama a
new Notification.Builder(mContext)
está desactualizado.
Los constructores obsoletos:
Notification.Builder(Context context)
y
v4
NotificationCompat.Builder(Context context)
están obsoletos a favor de
Notification[Compat].Builder(Context context, String channelId)
.
(Consulte
Notification.Builder(android.content.Context)
y v4
NotificationCompat.Builder (Contexto contextual)
.)
Clase en
desuso
:
toda la clase
v7
NotificationCompat.Builder
está en desuso.
(Consulte
v7 NotificationCompat.Builder
.) Anteriormente, se necesitaba v7
NotificationCompat.Builder
para admitir
NotificationCompat.MediaStyle
.
En Android O, hay un
NotificationCompat.MediaStyle
v4 en el paquete
android.support.v4.media
biblioteca media-compat
.
Use ese si necesita
MediaStyle
.
API 14+: en la biblioteca de soporte de 26.0.0 y superior, los paquetes support-v4 y support-v7 admiten un nivel mínimo de API de 14. Los nombres v # son históricos.
Notification notification = new Notification.Builder(MainActivity.this)
.setContentTitle("New Message")
.setContentText("You''ve received new messages.")
.setSmallIcon(R.drawable.ic_notify_status)
.setChannelId(CHANNEL_ID)
.build();
El código correcto será:
Notification.Builder notification=new Notification.Builder(this)
con dependencia 26.0.1 y nuevas dependencias actualizadas como 28.0.0.
Algunos usuarios usan este código en la forma de esto:
Notification notification=new NotificationCompat.Builder(this)//this is also wrong code.
Entonces, la lógica es el método que declarará o iniciará, luego se usará el mismo método en el lado derecho para la asignación. si en Leftside of = utilizará algún método, se utilizará el mismo método en el lado derecho de = para Asignación con nuevo.
Pruebe este código ... seguramente funcionará