오디오 포커스 이해 (1 부 / 3 부)

일반적인 오디오 포커스 사용 사례

Android 휴대 전화의 많은 앱이 동시에 오디오를 재생할 수 있습니다. 안드로이드 운영 체제는 모든 오디오 스트림을 함께 믹싱하는 반면, 여러 애플 리케이션이 동시에 오디오를 재생할 때 사용자에게 매우 혼란을 줄 수 있습니다. 이로 인해 사용자는 휴대 전화에서 불만족스러워집니다. 좋은 UX를 제공하기 위해 안드로이드가 제공하는 API 응용 프로그램을 공유 할 수 있습니다 오디오 포커스를 하나의 응용 프로그램은 한 번에 오디오 초점을 저장할 수있는 곳을.

이 기사 시리즈의 목적은 오디오 포커스가 무엇인지, 좋은 미디어 UX를 제공하는 것이 중요한 이유 및 사용 방법을 심층적으로 이해하는 것입니다. 이것은 다음 세 가지 시리즈의 첫 번째 부분입니다.

  1. 훌륭한 미디어 시민이되는 것의 중요성과 가장 일반적인 Audio Focus 사용 사례 ( 이 기사 )
  2. Audio Focus가 미디어 앱의 UX에 중요한 다른 사용 사례
  3. 앱에서 Audio Focus를 구현하는 세 단계

오디오 포커스는 협업적이고 앱에 의존하여 오디오 포커스 가이드 라인을 준수합니다. 시스템은 규칙을 시행하지 않습니다. 앱이 오디오 포커스를 잃은 후에도 계속 큰 소리로 재생하고 싶다면 아무 것도이를 방지 할 수 없습니다. 그러나 사용자가 휴대 전화에서 사용하기에 좋지 않은 환경에 빠지게되고 이러한 방식으로 오작동하는 앱을 제거 할 수있는 좋은 기회가 생깁니다.

다음은 오디오 포커스가 작용하는 몇 가지 시나리오입니다. 사용자가 앱을 실행하고 오디오를 재생한다고 가정합니다.

앱에서 오디오를 출력해야하는 경우 오디오 포커스를 요청해야합니다. 포커스가 부여 된 후에 만 ​​사운드가 재생되어야합니다.

사용 사례 1 - 앱에서 오디오를 재생하는 동안 사용자가 다른 미디어 플레이어 앱을 시작하고 해당 앱에서 재생을 시작합니다.

앱에서 오디오 포커스를 처리하지 않으면 어떻게됩니까?

다른 미디어 앱이 오디오 재생을 시작하면 오디오를 재생하는 앱과 겹칩니다. 사용자가 어느 앱에서든 오디오를 제대로들을 수 없기 때문에 결과적으로 UX가 좋지 않습니다.

오디오 포커스를 처리하는 앱의 경우 어떻게해야합니까?

다른 미디어 앱이 재생을 시작하면 영구적 인 오디오 포커스를 요청합니다. 시스템에서 승인하면 재생이 시작됩니다. 사용자가 오디오를 다른 미디어 앱에서만들을 수 있도록 재생을 중지하여 앱에서 영구적 인 오디오 포커스 손실에 응답해야합니다.

이제 사용자가 앱에서 재생을 시작하면 앱에서 영구적 인 오디오 포커스를 다시 요청합니다. 앱이 오디오 재생을 시작하면이 포커스가 부여됩니다. 다른 앱은 재생을 중지하여 영구적 인 오디오 포커스 손실에 응답해야합니다.

사용 사례 2 - 앱이 오디오를 재생하는 동안 수신 전화가 도착합니다.

앱에서 오디오 포커스를 처리하지 않으면 어떻게됩니까?

휴대 전화가 울리기 시작하면 사용자는 벨소리 장치 외에도 앱의 오디오를 듣게됩니다. 이는 좋은 UX가 아닙니다. 통화 거부를 선택하면 오디오가 계속 재생됩니다. 통화를 수락하기로 선택하면 오디오가 전화기 오디오와 함께 재생됩니다. 호출이 끝나면 앱이 자동으로 재생을 재개하지 않으며 이는 좋은 UX가 아닙니다.

