2010-12-14 20 views
130

Zastanawiam się, jak mogę odtwarzać dźwięk powiadomienia bez odtwarzania go w strumieniu multimediów. Teraz mogę to zrobić za pomocą odtwarzacza multimedialnego, ale nie chcę, aby grał jako plik multimedialny, chcę, aby grał jako powiadomienie lub alert lub dzwonek. Herezje przykład tego, co mój kod wygląda teraz:Jak odtwarzać dźwięk powiadomienia z Androidem

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

Odpowiedz

337

Jeśli ktoś nadal szuka rozwiązania tego problemu, znalazłem odpowiedź na 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(); 
} 

można zmienić TYPE_NOTIFICATION do TYPE_ALARM, ale będziemy chcieli śledzić dzwonek R w celu powstrzymania grając ... powiedz, kiedy użytkownik kliknie przycisk lub coś podobnego.

+1

Telefony Motorola na przykład rozszerzyły aktywność preferencji i pozwalają użytkownikowi zdefiniować dźwięk powiadomienia dla sms i innych kategorii. Powyższa metoda nie zadziała w przypadku tego typu telefonów. Czy masz pomysł, jak rozwiązać ten problem? – David

+2

Otrzymałem komunikat o błędzie: 'MediaPlayer - Powinien mieć już ustawiony kontroler napisów'. Co to znaczy? – Deqing

+0

Po użyciu tego rozwiązania dźwięki przestaną być odtwarzane po 28/29 razach. Ktoś wie dlaczego? –

1

Można użyć Notification i NotificationManager wyświetlać powiadomienia chcesz. Następnie możesz dostosować dźwięk, który chcesz odtwarzać, za pomocą powiadomienia.

+4

Nie chcę wyświetlać powiadomienia, chcę tylko odtwarzać dźwięk. – ninjasense

0

Myślę, że koncepcja "dźwięku powiadomień" jest w jakiś sposób niewłaściwa dla interfejsu użytkownika Androida.

Oczekiwanym przez system Android zachowaniem jest używanie standardowego Powiadomienia do ostrzegania użytkownika. Jeśli odtwarzasz dźwięk powiadomienia bez ikony paska stanu, użytkownik jest zdezorientowany ("co to za dźwięk, nie ma tu ikony, może mam problemy ze słuchem?").

Jak ustawić dźwięk na powiadomienia jest na przykład tutaj: Setting sound for notification

+0

Niezupełnie, może to być powiadomienie w aplikacji. Na przykład, jeśli korzystasz z aplikacji do czatu i masz małe efekty dźwiękowe dla wiadomości przychodzących i wychodzących. To są powiadomienia w skrócie i chcesz je zamknąć, gdy telefon jest w trybie cichym. – copolii

+0

Masz rację, ale to już inna sprawa. Rozmawiałem (zakładając, że to jest temat na pytanie) o "dźwiękach powiadomień systemowych", czyli w systemie Android GUI. Oczywiście, gdy jesteś w swojej własnej aplikacji, tak jak wszystko do ciebie. – think01

9

Minęło trochę czasu od Twojego pytania, ale ... Czy próbowałeś ustawić typ strumień audio?

mp.setAudioStreamType(AudioManager.STREAM_NOTIFICATION); 

Należy to zrobić przed przygotowaniem.

1

Miałem prawie to samo pytanie. Po pewnych badaniach uważam, że jeśli chcesz grać w domyślny system "dźwięk powiadomienia", musisz wyświetlić powiadomienie i nakazać mu użycie dźwięku domyślnego. I jest coś do powiedzenia na temat argumentu w niektórych innych odpowiedziach, że jeśli odtwarzasz dźwięk powiadomienia, powinieneś również przedstawić komunikat z powiadomieniem.

Jednak niewielka korekta interfejsu API powiadomień pozwala zbliżyć się do tego, co chcesz. Możesz wyświetlić puste powiadomienie, a następnie usunąć je automatycznie po kilku sekundach. Myślę, że to zadziała dla mnie; może to zadziała dla ciebie.

Utworzyłem zbiór metod wygody w com.globalmentor.android.app.Notifications.java które pozwalają stworzyć dźwięk powiadomienia tak:

Notifications.notify(this); 

Dioda będzie migać, a jeśli masz pozwolenie wibracji, wystąpią drgania. Tak, ikona powiadomienia pojawi się na pasku powiadomień, ale zniknie po kilku sekundach.

W tym momencie możesz zauważyć, że skoro powiadomienie zniknie, możesz równie dobrze mieć przewijany pasek informacyjny na pasku powiadomień; możesz to zrobić w ten sposób:

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

Jest wiele innych wygodnych metod w tej klasie. Możesz pobrać całą bibliotekę z jej Subversion repository i zbudować ją przy pomocy Mavena. To zależy od modelu globalmentor-core library, który można również zbudować i zainstalować za pomocą Mavena.

+0

To jest skomplikowane, aby po prostu odtwarzać dźwięk. Można to zrobić po prostu: http://stackoverflow.com/a/9622040/1417267 – slinden77

193

Teraz możesz to zrobić, dołączając dźwięk podczas budowania powiadomienia, zamiast dzwonić osobno.

//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

Rozwiązuje to inny problem - nie "jak odtwarzać dźwięk powiadomienia", ale "jak odtwarzać powiadomienie * i * wyświetlać dźwięk". Przyjęta odpowiedź jest uzasadniona w rozwiązaniu. –

+6

Być może powinieneś ustawić tę opcję, aby odtwarzać przez STREAM_NOTIFICATION, więc jest odtwarzana z preferencją woluminu bieżącego powiadomienia systemu: .setSound (soundUri, AudioManager.STREAM_NOTIFICATION) – mwk

+0

@Rob Riddle Działa poprawnie. ale w przypadku wielokrotnych powiadomień, np. 100 powiadomień jest równoległych do dźwięku, który miesza się z następnym dźwiękiem powiadomienia. logicznie, jeśli dźwięk już gra, powinien poczekać na zakończenie poprzedniej gry. Czy możesz pomóc w tym scenariuszu? –

7

Spróbuj tego:

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

Jeśli chcesz dźwięk domyślny powiadomienia mają być odtwarzane, a następnie można użyć setDefaults(int) metoda NotificationCompat.Builder Klasa:

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

wierzę, że to najłatwiejszy sposób, aby wykonać swoje zadanie.

Powiązane problemy