34 votes

Notification sonore sur l'API 26

J'ai un son mp3 personnalisé que j'utilise pour mes notifications. Il fonctionne bien sur tous les appareils en dessous de l'API 26. J'ai essayé de définir le son sur le canal de notification également, mais cela ne fonctionne toujours pas. Il joue le son par défaut.

NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelId)
            .setAutoCancel(true)
            .setSmallIcon(R.drawable.icon_push)
            .setColor(ContextCompat.getColor(this, R.color.green))
            .setContentTitle(title)
            .setSound(Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.notification))
            .setDefaults(Notification.DEFAULT_VIBRATE)
            .setStyle(new NotificationCompat.BigTextStyle().bigText(message))
            .setContentText(message);
        Notification notification = builder.build();
        NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            NotificationChannel channel = new NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_DEFAULT);
            AudioAttributes audioAttributes = new AudioAttributes.Builder()
                    .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                    .setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
                    .build();
            channel.setSound(Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.notification), audioAttributes);
            notificationManager.createNotificationChannel(channel);
        }
        notificationManager.notify(1, notification);

0 votes

Avez-vous rendu le son de notification par défaut muet ? Je suis également confronté au même problème. Je ne veux pas jouer de son sur la notification avec NotificationManager.IMPORTANCE_MAX. Pouvez-vous m'aider à résoudre ce problème ?

0 votes

La seule façon dont j'ai réussi à le faire fonctionner était avec RingtoneManager, mais je l'ai supprimé de mon code. Avec RingtoneManager, les utilisateurs ne peuvent pas couper les notifications. Mon application utilise le son par défaut sur Android 8. Je ne sais toujours pas comment faire fonctionner un son personnalisé avec les canaux.

52voto

Paweł Nadolski Points 2320

Vous avez peut-être créé le canal à l'origine avec un son par défaut. Une fois la chaîne créée, elle ne peut pas être modifiée. Vous devez soit réinstaller l'application, soit créer une chaîne avec un nouvel ID de chaîne.

2 votes

Pour modifier l'importance, le son, les lumières, les vibrations, l'écran de verrouillage ou le paramètre DND, désinstallez l'application et réinstallez-la pour effacer le canal. Voir developer.Android.com/guide/topics/ui/notifiers/ , section intitulée "Suppression d'un canal de notification".

0 votes

Cela m'a incité à abandonner tous les canaux existants et à créer un "ChannelManager" pour gérer les canaux et la configuration pendant l'initialisation de l'application.

0 votes

C'est bizarre. L'utilisateur n'est-il pas autorisé à modifier le son de notification de la chaîne dans les paramètres ?

16voto

J'ai utilisé RingtoneManager, et ça marche pour moi. Essayez ce code :

 NotificationCompat.Builder builder = new NotificationCompat.Builder(MainActivity.this);
    builder.setSmallIcon(android.R.drawable.ic_dialog_alert);
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com/"));
    PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);
    builder.setContentIntent(pendingIntent);
    builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher));
    builder.setContentTitle("Notification title");
    builder.setContentText("Notification message.");
    builder.setSubText("Url link.");

    try {
        Uri notification = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.custom_ringtone);
        Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
        r.play();
    } catch (Exception e) {
        e.printStackTrace();
    }

    NotificationManager notificationManager = (NotificationManager) this.getSystemService(NOTIFICATION_SERVICE);
    notificationManager.notify(1, builder.build());

0 votes

D'après mon expérience, cela revient à rejouer le son encore et encore.

7 votes

Le problème avec cette solution est que les utilisateurs ne peuvent pas couper le son de la notification. Le son est toujours émis.

4 votes

NotificationCompat.Builder(Context) est déprogrammé, les notifications doivent spécifier un Id de NotificationChannel en utilisant NotificationCompat.Builder(context, String) . Ce n'est donc pas la meilleure solution pour Oreo / API 26.

2voto

Chris Points 72

Dans Oreo, vous devez créer un canal pour cela. https://developer.Android.com/reference/Android/app/NotificationChannel.html

1voto

Towfik Alrazihi Points 382

Le son par défaut a priorité sur tout autre son.

Vous devez mettre ceci dans votre code :

notification.defaults = Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE;

Référence :

Notifications Android

6 votes

Vous devez effacer les canaux de test soit en réinstallant l'application, soit en effaçant les données associées à votre application avant d'ajouter ce code ! !!!.

0 votes

Ok. Je vais réessayer ce soir. Merci.

0voto

Nolesh Points 1353

En plus de la réponse du Faxriddin, vous pouvez déterminer à quel moment vous devez désactiver le son de la notification en vérifiant les paramètres suivants importance of the notification channel y are enabled notifications paramètres.

NotificationChannel channel = notificationManager.getNotificationChannel(NOTIFICATION_CHANNEL_ID);
if(notificationManager.areNotificationsEnabled() && channel.getImportance() != NotificationManager.IMPORTANCE_NONE) {
  try {
     Ringtone r = RingtoneManager.getRingtone(ctx, soundUri);
     r.play();
  } catch (Exception e) { }
}

1 votes

Meilleur test : channel.getSound() == null au lieu de importance

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X