오디오 포커스를 처리하는 앱의 경우 어떻게해야합니까?

전화벨이 울리면 (사용자가 아직 응답하지 않은 경우) 앱은 오리 옵션 (전화 앱에서 요청하기 때문에)과 일시적인 오디오 포커스 손실에 응답해야합니다. 볼륨을 약 20 % ( 더킹 이라고 함 )로 줄이거 나 재생을 모두 일시 중지 하여 응답해야 합니다 (Podcast 또는 다른 음성 단어 유형의 앱인 경우).

  • 사용자가 통화를 거절하면 앱에서 볼륨을 복원하거나 재생을 다시 시작하여 오디오 포커스의 이득에 반응해야합니다.
  • 사용자가 전화를 수락하면 시스템에서 오디오 포커스 손실을 보냅니다 ( 오리 옵션 없음 ). 앱에서 응답으로 재생을 일시 중지해야합니다. 통화가 끝나면 앱은 최대 볼륨으로 오디오 재생을 다시 시작하여 오디오 포커스를 얻을 수 있습니다.

개요

앱에서 오디오를 출력해야하는 경우 오디오 포커스를 요청해야합니다. 포커스가 부여 된 후에 만 ​​사운드가 재생되어야합니다. 그러나 오디오 포커스를 얻은 후에는 앱에서 오디오 재생을 완료해야 오디오 포커스를 유지할 수 있습니다. 다른 앱에서 오디오 포커스를 유지하기 위해 포커스를 요청할 수 있습니다. 이 경우 앱에서 재생을 일시 중지하거나 볼륨을 낮추어 사용자가 새로운 오디오 소스를 더 쉽게들을 수있게해야합니다.

앱에서 오디오 포커스가 작용하는 다른 사용 사례에 대해 자세히 알아 보려면 이 연재 의 두 번째 기사를 읽어보세요 .

앱에서 오디오 포커스를 구현하는 방법에 대해 자세히 알아 보려면 이 연재 의 마지막 기사를 읽으십시오 .

Android 미디어 리소스



https://medium.com/google-developers/audio-focus-1-6b32689e4380



오디오 포커스 이해 (2/3 부)

기타 오디오 포커스 사용 사례

이 기사 시리즈의 목적은 오디오 포커스가 무엇인지, 좋은 미디어 UX를 제공하는 것이 중요한 이유 및 사용 방법에 대해 깊이있게 이해하는 것입니다. 이 시리즈의 두 번째 파트는 다음과 같습니다.

  1. 훌륭한 미디어 시민이되는 것의 중요성과 가장 일반적인 Audio Focus 사용 사례
  2. Audio Focus가 미디어 앱의 UX ( 이 기사 ) 에서 중요한 다른 사용 사례
  3. 앱에서 Audio Focus를 구현하는 세 단계

이 시리즈의 첫 번째 기사에서는 미디어 앱의 UX에 오디오 포커스가 중요한 경우에 발생할 수있는 가장 일반적인 사용 사례 두 가지를 다루었습니다. 이 기사에서는 오디오 앱의 동작을 세부적으로 조정할 수 있도록 앱에서 요청할 수있는 오디오 포커스 유형에 대한 개념을 소개합니다.

사용 사례 1 - 다른 앱이 오디오를 재생하는 동안 백그라운드에서 실행되는 탐색 앱이 단계별 안내를 제공합니다.

앱에서 오디오 포커스를 처리하지 않으면 어떻게됩니까?

네비게이션 방향과 음악이 겹쳐서 사용자에게 혼란을줍니다.

오디오 포커스를 처리하는 앱의 경우 어떻게해야합니까?

내비게이션 앱이 다음 방향을 말할 때 앱이 일시적인 오디오 포커스 손실 (덕킹 앱에 의해 요청되기 때문에)에 응답해야합니다.

