2010-12-14 80 views
130

Je me demandais comment je pouvais lire un son de notification sans le lire sur le flux média. En ce moment, je peux le faire via le lecteur multimédia, mais je ne veux pas qu'il joue comme un fichier multimédia, je veux qu'il joue comme une notification ou une alerte ou une sonnerie. Voici un exemple de ce que mon code ressemble en ce moment:Comment lire un son de notification Android

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

Répondre

337

Si quelqu'un est toujours à la recherche d'une solution à cela, je l'ai trouvé une réponse à How to play ringtone/alarm sound in 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 à TYPE_ALARM, mais vous voulez garder une trace de votre sonnerie r afin d'arrêter le jouer ... disons, quand l'utilisateur clique sur un bouton ou quelque chose.

+1

Motorola téléphones par exemple étendu l'activité des préférences et permet à l'utilisateur de définir un son de notification pour les SMS et d'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? – David

+2

J'ai une erreur avec ceci: 'MediaPlayer - Doit avoir le contrôleur de sous-titre déjà réglé'. Qu'est-ce que ça veut dire? – Deqing

+0

En utilisant cette solution, après 28/29 fois, les sons cessent de jouer. Quelqu'un sait pourquoi? –

1

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

+4

Je ne souhaite pas afficher une notification, je veux seulement jouer le son. – ninjasense

0

Je pense que le concept de «son de notification» est en quelque sorte erroné pour l'interface utilisateur Android.

Le comportement attendu d'Android consiste à 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, peut-être que j'ai des problèmes d'audition?").

Comment configurer son sur une notification est, par exemple, ici: Setting sound for notification

+0

Pas vraiment, cela peut être une notification intégrée à l'application. Par exemple, si vous êtes dans une application de discussion et que vous avez de petits effets sonores pour les messages entrants et sortants. Ce sont des notifications essentiellement et vous voulez qu'ils se taisent lorsque le téléphone est en mode silencieux. – copolii

+0

Eh bien, vous avez raison, mais c'est une autre chose. Je parlais (en supposant que c'était le sujet de la question) de "sons de notification du système", c'est sur l'interface graphique Android du système. Bien sûr, lorsque vous êtes dans votre propre application, comme tout à vous. – think01

9

Cela a été un moment que votre question, mais ... Avez-vous essayé de placer le type de flux audio?

mp.setAudioStreamType(AudioManager.STREAM_NOTIFICATION); 

Cela doit être fait avant la préparation.

1

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 à peu près 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 peu de peaufinage 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 dans com.globalmentor.android.app.Notifications.java qui vous permettent de créer un son de notification comme ceci:

Notifications.notify(this); 

La LED clignote également et, si vous avez la permission vibrent, 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 réaliser que, puisque la notification disparaîtra de toute façon, vous pourriez aussi bien avoir un message défilant 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 Subversion repository et le construire avec Maven. Cela dépend du globalmentor-core library, qui peut également être construit et installé avec Maven.

+0

C'est compliqué de jouer simplement un son. Vous pouvez simplement faire ceci: http://stackoverflow.com/a/9622040/1417267 – slinden77

193

Vous pouvez maintenant le faire en incluant le son lors de la création d'une notification au lieu 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()); 
+11

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

+6

Peut-être devriez-vous également régler ceci pour lire 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

+0

@Rob Riddle Fonctionne correctement. mais en cas de notifications multiples, par ex. 100 notifications parallèles au son se mélangent avec le son de notification suivant. logiquement, si le son est déjà joué, il devrait attendre la fin de la lecture précédente. Pouvez-vous s'il vous plaît aider dans ce scénario? –

7

Essayez ceci:

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

Si vous voulez un son de notification par défaut à jouer, vous pouvez 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 le plus facile façon d'accomplir votre tâche.