web-dev-qa-db-fra.com

Le son de notification personnalisé ne fonctionne pas dans Oreo

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?

10
Ashish John

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());
            }
        }
15
Ankush

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);
0
LadyEinstien

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") ....
0
Jay Thummar

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());
}
0
VIKAS SHARMA