이 일시적인 오디오 포커스 손실에 응답하기 위해 앱을 오리 (또는 볼륨을 약 20 %로 낮추어야 함)해야합니다. 앱에서 오디오 북, Podcast 또는 음성 단어를 재생하는 경우는 예외입니다.이 경우 재생을 일시 중지해야합니다.

길 찾기가 끝나면 내비게이션 앱이 오디오 포커스를 포기하고 앱에서 다시 얻게됩니다. 또한이 포커스 획득에 대한 응답으로 볼륨을 원래 수준으로 복원해야합니다.

사용 사례 2 - 사용자가 전화 통화 도중 게임을 실행합니다 (오디오를 재생 함).

앱에서 오디오 포커스를 처리하지 않으면 어떻게됩니까?

사용자는 음악과 전화 대화가 겹쳐서 좋지 않은 경험을하게됩니다.

오디오 포커스를 처리하는 앱의 경우 어떻게해야합니까?

Android O에는 지연된 오디오 포커스 게인 이라는 오디오 포커스 기능이 있습니다.이 기능 은 바로 그런 시나리오를 위해 만들어졌습니다. 예를 들어, 사용자가 전화 통화 중 시작하고, 오디오를 듣지 않고 계속 놀고 싶어하는 게임이 있지만 통화가 끝나면 게임에서 오디오를 듣고 싶습니다.

앱이 이것을 지원하고 사용자가 전화 통화 중 (일시적인 오디오 포커스를 획득 한 상태)에 오디오를 재생하려고하면 다음 두 가지 일이 발생합니다.

  1. 앱에서 영구적 인 오디오 포커스를 요청하면 고정되어있어 포커스 부여가 거부됩니다. 휴대 전화 앱은 이미 일시적인 오디오 포커스를 획득했습니다. 앱이 재생을 시작하면 안됩니다 (실제로는 나중에 오디오 포커스가 부여됩니다). 그러나 앱이 게임 인 경우 오디오없이 계속 작동 할 수 있습니다.
  2. 통화가 끝나면 앱에 오디오 포커스 게인 이 부여됩니다 이 보조금은 초기 요청이 이루어진 후 (사용자가 전화 통화를하는 동안) 일정 기간 지연됩니다. 과도기적 손실 후에 오디오 포커스를 얻은 후에도 같은 방식으로 처리 할 수 ​​있습니다. 이 경우 오디오 재생이 시작됩니다.

Oreo 이전의 Android 버전은 지연된 오디오 포커스 게인을 지원하지 않습니다 이 버전에서 사용자가 전화 통화 중에 오디오 재생을 시작하려고하면 오디오 포커스 요청이 허용되지 않고 전화가 끊긴 후에도 재생이 시작되지 않습니다.

사례 3 - 탐색 앱 또는 오디오 알림 또는 알림을 생성하는 앱

짧은 기간 동안 오디오를 버스트로 생성하는 앱을 제작하는 경우 좋은 UX를 사용자에게 제공하기 위해서는 오디오 포커스가 매우 중요합니다. 이를 수행하는 앱의 예로 알림 소리 또는 미리 알림 소리가 생성됩니다. 또는 백그라운드에서 방향을 전환하여 음성 회선을 생성하는 앱.

앱이 백그라운드에서 실행 중이며 오디오를 생성하려고한다고 가정 해 보겠습니다. 사용자가 음악이나 Podcast를 듣고 있으며 앱에서 짧은 시간 동안 오디오를 생성합니다.

앱에서 오디오를 생성하기 전에 일시적인 오디오 포커스 (오리 옵션 포함)를 요청해야합니다. 오디오를 재생할 때만 포커스가 부여되었을 때만. 그리고 잘 작동하는 음악 앱은 오디오 포커스와 오리의 일시적인 손실을 존중해야합니다. 다른 앱이 팟 캐스트 앱인 경우 재생을 다시 시작하기 위해 오디오 포커스가 회복 될 때까지 일시 중지하는 것이 좋습니다. 오디오 포커스를 요청하지 않으면 사용자는 자신의 음악이나 Podcast 및 앱의 오디오를 동시에 듣게됩니다.

