AudioManager란?
AudioManager는 안드로이드에서 오디오 장치 제어, 상태 관리를 하는 시스템 서비스입니다
보통 이럴 때 사용합니다
- 블루투스, 이어폰, 수화기, 스피커 등 오디오 출력 장치 전환
- 마이크 음소거, 볼륨 제어
- 오디오 모드 설정 (MODE_NORMAL, MODE_IN_CALL, MODE_IN_COMMUNICATION 등)
⚠️ isSpeakerphoneOn의 deprecated
Android 14 (API 34, UpsideDownCake)부터 audioManager.isSpeakerphoneOn과 audioManager.setSpeakerphoneOn()이 deprecated 됐습니다..
이전 방식은 스피커폰이 켜져 있다는 단일 상태만 다뤘지만, 다양한 오디오 장치가 나온 만큼, 어떤 장치로 출력 시킬지 정하는 방식이 되었어요
이제는 availableCommunicationDevices 리스트를 통해 사용 가능한 오디오 장치들을 가져와서 직접 설정을 해줘야해요
아래 예시는 스피커 모드 on / off 입니다
private fun toggleSpeakerMode(turnOn: Boolean) {
val audioManager = requireContext().getSystemService(Context.AUDIO_SERVICE) as AudioManager
audioManager.mode = AudioManager.MODE_IN_COMMUNICATION
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
var speakerDevice: AudioDeviceInfo? = null
val devices = audioManager.availableCommunicationDevices
for (device in devices) {
if (device.type == AudioDeviceInfo.TYPE_BUILTIN_SPEAKER) {
speakerDevice = device
break
}
}
if (speakerDevice != null) {
if (turnOn) {
audioManager.setCommunicationDevice(speakerDevice)
//특정 오디오 장치로 통화 음성을 출력
} else {
audioManager.clearCommunicationDevice()
}
}
} else {
// 구버전 호환
audioManager.isSpeakerphoneOn = turnOn
}
}
이제 출력장치를 정할 수 있는데, 단말기로 볼륨을 조절 할 때는 사용하고 있는 Stream의 볼륨이 조절됩니다
stream의 종류는 아래와 같습니당
stream 종류 | 설명 |
STREAM_MUSIC | 음악, 영상, 게임 등 일반 미디어 |
STREAM_VOICE_CALL | 통화, VoIP |
STREAM_RING | 전화벨 소리 |
STREAM_ALARM | 알람음 |
STREAM_NOTIFICATION | 알림음 |
STREAM_SYSTEM | 시스템 UI 소리 |
보통 자동으로 사용중인 스트림의 보륨이 조절되는데, 좀 특이한 경우들이 있어요
VoIP나 직접 오디오트랙을 관리하는 경우엔 모드를 설정해줘야 스트림의 볼륨조절이 가능합니다
AudioManager에서 아래와 같이 모드를 지정해야 합니다
audioManager.mode = AudioManager.MODE_IN_COMMUNICATION
볼륨조절을 하는 스트림을 명시적으로 설정할 수도 있는데, 자동으로 잘 붙어요
requireActivity().volumeControlStream = AudioManager.STREAM_VOICE_CALL
(참고) Mode 종류는 아래와 같습니다
Mode 종류 | 설명 | 사용 예시 | 매핑 Stream |
MODE_NORMAL (기본) | 일반 오디오 재생 | 대부분의 앱(음악, 영상, 게임, 효과음) | STREAM_MUSIC |
MODE_RINGTONE | 전화 벨소리 재생 모드 | 벨소리 | STREAM_RING |
MODE_IN_CALL | 통신사를 통한 통화 | 시스템/기본 전화앱 전용 | STREAM_VOICE_CALL |
MODE_IN_COMMUNICATION | VoIP/WebRTC 등 네트워크 기반 통화 | Zoom/Discord/게임 보이스챗/Chime 등 네트통 음성 | STREAM_VOICE_CALL로 자동 매핑 |
MODE_CALL_SCREENING | 수신전화 콜 스크리닝 중 오디오 | 기본 다이얼러/콜스크리닝 앱 | STREAM_VOICE_CALL |
'📱 Android' 카테고리의 다른 글
[Android] 소켓 연결하기 - WebSocket , Socket.IO (0) | 2025.09.27 |
---|---|
[Android] 하나의 화면에 다양한 UI 블록을 구성하는 3가지 방식 (2) | 2025.07.28 |
[Android] NetworkInfo Deprecated (0) | 2025.06.06 |
[Android] MVI 패턴, 이름을 왜이렇게 헷갈리게 지었어요? (0) | 2025.05.27 |
[Android] WorkManager (0) | 2025.04.18 |