봄날은 갔다. 이제 그 정신으로 공부하자

오디오 출력 Handling - part5 본문

학습

오디오 출력 Handling - part5

길재의 그 정신으로 공부하자 2021. 1. 7. 11:01

이번 글에서는 오디오 출력을 변경하는 방법에 대해 설명합니다.

 

* 참고 사이트:

   https://developer.android.com/guide/topics/media-apps/volume-and-earphones

 

오디오 앱은 기본적으로 볼륨을 제어할 수 있어야 합니다. 표준 동작에는 볼륨 컨트롤(기기의 버튼이나 손잡이 또는 UI의 슬라이더)을 사용하는 기능 및 헤드폰 등 주변 기기의 연결을 하제할 때 갑자기 콘소리가 나지 않게 하는 기능이 있습니다.

 

볼륨 컨트롤 사용

오디오 사이에 플레이어가 일시 중지되거나 현재 게임 위치에 사용되는 음악이 없는 경우에도 사용자가 게임이나 음악 앱의 볼륨 키를 누르면 볼륨이 변경됩니다.

 

Android는 음악, 경보, 알림, 수신 전화 벨소리 장치, 시스템 DTMF 소리, 통화 볼륨, DTMF 신호음 등의 재생에 별도의 오디오 스트림을 사용합니다. 이를 통해 사용자는 각 스트림의 볼륨을 독립적으로 제어할 수 있습니다.

 

기본적으로 볼륨 컨트롤을 누르면 활성 오디오 스트림의 볼륨이 변경됩니다. 앱이 현재 재생되지 않는 경우 볼륨 키를 눌러 음악 볼륨(or Android 9 미만의 벨소리 장치 볼륨)을 조정합니다.

 

앱이 알람 시계가 아니라면 AudioAttributes.USAGE_MEDIA를 사용하여 오디오를 재생해야 합니다.

볼륨 컨트롤이 올바른 스트림을 조정하도록 하려면 AudioAttributes.getVolumeControlStream에서 검색할 수 있는 속성과 일치하는 스트림 유형으로 전달하는 setVolumeControlStream()을 호출해야 합니다.

setVolumeControlStream(AudioManager.STREAM_MUSIC)

 

앱 수명 주기 중에 일반적으로 미디어를 제어하는 Activity or Fragment의 onResume() 메서드에서 이 호출이 진행됩니다. 이렇게 하면 타켓 Activity or Fragment가 Foreground 상태가 될 때마다 볼륨 컨트롤이 STREAM_MUSIC에 연결됩니다.

 

프로그래밍 방식으로 스트림 볼륨 제어 (비 권장)

드문 경우지만 오드이 스트림의 볼륨을 프로그래밍 방식으로 설정할 수도 있습니다. 예를 들면 앱이 기존 UI를 대체하는 경우로 Android AudioManager가 동일한 유형의 모든 오디오 스트림을 함께 혼합하므로 이 방법은 권장하지 않습니다.

아래 메소스는 스트림을 사용하는 모든 앱의 볼륨을 변경하므로 사용하지 않는 것일 좋습니다.

   - adjustStreamVolume()

   - adjustSuggedtedStreamVolume()

   - adjustVolume()

   - setStreamVolume()

   - setStreamSolo()

   - setStreamMute()

 

고정 볼륨 기기 작업

Chromebook과 같은 일부 기기에는 볼륨 컨트롤이 있지만, 위에서 설명한 AudioManager 메서드를 사용하여 앱에서 오디오 스트림의 레벨을 변경하도록 허용하지 않는데 이러한 기기를 고정 볼륨 기기라고 합니다. isVolumeFixed() 메서드를 호출하여 앱이 현재 고정 볼륨 기기에서 실행 중인지 확인할 수 있습니다.

 

오디오 앱은 동일한 스트림에서 재생할 수 있는 다름 앱과 출력 볼륨의 균형을 맞출 수 있어야 합니다. 고정 볼륨기기에서 앱은 자체 볼륨 컨트롤을 아래의 표에 나와 있는 적절한 setVolume() 메서드에 연결해야 합니다.

 

큰 소리 차단

사용자는 다양한 방법으로 Android 기기에서 오디오를 즐길 수 있습니다. 대부분의 기기에는 내장 스피커와 유선 헤드셋용 헤드폰잭이 있으며 블루투스 연결과 A2DP 오디오 지원 기능도 제공됩니다.

 

헤드셋의 전원 플러그를 뽑거나 블루투스 기기를 분리하면 오디오 스트림의 경로가 내장 스피커로 자동 변경됩니다. 높은 볼륨으로 음악을 듣는 경우 갑자기 큰 소리가 날 수 있습니다.

 

이때 사용자는 일반적으로 화면 재생 컨트롤이 있는 음악 플레이어가 포함된 앱이 재생을 일시중히할 것으로 기대합니다. 컨트롤이 포함되지 않은 게임과 같은 다름 앱은 계속해서 재생됩니다. 사용자는 기기의 하드웨어 컨트롤을 사용하여 볼륨을 조정할 수 있습니다.

 

오디오 출력이 내장 스피커로 다시 전환되면 시스템은 ACTION_AUDIO_BECOMING_NOISY 인텐트를 브로드캐스트합니다. 

오디오를 재생할 때마다 이 인텐트를 수신 대기하는 BroadcastReceiver를 아래와 같이 만들어야 합니다. 

private class BecomingNoisyReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        if (intent.action == AudioManager.ACTION_AUDIO_BECOMING_NOISY) {
            // Pause the playback
        }
    }
}

 

재생을 시작할 때 Receiver를 등록하고 중지 할 때 등록을 취소합니다. 이 가이드에서 설명하는 대로 앱을 디자인하면 onPlay() 및 onStop() 미디어 세션 콜백에 이러한 호출이 나타납니다.

private val intentFilter = IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY)
private val myNoisyAudioStreamReceiver = BecomingNoisyReceiver()

private val callback = object : MediaSessionCompat.Callback() {

    override fun onPlay() {
        registerReceiver(myNoisyAudioStreamReceiver, intentFilter)
    }

    override fun onStop() {
        unregisterReceiver(myNoisyAudioStreamReceiver)
    }
}

'학습' 카테고리의 다른 글

android 12 변경 사항 정리  (1) 2021.12.31
오디오 포커스 관리 - part6  (0) 2021.01.08
Media button 응답 처리 - part4  (0) 2021.01.06
동영상 앱 빌드 - part3  (0) 2021.01.04
미디어 세션 사용 - part2  (0) 2020.12.31
Comments