유스 케이스 4 - 음성 녹음기 앱 또는 음성 인식 앱

시스템 또는 다른 앱이 소리 (알림 또는 기타 미디어 재생)를하지 않아야하는 일정 기간 동안 오디오를 녹음해야하는 앱을 제작하는 경우 좋은 UX를 제공하려면 오디오 포커스를 처리하는 것이 중요합니다. 이를 수행하는 앱의 예로는 음성 메모 녹음 앱 또는 음성 인식 앱이 있습니다.

앱에서 일시적이고 독점적 인 오디오 포커스를 요청해야합니다. 시스템에서이 권한을 부여한 경우 시스템에서 생성 된 다른 소리가 녹음을 오염시키지 않는다는 것을 알면서 오디오 녹음을 시작할 수 있습니다. 이 녹음 기간 동안 다른 앱이 오디오 포커스를 요청하면 거부 될 것입니다. 사용자가 녹음을 마쳤 으면 시스템에서 소리를 정상적으로 재생할 수 있도록 오디오 포커스를 포기해야합니다.

개요

앱에서 오디오를 출력해야하는 경우 오디오 포커스를 요청해야하며 요청할 수있는 다양한 유형의 포커스가 있어야합니다.

포커스가 부여 된 후에 만 ​​사운드가 재생되어야합니다. 그러나 오디오 포커스를 얻은 후에는 앱에서 오디오 재생을 완료해야 오디오 포커스를 유지할 수 있습니다.

다른 앱에서 오디오 포커스를 유지하기 위해 포커스를 요청할 수 있습니다. 이 경우 앱에서 재생을 일시 중지하거나 볼륨을 낮추어 (더킹) 사용자가 새로운 오디오 소스를 더 쉽게들을 수있게해야합니다.

Android O에서 앱이 요청할 때 오디오 포커스를 얻을 수없는 경우 시스템에서 앱을 사용할 수있게되면 (지연된 포커스) 앱에 제공 할 수 있습니다.

앱에서 오디오 포커스를 구현하는 방법에 대해 자세히 알아 보려면 이 연재 의 마지막 기사를 읽으십시오 .

https://medium.com/google-developers/audio-focus-2-42244043863a


오디오 포커스 이해 (3/3 부)

앱에서 Audio Focus를 구현하는 3 단계

이 기사 시리즈의 목적은 오디오 포커스가 무엇인지, 좋은 미디어 UX를 제공하는 것이 중요한 이유 및 사용 방법에 대해 깊이있게 이해하는 것입니다. 이 시리즈의 마지막 부분은 다음과 같습니다.

  1. 훌륭한 미디어 시민이되는 것의 중요성과 가장 일반적인 Audio Focus 사용 사례
  2. Audio Focus가 미디어 앱의 UX에 중요한 다른 사용 사례
  3. 앱에서 Audio Focus를 구현하는 세 단계 ( 이 기사 )

오디오 포커스를 올바르게 처리하지 못하면 다음 다이어그램은 사용자가 전화기에서 겪을 수있는 영향을 보여줍니다.

이제 사용자가 휴대 전화에서 좋은 미디어 경험을 얻으려면 좋은 미디어 시민이되는 앱의 중요성을 알게되었으므로 앱에서 오디오 포커스를 올바르게 처리 할 수있는 단계를 수행해 보겠습니다.

코드로 들어가기 전에 다음 다이어그램은 앱에서 오디오 포커스를 구현하기 위해 수행 할 단계를 요약 한 것입니다.

1 단계 : 포커스 요청하기

