2010-01-03 12 views
10

Witam Jestem nowy w tym. Mój projekt samouczący to niewielka aplikacja, która odtwarza strumień wiadomości audio. Aby aplikacja działała skutecznie, musi przerwać aktualnie odtwarzane odtwarzacze multimedialne (np. Last FM, Imeem, odtwarzacz muzyki, Spotify itp.).Android - czy mogę wyciszyć aktualnie odtwarzane aplikacje audio?

Nie wiem, co będzie odtwarzane lub jaka aplikacja będzie to odtwarzać, ale chcę poprosić ich wszystkich o wstrzymanie, dopóki nie skończę. Brzmi raczej odważnie, wiem, ale musi to być możliwe, ponieważ kiedy przychodzi połączenie, to w zasadzie to się dzieje.

Czy mogę wysłać wiadomość do wszystkich odtwarzaczy audio, prosząc ich o zatrzymanie się na chwilę? Czy mogę podrobić połączenie przychodzące, tylko na czas, jaki to zajmie?

Dzięki.

Odpowiedz

18

obsługi audio na Androida będzie dość straszne na chwilę. Interfejsy API są dość dziwne, słabo udokumentowane i ciągle się zmieniają/wycofują/zrywają między wersjami. Nawet kod AudioManager ma w sobie FIXME.

W systemie Android dostępnych jest kilka typów strumieni (muzyka, powiadomienia, połączenia telefoniczne itp.), A aplikacje służą do wyboru odpowiedniego do odtwarzania. Wyobrażam sobie, że większość aplikacji na Androida powinna używać muzyki/mediów (STREAM_TYPE_MUSIC). Ustawiono to na swoim MediaPlayer przy użyciu metody setAudioStreamType.

SDK nie pozwala na ustawienie pojedynczego strumienia typ jako solowy — powodując wszystkie inne strumienie być wyciszony — ale nie wierzę, można zidentyfikować dźwięku odtwarzanego przez poszczególne aplikacje i jakoś wstrzymać/wznawiają to. aplikacje muzyczne w ogóle użyje PhoneStateListener, aby wstrzymać się po nadejściu połączenia.

Więc w twoim przypadku można „pożyczyć” strumień telefon do swojej MediaPlayer i użyć wywołanie metody AudioManager.setStreamSolo(AudioManager.STREAM_VOICE_CALL, true) kiedy rozpoczyna odtwarzanie, a następnie un -solo strumień z false po zakończeniu odtwarzania lub po wykonaniu Activity.

mogę powiedzieć, że to działa, ale nie mogę sobie przypomnieć, czy bezceremonialny musisz też ustawić tryb dźwięku do MODE_IN_CALL przy użyciu strumienia połączeń głosowych (tak: AudioManager.setMode(AudioManager.MODE_IN_CALL)). Jeśli okaże się to konieczne, musisz upewnić się, że po zakończeniu odtwarzania przywrócisz tryb do MODE_NORMAL, w przeciwnym razie, gdy naciśniesz klawisze głośności, usłyszysz "Głośność podczas połączenia"! Jednak, czy i kiedy chcesz zmieniać z powrotem do MODE_NORMAL, należy sprawdzić, czy prawdziwa rozmowa telefoniczna nie dzieje się w tym czasie ...

Być może można użyć innego rodzaju strumienia zamiast jednego połączenia głosowego, ale mówię tylko z doświadczenia w pracy nad aplikacją, która może korzystać z głośnika lub słuchawki do odtwarzania dźwięku, który wymaga użycia strumienia połączenia głosowego.

Tak jak mówiłem, obsługa audio nie jest szczególnie zabawne ...;)

+0

Thanks Christophera, twoja rada była na miejscu. W rzeczywistości porwałem STREAM_ALARM, który pasuje do mojego celu, ustawiłem go na solo, a to przynosi pożądany efekt. Dzięki jeszcze raz. –

+0

Ups, niezbyt dobry pomysł, przynajmniej nie ze słuchawkami. Wróć do VOICE_CALL. Wydaje się, że nie potrzebujesz MODE_IN_CALL, przynajmniej nie do tej pory. –

0

Można spróbować AudioManager.adjustVolume metodę:

AudioManager audioMan = 
    (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
audioMan.adjustVolume(AudioManager.ADJUST_LOWER, 
    AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE); 
6

To było 2 lata.Ale mam nadzieję, że może to komuś pomóc:

AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
am.setStreamMute(AudioManager.STREAM_MUSIC, true); 

Uwaga: jeśli zadzwonisz setStreamMute(int, boolean) aby wyciszyć strumień n razy trzeba to nazwać n razy ponownie, aby ponownie włączyć (użyj false).

+0

to działa dobrze dziękuję :) – Ramz

2
+0

Jedynym problemem jest to, że inne aplikacje nie honorują prośby o dźwiękową ostrość. – StackOverflowed

+1

prawda, ale jeśli używasz flag TRANSIENT, większość będzie. Wszyscy powinniśmy starać się być dobrymi fokusowymi obywatelami! – yano