Uri sound = Uri.parse(ContentResolver.SCHEME_Android_RESOURCE + "://" + context.getPackageName() + "/" + R.raw.notification_mp3);
mBuilder.setSound(sound);
J'avais copié le fichier mp3 (notification_mp3.mp3) dans le dossier raw du dossier res. Lorsque la notification est déclenchée, le son mp3 est donné jusqu'à Android Nougat mais le son par défaut est dans Android Oreo . J'avais référé de nombreux sites mais rien ne fonctionnait sur Android Oreo . Je n'ai trouvé aucun changement dans Android Docs concernant la notification sonore dans Android O & above. Quelles modifications faut-il apporter pour que ce code fonctionne également dans Android O?
Pour définir un son sur notifications dans Oreo, vous devez définir le son sur NotificationChannel
et non sur Notification Builder
lui-même. Vous pouvez le faire comme suit
Uri sound = Uri.parse(ContentResolver.SCHEME_Android_RESOURCE + "://" + context.getPackageName() + "/" + R.raw.notification_mp3);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel mChannel = new NotificationChannel("YOUR_CHANNEL_ID",
"YOUR CHANNEL NAME",
NotificationManager.IMPORTANCE_DEFAULT)
AudioAttributes attributes = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_NOTIFICATION)
.build();
NotificationChannel mChannel = new NotificationChannel(CHANNEL_ID,
context.getString(R.string.app_name),
NotificationManager.IMPORTANCE_HIGH);
// Configure the notification channel.
mChannel.setDescription(msg);
mChannel.enableLights(true);
mChannel.enableVibration(true);
mChannel.setSound(sound, attributes); // This is IMPORTANT
if (mNotificationManager != null)
mNotificationManager.createNotificationChannel(mChannel);
}
Cela définira un son personnalisé pour vos notifications. Mais si l'application est en cours de mise à jour et que le canal de notification est utilisé auparavant, il ne sera pas mis à jour. c'est-à-dire que vous devez créer un canal différent et y régler le son pour le faire fonctionner. Mais cela affichera plusieurs canaux dans la section des notifications des informations d'application de votre application. Si vous réglez le son sur un tout nouveau canal, c'est correct, mais si vous souhaitez utiliser le canal auparavant, vous devez supprimer le canal existant et recréer le canal. Pour ce faire, vous pouvez faire quelque chose comme ça avant de créer un canal
if (mNotificationManager != null) {
List<NotificationChannel> channelList = mNotificationManager.getNotificationChannels();
for (int i = 0; channelList != null && i < channelList.size(); i++) {
mNotificationManager.deleteNotificationChannel(channelList.get(i).getId());
}
}
Android O est livré avec NotificationChannel
int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "NOTIFICATION_CHANNEL_NAME", importance);
notificationChannel.enableLights(true);
notificationChannel.setLightColor(Color.RED);
notificationChannel.enableVibration(true);
notificationChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
assert mNotificationManager != null;
mBuilder.setChannelId(NOTIFICATION_CHANNEL_ID);
mNotificationManager.createNotificationChannel(notificationChannel);
Créer un canal (j'utilise cette méthode dans Application.clss
pour créer le canal)
public void initChannels(Context context) {
if (Build.VERSION.SDK_INT < 26) {
return;
}
NotificationManager notificationManager =
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
NotificationChannel channel = new NotificationChannel("default"/*CHANNEL ID*/,
"CHANNEL_NAME",
NotificationManager.IMPORTANCE_DEFAULT);
channel.setDescription("Channel description");
assert notificationManager != null;
notificationManager.createNotificationChannel(channel);
}
Et utilisez ce canal default
lors de la création d'une instance de NotificationCompat
.... notificationBuilder = new NotificationCompat.Builder(this,"default") ....
essaye ça:
/**
* show notification
*
* @param message
*/
private static void showNotification(RemoteMessage message, Context baseContext) {
Context context = baseContext.getApplicationContext();
NotificationManagerCompat managerCompat = NotificationManagerCompat.from(context.getApplicationContext());
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, null)
.setSmallIcon(R.drawable.ic_logo_xxxdpi)
.setContentTitle(message.getData().get(TITLE))
.setContentText(message.getData().get(BODY))
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setAutoCancel(true)
.setVibrate(new long[]{500, 500})
.setLights(Color.RED, 3000, 3000)
.setSound(Settings.System.DEFAULT_NOTIFICATION_URI)
.setContentIntent(getPendingIntent(context, message));
managerCompat.notify(getRandom(), builder.build());
}