2014-10-31 2 views
1

STREAM_RING을 통해 사운드 또는 TTS (Text-To-Speech) 사운드를 재생하려고 할 때 이어폰이 연결되면 사운드가 스피커폰과 이어폰에서 재생됩니다. Android 프레임 워크의 기본 동작 인 것처럼 보이지만 연결했을 때 이어폰에서만 소리를 재생하고 싶습니다.setSpeakerphoneOn의 이상한 AudioManager 동작

따라서 소리를 재생하기 전에 스피커폰 상태를 제어 해보십시오.

AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 
am.setSpeakerphoneOn(false); 

하지만 내 Nexus5 (Kitkat 4.4.4)에서는 작동하지 않습니다. 인터넷 검색 후 AudioManager # setMode (int)를 사용하는 것이 좋습니다. 코드가 이렇게됩니다.

AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 
am.setMode(AudioManager.MODE_IN_CALL); 
am.setSpeakerphoneOn(false); 

기본적으로이 코드는 내 요구 사항에 적용되지만 사운드는 불안정하고 종종 차단됩니다. 그리고 아래의 코드는 완전히 잘되고 사운드는 차단되지 않은 것으로 밝혀졌습니다.

AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 
am.setMode(AudioManager.MODE_INVALID); 
am.setSpeakerphoneOn(false); 

왜 MODE_IN_CALL이 불안정한 사운드를 발생시키고 MODE_INVALID가 제대로 작동하는지 알 수 없습니다. 그리고 AudioManager # setMode (int)를 호출하여 스피커폰을 꺼야하는 이유를 알 수 없습니다.

누구든지 알고 있나요? Android 공식 참조는 이러한 동작에 대해 아무 말도하지 않아서 내가 분명히 이해할 수 없습니다.
물론 나는 < 사용 허가 android : name = "android.permission.MODIFY_AUDIO_SETTINGS"/ >이라고 이미 선언했습니다.

답변

1

스트림을 STREAM_MUSIC으로, 모드를 MODE_NORMAL로 재생하려는 경우 헤드셋을 삽입하고 제거하면 안드로이드 프레임 워크가 스피커폰과 헤드셋으로 오디오 라우팅 만 처리합니다. 개인적으로 setMode (AudioManager.MODE_INVALID)를 사용한 적이 없으며 절대로 MODE를 사용하지 않아야합니다. 위의 코드에서 스트림 유형을 명확하게 알 수 없습니다. 내 Github 레포에서 기본 오디오 라우팅 찾기 : https://github.com/sauravpradhan/Basic-Audio-Routing 코드에 따라 라우팅 논리를 구현할 수 있습니다.