📱 Android

[Android] AudioManager와 isSpeakerPhoneOn Deprecated

콩드로이드 2025. 10. 18. 08:51

 

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