오디오 포커스를 얻는 첫 번째 단계는 안드로이드 시스템이 그것을 얻기 위해 요청하는 것입니다. 요청을했기 때문에 그것이 부여된다는 것을 의미하지는 않습니다. 오디오 포커스를 얻으려는 요청을하려면 시스템에 "의도"를 선언해야합니다. 여기 몇 가지 예가 있어요.

  • 앱이 사용자가 앱에서 오디오를 재생하도록 선택하는 한 오디오 포커스를 무기한 일정으로 유지할 미디어 플레이어 또는 Podcast 플레이어입니까?  This is AUDIOFOCUS_GAIN.
  • 또는 오디오 알림 또는 음성 방향 전환으로 재생해야하거나 짧은 시간 동안 사용자의 오디오를 녹음해야하기 때문에 일시적으로 오디오 포커스 (오리 옵션 포함)가 필요합니까? 
  • This is AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK.
  • 통화가 연결되면 휴대 전화 앱처럼 일시적으로 오디오 포커스가 필요합니까 (그러나 알 수없는 지속 시간, 오리 옵션 없음)?  
  • This is AUDIOFOCUS_GAIN_TRANSIENT.
  • 음성 메모 앱과 같은 오디오를 녹음해야하기 때문에 일시적으로 오디오 포커스가 필요합니까 (다른 소리는 생성되지 않는 알 수없는 기간 동안)?  This is AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE.

Android O 이상에서는 AudioFocusRequest객체 를 만들어야 합니다 (a 사용 builder). 그리고이 객체에서 앱이 오디오 포커스를 획득하는 데 필요한 기간을 지정해야합니다. 다음 코드 스 니펫은 시스템에서 오디오 포커스를 영구적으로 획득 할 의사를 선언합니다.

AudioManager mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
AudioAttributes mAudioAttributes =
new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build();
AudioFocusRequest mAudioFocusRequest =
new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
.setAudioAttributes(mAudioAttributes)
.setAcceptsDelayedFocusGain(true)
.setOnAudioFocusChangeListener(...) // Need to implement listener
.build();
int focusRequest = mAudioManager.requestAudioFocus(mAudioFocusRequest);
switch (focusRequest) {
case AudioManager.AUDIOFOCUS_REQUEST_FAILED:
// don’t start playback
case AudioManager.AUDIOFOCUS_REQUEST_GRANTED:
// actually start playback
}

코드에 대한 참고 사항 :

  1. AudioManager.AUDIOFOCUS_GAIN시스템에서 영원한 오디오 포커스를 요청 하는 것이 무엇입니까. 당신은 또한 같은 다른 INT 값을, 그것을 전달할 수 있습니다 AUDIOFOCUS_GAIN_TRANSIENT, 또는 AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK당신은 단지 일시적인 오디오 사용을 원하는 경우.
  2. 메소드에 AudioManager.OnAudioFocusChangeListener구현 을 전달해야합니다 setOnAudioFocusChangeListener()이것은 시스템에서 발생하는 이벤트에 의해 구동되는 오디오 포커스 변경 사항을 처리 할 코드 부분입니다. 다른 앱의 사용자 상호 작용에서 시작될 수 있습니다. 예를 들어, 앱이 영구적 인 오디오 포커스를 얻었지만 사용자가 다른 앱을 실행하면 앱이 사라집니다. 이 수신기는 앱이이 초점 손실을 처리해야하는 곳입니다.
  3. 일단 AudioFocusRequest객체를 만들었 으면 객체 AudioManager를 호출하여 오디오 포커스 를 요청할 수 있습니다 requestAudioFocus(…)이렇게하면 오디오 포커스 요청의 허용 여부를 나타내는 정수 값이 반환됩니다. 해당 값이있는 경우에만 AUDIOFOCUS_REQUEST_GRANTED즉시 재생을 시작해야합니다. 그리고 만약 AUDIOFOCUS_REQUEST_FAILED그렇다면, 시스템은 그 순간에 오디오 포커스의 앱 획득을 거부했습니다.

Android N 및 이전 버전 AudioFocusRequest에서는 아래와 같이 객체를 사용하지 않고이 의도를 선언 할 수 있습니다. 여전히 구현해야합니다 AudioManager.OnAudioFocusChangeListener위의 스 니펫과 동일한 코드가 있습니다.

