오디오 출력 변경 처리

사용자는 오디오 앱의 볼륨을 제어할 수 있기를 기대합니다. 표준 동작 볼륨 컨트롤 (화면의 버튼이나 손잡이)을 사용할 수 있는 기능이 포함되어 있습니다. 슬라이더에 의해서는 안 되며, 소리가 나지 않더라도 헤드폰과 같은 주변기기가 사용 중에 연결 해제됩니다.

볼륨 컨트롤 사용

사용자가 게임이나 음악 앱에서 볼륨 키를 누를 때 볼륨이 노래 사이에 플레이어가 일시중지되거나 해당 부분에 대한 음악이 지정할 수 있습니다.

Android는 음악, 알람, 동영상 재생에 별도의 오디오 스트림을 사용하여 알림, 수신 전화 벨소리, 시스템 소리, 통화 볼륨 및 DTMF 있습니다. 이를 통해 사용자는 각 스트림의 볼륨을 독립적으로 제어할 수 있습니다.

기본적으로 볼륨 컨트롤을 누르면 활성 오디오의 볼륨이 변경됩니다. 있습니다. 현재 앱에서 재생 중인 것이 없는 경우 볼륨 키 음악 볼륨 (또는 Android 9 이전의 벨소리 장치 볼륨)을 조절합니다.

앱이 알람 시계가 아닌 경우 사용 시 오디오를 재생해야 합니다. AudioAttributes.USAGE_MEDIA

볼륨 컨트롤이 올바른 스트림을 수신하려면 setVolumeControlStream() 검색할 수 있는 속성과 일치하는 스트림 유형 전달 AudioAttributes.getVolumeControlStream

Kotlin

setVolumeControlStream(AudioManager.STREAM_MUSIC)

자바

setVolumeControlStream(AudioManager.STREAM_MUSIC);

앱의 수명 주기에서 이 호출을 실행합니다(일반적으로 onResume()에서). 미디어를 제어하는 활동 또는 프래그먼트의 메서드입니다. 이렇게 하면 타겟 활동이나 프래그먼트가 호출될 때마다 STREAM_MUSIC로 볼륨 컨트롤 볼 수 있습니다.

프로그래밍 방식으로 스트림 볼륨 제어

드문 경우이지만 오디오 스트림의 볼륨을 프로그래밍 방식으로 설정할 수도 있습니다. 대상 앱이 기존 UI를 대체하는 경우를 예로 들 수 있습니다. 권장되지 않는 이유는 다음과 같습니다. Android AudioManager는 동일한 유형의 모든 오디오 스트림을 함께 믹스합니다. 다음 메서드는 스트림을 사용하는 모든 앱의 볼륨을 변경하므로 있습니다.

고정 볼륨 기기 작업

Chromebook과 같은 일부 기기는 볼륨 컨트롤이 있지만 앱에서 AudioManager 사용을 허용하지 않습니다. 메서드를 사용하여 오디오 스트림의 레벨을 변경할 수 있습니다. 이를 가리켜 고정 볼륨 기기 사용자의 isVolumeFixed()를 호출하여 앱이 고정 볼륨 기기에서 실행되는지 확인합니다.

오디오 앱은 오디오, 동영상, 오디오와 같은 동일한 스트림에서 재생되고 있을 수 있는 다른 앱과의 출력 볼륨과는 다를 수 있습니다. 고정 볼륨 기기에서 앱은 자체 볼륨 컨트롤을 적절한 setVolume() 메서드를 사용해야 합니다.

플레이어 메서드
AudioTrack AudioTrack.setVolume()
MediaPlayer MediaPlayer.setVolume()
ExoPlayer 기본 AudioTrack의 볼륨을 설정하는 SimpleExoPlayer.setVolume()을 사용합니다.

큰 소리 차단

사용자는 오디오북을 오디오로 감상할 수 있는 여러 가지 대안을 Android 기기. 대부분의 기기에는 스피커, 헤드폰 잭이 내장되어 있어 유선 헤드셋, 그리고 많은 기기가 블루투스 연결과 A2DP 오디오

헤드셋이 분리되거나 블루투스 기기 연결이 해제되면 오디오 스트림 내장 스피커로 자동으로 경로가 변경됩니다. 높은 음량으로 음악을 듣는 경우 너무 시끄러울 수도 있습니다

사용자는 일반적으로 화면 재생 기능이 있는 음악 플레이어가 포함된 앱을 기대합니다. 재생을 일시중지합니다. 지원되지 않는 게임과 같은 다른 앱 계속 재생되어야 합니다. 사용자는 제어할 수 있습니다.

오디오 출력이 내장 스피커로 다시 전환되면 시스템은 ACTION_AUDIO_BECOMING_NOISY을 브로드캐스트합니다. 인텐트를 지정할 수 있습니다. BroadcastReceiver를 만들어야 합니다. 를 호출합니다. Receiver는 다음과 같습니다.

Kotlin

private class BecomingNoisyReceiver : BroadcastReceiver() {

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

자바

private class BecomingNoisyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
      if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent.getAction())) {
          // Pause the playback
      }
    }
}

재생을 시작할 때 Receiver를 등록하고 중지할 때 등록을 취소합니다. 이 가이드에 설명된 대로 앱을 디자인하면 onPlay()onStop() 미디어 세션 콜백에서 호출될 수 있습니다.

Kotlin

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)
    }
}

Java

private IntentFilter intentFilter = new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY);
private BecomingNoisyReceiver myNoisyAudioStreamReceiver = new BecomingNoisyReceiver();

MediaSessionCompat.Callback callback = new
MediaSessionCompat.Callback() {
  @Override
  public void onPlay() {
    registerReceiver(myNoisyAudioStreamReceiver, intentFilter);
  }

  @Override
  public void onStop() {
    unregisterReceiver(myNoisyAudioStreamReceiver);
  }
}