Comment lire un son de notification Android

169

Je me demandais comment je pouvais lire un son de notification sans le lire sur le flux multimédia. Pour le moment, je peux le faire via le lecteur multimédia, mais je ne veux pas qu'il soit lu en tant que fichier multimédia, je veux qu'il soit lu comme une notification, une alerte ou une sonnerie. voici un exemple de ce à quoi mon code ressemble en ce moment:

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

Réponses:

421

Si quelqu'un cherche toujours une solution à cela, j'ai trouvé une réponse à Comment jouer la sonnerie / le son d'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 une trace de votre Ringtone r afin d'arrêter de la jouer ... par exemple, lorsque l'utilisateur clique sur un bouton ou quelque chose.

Phidius
la source
2
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éphone. Avez-vous une idée de la façon de résoudre ce problème?
David le
2
Je suis un avec cette erreur: MediaPlayer - Should have subtitle controller already set. Qu'est-ce que ça veut dire?
Deqing
En utilisant cette solution, après 28/29 fois, les sons cessent de jouer. Quelqu'un sait pourquoi?
Tom Brinkkemper
1
Pourquoi attrapez-vous chaque exception? Lequel peut être jeté?
Miha_x64
2
@Sam, oui. stackoverflow.com/q/39876885/2614353.Ne créez pas d'objet RingTone à chaque fois que vous le jouez. Créez-le une fois, puis lisez le même objet plusieurs fois.
Tom Brinkkemper
205

Vous pouvez maintenant le faire en incluant le son lors de la création d'une notification plutôt qu'en appelant 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());
Rob Riddle
la source
12
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.
Fabian Tamp
7
Peut-être devriez-vous également le configurer pour qu'il joue via STREAM_NOTIFICATION afin qu'il soit lu avec la préférence de volume de notification actuelle du système d'exploitation: .setSound (soundUri, AudioManager.STREAM_NOTIFICATION)
mwk
@Rob Riddle Cela fonctionne bien. mais en cas de notifications multiples, par exemple 100 notifications parallèles, le son est mélangé avec le prochain son de notification. logiquement, si le son est déjà en cours de lecture, il doit attendre la fin de la lecture précédente. Pouvez-vous s'il vous plaît aider dans ce scénario?
Waqas Ali Razzaq le
ne joue pas le son lorsque l'application est en arrière-plan. toute suggestion?
Sagar Nayak
47

Si vous voulez qu'un son de notification par défaut soit joué, vous pouvez utiliser la méthode setDefaults (int) de la NotificationCompat.Builderclasse:

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 pense que c'est le moyen le plus simple d'accomplir votre tâche.

aga
la source
ne joue pas le son lorsque l'application est en arrière-plan. toute suggestion?
Sagar Nayak
13

Essaye ç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();
     }
}
Ragu
la source
9

Cela fait un moment depuis votre question, mais ... Avez-vous essayé de régler le type de flux audio?

mp.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);

Cela doit être fait avant de se préparer.

copolii
la source
2

J'avais à peu près la même question. Après quelques recherches, je pense que si vous voulez jouer le "son de notification" du système par défaut, vous devez pratiquement afficher une notification et lui dire d'utiliser le son par défaut. Et il y a quelque chose à dire pour l'argument dans certaines des autres réponses que si vous jouez un son de notification, vous devriez également présenter un message de notification.

Cependant, un petit ajustement de l'API de notification et vous pouvez vous rapprocher de ce que vous voulez. Vous pouvez afficher une notification vide, puis la supprimer automatiquement après quelques secondes. Je pense que cela fonctionnera pour moi; peut-être que cela fonctionnera pour vous.

J'ai créé un ensemble de méthodes pratiques com.globalmentor.android.app.Notifications.javaqui vous permettent de créer un son de notification comme celui-ci:

Notifications.notify(this);

La LED clignotera également et, si vous avez l'autorisation de vibrer, une vibration se produira. Oui, une icône de notification apparaîtra dans la barre de notification mais disparaîtra après quelques secondes.

À ce stade, vous pouvez vous rendre compte que, puisque la notification disparaîtra de toute façon, vous pourriez aussi bien avoir un message de défilement dans la barre de notification; vous pouvez le faire comme ceci:

Notifications.notify(this, 5000, "This text will go away after five seconds.");