AudioManager mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
int focusRequest = mAudioManager.requestAudioFocus(
..., // Need to implement listener
AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN);
switch (focusRequest) {
case AudioManager.AUDIOFOCUS_REQUEST_FAILED:
// don't start playback
case AudioManager.AUDIOFOCUS_REQUEST_GRANTED:
// actually start playback
}

다음으로 우리는 AudioManager.OnAudioFocusChangeListener앱이 오디오 포커스 게인과 손실의 변화에 ​​반응 할 수 있도록 구현해야합니다 .

2 단계 : 오디오 포커스 상태 변경에 응답

앱에 오디오 포커스가 부여되면 (일시적이든 영구적이든) 언제든지 변경 될 수 있습니다. 그리고 앱은이 변화에 반응해야합니다. 이것이 OnAudioFocusChangeListener구현 에서 일어나는 일입니다 .

다음 코드 스 니펫에는 오디오를 재생하는 앱에 대한이 인터페이스의 구현이 포함되어 있습니다. 또한 일시적인 오디오 포커스 손실을 방지하기 위해 더킹을 처리합니다. 또한 사용자가 재생을 일시 중지하여 오디오 포커스 변경을 처리합니다. 다른 애플리케이션 ( 예 : Google Assistant )이 일시적인 오디오 포커스 손실을 유발합니다.

private final class AudioFocusHelper
implements AudioManager.OnAudioFocusChangeListener {
private void abandonAudioFocus() {
mAudioManager.abandonAudioFocus(this);
}
@Override
public void onAudioFocusChange(int focusChange) {
switch (focusChange) {
case AudioManager.AUDIOFOCUS_GAIN:
if (mPlayOnAudioFocus && !isPlaying()) {
play();
} else if (isPlaying()) {
setVolume(MEDIA_VOLUME_DEFAULT);
}
mPlayOnAudioFocus = false;
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
setVolume(MEDIA_VOLUME_DUCK);
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
if (isPlaying()) {
mPlayOnAudioFocus = true;
pause();
}
break;
case AudioManager.AUDIOFOCUS_LOSS:
mAudioManager.abandonAudioFocus(this);
mPlayOnAudioFocus = false;
stop();
break;
}
}
}

다른 앱이 일시적인 오디오 포커스를 요청하고 재생이 일시 중지되는 대신 (일시 중지하는 대신) 사용자가 재생 일시 중지를 시작하면 앱이 다르게 작동해야합니다. 사용자가 재생 일시 중지를 시작하면 앱에서 오디오 포커스를 포기해야합니다. 그러나 일시적인 오디오 포커스 손실에 대한 응답으로 앱이 일시 중지 된 경우 오디오 포커스를 포기해서는 안됩니다. 이것을 설명하기위한 몇 가지 유스 케이스가 있습니다.

백그라운드에서 오디오를 재생하는 오디오 재생 앱이 있다고 가정 해 보겠습니다.

  1. 사용자가 재생을 누르면 앱에서 영구적 인 오디오 포커스를 요구합니다. 시스템에서 오디오 포커스를 부여 받았다고 가정 해 봅시다.
  2. 이제는 홈 버튼을 길게 누르면 Google 길잡이가 시작됩니다. Assistant는 일시적인 오디오 포커스를 요청합니다.
  3. 시스템이 지원이 부여되면, 당신의 OnAudioFocusChangeListener얻을 것이다 AUDIOFOCUS_LOSS_TRANSIENT이벤트를. Assistant에서는 오디오를 녹음해야하므로 여기에서 재생을 일시 중지합니다.
  4. 길잡이가 완료되면, 그것의 오디오 사용을 포기합니다, 당신의 응용 프로그램은 부여됩니다 AUDIOFOCUS_GAIN에 OnAudioFocusChangeListener여기서 재생을 재개할지 여부를 결정해야합니다. 그리고 mPlayOnAudioFocus위의 코드 스 니펫에서 플래그가 수행하는 작업입니다.

다음 코드 스 니펫은 사용자가 시작한 일시 중지 방법이이 오디오 플레이어 앱에서와 같이 보일 수 있습니다.

