177 votes

Comment diffuser un son de notification Android

Je me demandais comment je pouvais faire jouer un son de notification sans le faire passer par le flux multimédia. Pour l'instant, je peux le faire via le lecteur multimédia, mais je ne veux pas qu'il soit lu comme un fichier multimédia, je veux qu'il soit lu comme une notification, une alerte ou une sonnerie. Voici un exemple de ce à quoi ressemble mon code pour l'instant :

MediaPlayer mp = new MediaPlayer();
mp.reset();
mp.setDataSource(notificationsPath+ (String) apptSounds.getSelectedItem());
mp.prepare();
mp.start();

439voto

Phidius Points 1551

Si quelqu'un cherche encore une solution à ce problème, j'ai trouvé une réponse à l'adresse suivante Comment jouer la sonnerie/alarme dans Android ?

try {
    Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
    r.play();
} catch (Exception e) {
    e.printStackTrace();
}

Vous pouvez changer TYPE_NOTIFICATION en TYPE_ALARM, mais vous voudrez garder la trace de votre sonnerie r afin d'en arrêter la lecture... disons, lorsque l'utilisateur clique sur un bouton ou autre.

2 votes

Les téléphones Motorola, par exemple, ont étendu l'activité des préférences et permettent à l'utilisateur de définir un son de notification pour les sms et autres catégories. La méthode ci-dessus ne fonctionnera pas avec ce type de téléphones. Avez-vous une idée de la façon de résoudre ce problème ?

2 votes

J'ai eu une erreur avec ça : MediaPlayer - Should have subtitle controller already set . Qu'est-ce que cela signifie ?

0 votes

En utilisant cette solution, après 28/29 fois, les sons s'arrêtent de jouer. Quelqu'un sait-il pourquoi ?

206voto

Rob Riddle Points 854

Vous pouvez maintenant le faire en incluant le son lors de la création d'une notification plutôt que d'appeler le son séparément.

//Define Notification Manager
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

//Define sound URI
Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(getApplicationContext())
        .setSmallIcon(icon)
        .setContentTitle(title)
        .setContentText(message)
        .setSound(soundUri); //This sets the sound to play

//Display notification
notificationManager.notify(0, mBuilder.build());

12 votes

Cela résout un problème différent - pas "comment jouer un son de notification", mais "comment jouer une notification". et afficher un son". La réponse acceptée est justifiée dans sa solution.

7 votes

Peut-être devriez-vous également définir la lecture à travers STREAM_NOTIFICATION afin qu'elle soit jouée avec la préférence de volume de notification actuelle du système d'exploitation : .setSound(soundUri, AudioManager.STREAM_NOTIFICATION)

0 votes

@Rob Riddle Cela fonctionne bien, mais en cas de notifications multiples, par exemple 100 notifications en parallèle, le son est mélangé avec celui de la notification suivante. Logiquement, si le son est déjà en cours de lecture, il devrait attendre la fin de la lecture précédente. Pouvez-vous nous aider dans ce cas ?

48voto

aga Points 4221

Si vous souhaitez qu'un son de notification par défaut soit joué, vous pouvez alors utiliser setDefaults(int) méthode de NotificationCompat.Builder classe :

NotificationCompat.Builder mBuilder =
        new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.ic_notification)
                .setContentTitle(getString(R.string.app_name))
                .setContentText(someText)
                .setDefaults(Notification.DEFAULT_SOUND)
                .setAutoCancel(true);

Je crois que c'est la façon la plus simple d'accomplir votre tâche.

0 votes

Le son n'est pas diffusé lorsque l'application est en arrière-plan. une suggestion ?

14voto

RaguMCA Points 11

Essayez ça :

public void ringtone(){
    try {
        Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
        r.play();
     } catch (Exception e) {
         e.printStackTrace();
     }
}

9voto

copolii Points 2393

Cela fait un moment que votre question a été posée, mais... Avez-vous essayé de définir le type de flux audio ?

mp.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);

Il faut le faire avant de se préparer.

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