2010-01-03 7 views
10

안녕하세요, 저는이 문제에 익숙하지 않습니다. 내 독학 프로젝트는 오디오 뉴스 스트림을 재생하는 작은 응용 프로그램입니다. 효과적이기 위해서는 응용 프로그램이 현재 재생중인 미디어 플레이어 (예 : Last FM, Imeem, 음악 플레이어, Spotify 등)를 방해해야합니다.Android - 현재 재생중인 오디오 응용 프로그램을 음소거 할 수 있습니까?

재생할 항목이나 재생할 응용 프로그램을 알 수는 없지만 수행 할 때까지 일시 중지하도록 요청하고 싶습니다. 차라리 대담한 것처럼 들리지만, 가능해야합니다. 들어오는 호출이있을 때 기본적으로 발생하기 때문입니다.

잠시 멈추라는 메시지를 모든 오디오 플레이어에 보낼 수 있습니까? 걸려온 전화를 스푸핑 할 수 있을까요?

감사합니다.

답변

18

오디오 처리 잠시 동안 꽤 무서운 될 것입니다. API는 매우 이상하고, 문서화가 잘되어 있지 않으며 버전 간 변경/사용 중단/중단을 유지합니다. AudioManager 코드에도 FIXME가 포함되어 있습니다.

어쨌든 Android에는 여러 가지 스트림 유형이 있습니다 (음악, 알림, 전화 통화 등). 응용 프로그램은 재생을 위해 적절한 스트림을 선택합니다. 대부분의 Android 앱이 음악/미디어 유형 (STREAM_TYPE_MUSIC)을 사용해야한다고 생각합니다. 이것을 MediaPlayersetAudioStreamType 방법을 사용하여 설정합니다.

이 SDK는 다른 모든 스트림 —를 음소거 할 수 있지만, 난 당신이 일시 정지 어떻게 든 오디오를 식별 할 수있는 특정 응용 프로그램에서 재생되는 및 믿지 않는 원인 솔로 —로 단일 스트림을 유형을 설정할 수 않습니다/일시 중지 해제 그것. 일반적으로 음악 응용 프로그램은 경우에 따라서

, 당신은 당신의 MediaPlayer의 전화 통화 스트림을 "빌려"수 있습니다. 전화가 걸려 올 때 자신을 일시 중지 PhoneStateListener를 사용하여 재생 후, 취소를 시작할 때 메소드 호출 AudioManager.setStreamSolo(AudioManager.STREAM_VOICE_CALL, true)를 사용합니다 재생시 false 또는 Activity이 완료되면 스트림이 재생됩니다.

나는이 작품 있음을 알 수 있습니다,하지만 난 (같이 : AudioManager.setMode(AudioManager.MODE_IN_CALL)) 음성 통화 스트림을 사용하는 경우 당신은 또한 MODE_IN_CALL에 오디오 모드를 설정해야하는지 여부를 즉석 기억할 수 없습니다. 필요한 경우 재생이 완료되면 MODE_NORMAL으로 모드를 되돌려 보내야합니다. 그렇지 않으면 볼륨 하드 키를 누를 때마다 '통화 중 음량'이라고 표시됩니다. 그러나 MODE_NORMAL으로 다시 변경하려면 해당 시간에 정품 전화가 걸려 있지 않은지 확인해야합니다 ...

음성 통화 대신 다른 유형의 전화를 사용할 수도 있습니다. 스피커폰이나 이어 피스를 사용하여 오디오 재생을 할 수있는 응용 프로그램에서 일하는 경험을 말하면서 음성 통화 스트림을 사용해야합니다. 내가 말했듯이

는 오디오 처리는 ... 특히 재미 없어)

+0

감사합니다 크리스토퍼을 참조 AudioManager.requestAudioFocus(...) 방법

을 사용하는 것입니다, 당신의 조언은 그 자리에 있었다. 실제로 목적을 달성 한 STREAM_ALARM을 납치했습니다.이를 솔로로 설정하면 원하는 효과가 있습니다. 다시 한번 감사드립니다. –

+0

그런 생각은 아니지만 적어도 헤드폰은 아닙니다. VOICE_CALL (으)로 돌아 가기. 적어도 지금까지는 MODE_IN_CALL이 필요하지 않은 것 같습니다. –

0

당신은 AudioManager.adjustVolume 방법을 시도 할 수 있습니다 안드로이드에

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

은 2 년이되었습니다.그러나 나는이 사람을 도울 수있는 희망 :

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

참고 : 스트림을 N 시간을 음소거 setStreamMute(int, boolean)를 호출하는 경우, 당신은 (false 사용) 음소거 해제 N 번 다시 호출해야합니다.

+0

잘 작동합니다. 감사합니다. – Ramz

2
+0

다른 앱이 오디오 포커스 요청을 따르지 않는 경우에만 문제가 있습니다. – StackOverflowed

+1

사실, TRANSIENT 플래그를 사용하면 대부분이됩니다. 우리는 모두 훌륭한 오디오 포커스 시민이되기 위해 노력해야합니다! – yano