public final void pause() {
if (!mPlayOnAudioFocus) {
mAudioFocusHelper.abandonAudioFocus();
}
onPause();
}

보시다시피 사용자가 재생을 일시 중지 할 때 오디오 포커스를 포기하고 다른 앱이 포착 할 때 오디오 포커스를 포기하지는 않습니다 AUDIOFOCUS_GAIN_TRANSIENT.

일시적인 오디오 포커스 손실시 일시 중지 대 더킹

재생을 일시 중지할지 또는 일시적으로 OnAudioFocusChangeListener앱에서 제공해야하는 UX에 따라 오디오 재생 볼륨을 줄일 수 있습니다 Android O는 자동 더킹을 지원하며 시스템에서 추가 코드를 작성하지 않아도 자동으로 앱 볼륨을 줄입니다. 당신의에서 OnAudioFocusChangeListener그냥 무시AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK이벤트를.

Android N 및 이전 버전에서는 위의 코드 스 니펫과 같이 직접 더킹을 구현해야합니다.

지연된 이득

Android O는 지연된 오디오 포커스 게인 개념을 도입했습니다. 이를 구현하기 위해 오디오 포커스를 요청하면 AUDIOFOCUS_REQUEST_DELAYED아래와 같이 결과를 얻을 수 있습니다.

public void requestPlayback() {
int audioFocus = mAudioManager.requestAudioFocus(mAudioFocusRequest);
switch (audioFocus) {
case AudioManager.AUDIOFOCUS_REQUEST_FAILED:
...
case AudioManager.AUDIOFOCUS_REQUEST_GRANTED:
...
case AudioManager.AUDIOFOCUS_REQUEST_DELAYED:
mAudioFocusPlaybackDelayed = true;
}
}

당신에 OnAudioFocusChangeListener구현, 당신은 다음을 확인해야합니다 mAudioFocusPlaybackDelayed당신이 응답 할 때 변수를 AUDIOFOCUS_GAIN다음과 같이.

private void onAudioFocusChange(int focusChange) {
switch (focusChange) {
case AudioManager.AUDIOFOCUS_GAIN:
logToUI("Audio Focus: Gained");
if (mAudioFocusPlaybackDelayed || mAudioFocusResumeOnFocusGained) {
mAudioFocusPlaybackDelayed = false;
mAudioFocusResumeOnFocusGained = false;
start();
}
break;
case AudioManager.AUDIOFOCUS_LOSS:
mAudioFocusResumeOnFocusGained = false;
mAudioFocusPlaybackDelayed = false;
stop();
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
mAudioFocusResumeOnFocusGained = true;
mAudioFocusPlaybackDelayed = false;
pause();
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
pause();
break;
}
}

3 단계 : 오디오 포커스를 포기하는 것을 잊지 마십시오.

앱의 오디오 재생이 완료되면 전화로 오디오 포커스를 포기해야합니다 AudioManager.abandonAudioFocus(…)이전 단계에서는 사용자가 재생을 일시 중지했을 때 오디오 포커스를 포기하는 앱의 상황을 들었지만 다른 앱이 일시적으로 중단했을 때 오디오 포커스를 유지하는 앱이있었습니다.

코드 샘플

앱에서 사용할 수있는 요점