Il existe de nombreuses autres méthodes pratiques dans cette classe. Vous pouvez télécharger la bibliothèque entière à partir de son référentiel Subversion et la construire avec Maven. Cela dépend de la bibliothèque globalmentor-core, qui peut également être construite et installée avec Maven.

Garret Wilson
la source
C'est beaucoup trop compliqué de jouer simplement un son. Vous pouvez simplement faire ceci: stackoverflow.com/a/9622040/1417267
slinden77
1

Vous pouvez utiliser Notification et NotificationManager pour afficher la notification souhaitée. Vous pouvez ensuite personnaliser le son que vous souhaitez jouer avec votre notification.

Valentin Rocher
la source
5
Je ne souhaite pas afficher de notification, je souhaite uniquement jouer le son.
ninjasense
1

Je pense que le concept de "son de notification" est quelque peu faux pour l'interface utilisateur Android.

Le comportement attendu d'Android est d'utiliser la notification standard pour alerter l'utilisateur. Si vous jouez un son de notification sans l'icône de la barre d'état, l'utilisateur est confus ("quel était ce son? Il n'y a pas d'icône ici, j'ai peut-être des problèmes d'audition?").

Comment définir le son sur une notification est, par exemple, ici: Définition du son pour la notification

think01
la source
1
Pas vraiment, cela peut être une notification dans l'application. Par exemple, si vous êtes dans une application de chat et que vous avez de petits effets sonores pour les messages entrants et sortants. Ce sont essentiellement des notifications et vous voulez qu'elles se taisent lorsque le téléphone est en mode silencieux.
copolii le
Eh bien, vous avez raison mais c'est autre chose. Je parlais (en supposant que c'était le sujet de la question) de "sons de notification système", c'est-à-dire sur l'interface graphique Android du système. Bien sûr, lorsque vous êtes dans votre propre application, comme tout dépend de vous.
think01
1
Intent intent = new Intent(this, MembersLocation.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.putExtra("type",type);
    intent.putExtra("sender",sender);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
            PendingIntent.FLAG_ONE_SHOT);

    String channelId = getString(R.string.default_notification_channel_id);

    Uri Emergency_sound_uri=Uri.parse("android.resource://"+getPackageName()+"/raw/emergency_sound");
   // Uri Default_Sound_uri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    if(type.equals("emergency"))
    {
        playSound=Emergency_sound_uri;
    }
    else
    {
        playSound= Settings.System.DEFAULT_NOTIFICATION_URI;
    }

    NotificationCompat.Builder notificationBuilder =
            new NotificationCompat.Builder(this, channelId)
                    .setSmallIcon(R.drawable.ic_notification)
                    .setContentTitle(title)
                    .setContentText(body)
                    .setSound(playSound, AudioManager.STREAM_NOTIFICATION)
                    .setAutoCancel(true)
                    .setColor(getColor(R.color.dark_red))
                    .setPriority(NotificationCompat.PRIORITY_HIGH)
                    .setContentIntent(pendingIntent);

   // notificationBuilder.setOngoing(true);//for Android notification swipe delete disabling...

    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    // Since android Oreo notification channel is needed.
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationChannel channel = new NotificationChannel(channelId,
                "Channel human readable title",
                NotificationManager.IMPORTANCE_HIGH);
        AudioAttributes att = new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_NOTIFICATION)
                .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
                .build();
        channel.setSound(Emergency_sound_uri, att);
        if (notificationManager != null) {
            notificationManager.createNotificationChannel(channel);
        }
    }

    if (notificationManager != null) {
        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
    }
}
dsc clg
la source
1
Merci pour cet extrait de code, qui pourrait fournir une aide limitée et immédiate. Une explication appropriée améliorerait considérablement sa valeur à long terme en montrant pourquoi c'est une bonne solution au problème et la rendrait plus utile aux futurs lecteurs avec d'autres questions similaires. Veuillez modifier votre réponse pour ajouter des explications, y compris les hypothèses que vous avez formulées.
NOhs
0

Définir le son sur le canal de notification

        Uri alarmUri = Uri.fromFile(new File(<path>));

        AudioAttributes attributes = new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_ALARM)
                .build();

        channel.setSound(alarmUri, attributes);
Milind Chaudhary
la source