2011-06-24 8 views

Odpowiedz

67
public void playSound(Context context) throws IllegalArgumentException, 
               SecurityException, 
               IllegalStateException, 
               IOException { 

    Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
    MediaPlayer mMediaPlayer = new MediaPlayer(); 
    mMediaPlayer.setDataSource(context, soundUri); 
    final AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 

    if (audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) { 
     mMediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM); 
     mMediaPlayer.setLooping(true); 
     mMediaPlayer.prepare(); 
     mMediaPlayer.start(); 
    } 
} 

znalazłem inną odpowiedź: Przejście

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

kredytowej https://stackoverflow.com/a/9622040/737925

+6

Użyłem tego kodu i denerwowało mnie, że dźwięk powtórzył się. Teraz widzę problem: 'mMediaPlayer.setLooping (true);' Dlaczego miałbyś chcieć, aby ten dźwięk był w pętli? –

+3

@ SimonAndréForsberg zależy od pożądania programisty. –

+1

Czy to ważne, że mMediaPlayer wykracza poza zakres i jest dostępny do zebrania śmieci przed zakończeniem odtwarzania dźwięku, lub czy dźwięk jest już przekazywany do komponentów niższego poziomu, które zapewnią jego zakończenie przez wywołanie 'mMediaPlayer.start()'? – ahcox

71

... użyć domyślnego android sygnał dźwiękowy (jak podczas regulacji głośności dzwonka) ..

Na moim Cyanogen 7 Nexus One i moim starym Zdjęcie T-Mobile Pulse Mini (ten ostatni z pamięci), tak daleko, jak słyszę, to jest dokładnie to, dźwięk domyślny sygnał na zmiany objętości:

 final ToneGenerator tg = new ToneGenerator(AudioManager.STREAM_NOTIFICATION, 100); 
    tg.startTone(ToneGenerator.TONE_PROP_BEEP); 

Wydaje się, że z prośbą o alternatywę do ToneGenerator, ale myślę, że daje ci dokładnie to, czego chcesz w dwóch liniach.

Oto niektóre inne prawdopodobne ToneGenerator brzmi próbowałem które nie były mecze (dwa pierwsze mogą być użyteczne jako zastępców sygnale objętość):

 // Double beeps:  tg.startTone(ToneGenerator.TONE_PROP_ACK); 
    // Double beeps:  tg.startTone(ToneGenerator.TONE_PROP_BEEP2); 
    // Sounds all wrong: tg.startTone(ToneGenerator.TONE_CDMA_KEYPAD_VOLUME_KEY_LITE); 
+0

Najlepiej byłoby użyć ciągłego dźwięku, takiego jak te z ToneGenerator.TONE_DTMF_0 do ToneGenerator.TONE_DTMF_S, albo dźwięk sygnału dźwiękowego przerwie i rozpocznie się ponownie w oparciu o wybrany opis brzmienia. Stanie się tak, jeśli długość durationMs (przekazywana jako parametr w tonacji startTone (int tonType, int durationMs) jest większa niż czas trwania całego sygnału dźwiękowego – ungalcrys

+0

Hi @ungalcrys, nie jestem w stanie ponownie sprawdzić tego w tej chwili, ale pytający poprosił o "domyślny sygnał dźwiękowy Android (jak przy regulacji głośności dzwonka)". Kiedy testowałem, to był dokładnie ten, który podaję powyżej: 'ToneGenerator.TONE_PROP_BEEP'. – ahcox

+0

Ktoś miał jakieś problemy z S6 Edge? ToneGenerator działa dobrze w S6, ale S6 Edge nic mi nie daje –

0

łatwym sposobem jest użycie instancji moduł brzmieniowy Classe :

//declaration 
    ToneGenerator toneG; 
    //using any where` 
    if(val>=taux_max) 
    { 
     taux_text.setTextColor(warnning_col); 
     toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 200); //200 is duration in ms 
    }