이 GitHub 요지 에는 앱에서 사용할 수있는 오디오 포커스 코드를 다루는 3 개의 클래스 가 있습니다.

  • AudioFocusRequestCompat -이 클래스를 사용하여 앱에 필요한 오디오 포커스 유형을 설명합니다.
  • AudioFocusHelper -이 클래스는 실제로 오디오 포커스를 처리합니다. 앱에 포함시킬 수 있지만 오디오 재생 서비스에서 아래 인터페이스를 사용해야합니다.
  • AudioFocusAwarePlayer -이 인터페이스는 미디어 플레이어 ( MediaPlayer또는 ExoPlayer를 관리하는 서비스에 의해 구현되어야하며 AudioFocusHelper클래스가 오디오 포커스로 작동 하도록 허용합니다 .

완전한 코드 샘플

이 android-MediaBrowserService샘플에서는 MediaPlayer백그라운드에서 오디오를 실제로 재생 하는 Android 앱에서 오디오 포커스를 처리하는 방법을 보여줍니다 그것은 또한 사용합니다 MediaSession.

샘플에는 PlayerAdapter오디오 포커스 모범 사례를 보여주는 클래스가 있습니다. 상기에서 살펴 보시기 바랍니다 pause()및 onAudioFocusChange(int)방법을 구현한다.

코드 테스트

앱에 오디오 포커스를 구현 한 후에 Android Media Controller 도구를 사용하여 앱의 포커스 획득 및 손실에 대한 반응을 테스트 할 수 있습니다. 당신은 GitHub에서 그것을 얻을 수 있습니다 .

https://medium.com/google-developers/audio-focus-3-cdc09da9c122







$ 17 Sonoff S31 무선 스마트 소켓, 에너지 모니터링 기능 포함



ITEAD Studio는 에너지 모니터링 기능이있는 Sonoff S31 WiFi 스마트 소켓이 장착 된 다른 Sonoff Smart Home 제품을 출시했습니다. 마찬가지로 Sonoff 스위치 , 전구 , 그들의 다른 제품, 장치가 안드로이드 또는 iOS 용 eWelink 응용 프로그램을 사용하여 제어, 아마존 알렉사과의 통합을 지원하며, 구글 지원 할 수 있습니다.

이 회사는 현재 미국 플러그 버전만을 제공하고 있으며, 지금까지 Wiki 링크가 없으므로 ESP8266 또는 ESP8285를 기반으로 다른 Sonoff 디바이스와 마찬가지로 쉽게 해킹 가능하도록 설계되지는 않았지만, 전자 제품이 Sonoff POW 스위치 (TBC) 와 비슷할 수도 있습니다 .

Sonoff S31 하드웨어 사양 ITEAD에 의해 나열된 :

  • 전압 입력 - 90 ~ 264V AC, 50 / 60HZ
  • 맥스. 전류 - 16A
  • 맥스. 전력 - 4200W (위의 참고 패키지는 최대로드 : 220V / 10A)
  • 갱 - 땅에 1x 미국 유형
  • 연결성 - WEP / WPA-PSK / WPA2-PSK를 지원하는 802.11 b / g / n WiFi
  • 기타 - 전원 버튼, LED
  • 크기 - 75.7 × 39.7x32mm
  • 무게 - 135g
  • 온도 범위 -20 ° C ~ 75 ° C
  • 습도 - 10 % -80 %

또한 소켓에는 안전을위한 과부하 보호 기능이 포함되어 있으며 Android / iOS 용 eWelink 앱을 원격으로 제어하고 전력 소비 및 예상 전기 요금을 모니터링하고 타이머를 설정하고 가정의 다른 사용자와 안전하게 공유 할 수 있습니다.

이 회사는 또한 사용자가 2-gang 상자에 2 개의 소켓을 연결할 수 있다고 주장하면서 컴팩트 한 디자인을 강조합니다. Sonoff-Tasmota 나 ESPurna와 같은 대체 오픈 소스 펌웨어를 선호한다면, 제품이 여전히 매우 새롭기 때문에 기다리거나 직접해야 할 것입니다.

Facebook에 많은 사람들이 EU 플러그가 없다고 불평하고 있기 때문에, 회사에서주의를 기울여 곧 호환 버전을 제공 하겠지만, 그 사이 에 ITEAD Studio 스토어에서 $ 16.90으로 미국 버전의 Sonoff S31을 구입할 수 있습니다. [업데이트 : Sonof S31은 Aliexpress에서 배송 된 $ 16.90 에서 찾을 수 있습니다 .]


https://www.cnx-software.com/2017/12/27/17-sonoff-s31-wireless-smart-socket-includes-energy-monitoring-function/

+ Recent posts