Share via


AudioFocusRequestClass 클래스

정의

오디오 포커스 요청에 대한 정보를 캡슐화하는 클래스입니다.

[Android.Runtime.Register("android/media/AudioFocusRequest", ApiSince=26, DoNotGenerateAcw=true)]
public sealed class AudioFocusRequestClass : Java.Lang.Object
[<Android.Runtime.Register("android/media/AudioFocusRequest", ApiSince=26, DoNotGenerateAcw=true)>]
type AudioFocusRequestClass = class
    inherit Object
상속
AudioFocusRequestClass
특성

설명

오디오 포커스 요청에 대한 정보를 캡슐화하는 클래스입니다. AudioFocusRequest instance 에 의해 Builder빌드되며 각각 및 AudioManager#abandonAudioFocusRequest(AudioFocusRequest)를 사용하여 오디오 포커스 AudioManager#requestAudioFocus(AudioFocusRequest) 를 요청하고 중단하는 데 사용됩니다.

<h3>오디오 포커스란?</h3>

오디오 포커스는 API 8에 도입된 개념입니다. 사용자가 한 번에 하나의 오디오 스트림에만 집중할 수 있다는 사실을 전달하는 데 사용됩니다(예: 음악 또는 팟캐스트 듣기). 경우에 따라 여러 오디오 스트림을 동시에 재생할 수 있지만 사용자가 실제로 듣는 오디오 스트림은 하나만 있고 다른 하나는 백그라운드에서 재생됩니다. 예를 들어 음악이 감소된 볼륨(즉, 더킹)으로 재생되는 동안 방향이 말하는 것을 예로 들 수 있습니다.

애플리케이션이 오디오 포커스를 요청하면 오디오 포커스를 "소유"하여 오디오를 재생하려는 의도를 나타냅니다. 다양한 유형의 포커스 요청, 요청 후 반환 값 및 손실에 대한 응답을 검토해 보겠습니다. <p class="note">참고: 애플리케이션은 포커스가 부여될 때까지 아무 것도 재생하지 않아야 합니다.

<h3>다양한 유형의 포커스 요청</h3>

4가지 포커스 요청 유형이 있습니다. 각각에 대한 성공적인 포커스 요청은 시스템 및 이전에 오디오 포커스를 유지했던 다른 애플리케이션에 의해 서로 다른 동작을 생성합니다. <ul><li>AudioManager#AUDIOFOCUS_GAIN 는 이제 애플리케이션이 사용자가 수신 대기하는 오디오의 유일한 소스라는 사실을 표현합니다. 오디오 재생 기간은 알 수 없으며 매우 길 수 있습니다. 사용자가 애플리케이션과의 상호 작용을 완료한 후에는 다른 오디오 스트림이 다시 시작될 것으로 기대하지 않습니다. 이 포커스 게인의 사용 예는 음악 재생, 게임 또는 비디오 플레이어용입니다.</리튬>

<li>AudioManager#AUDIOFOCUS_GAIN_TRANSIENT 는 애플리케이션이 현재 소유자로부터 일시적으로 포커스를 받고 있다는 것을 알고 있지만, 애플리케이션에 오디오 포커스가 더 이상 필요하지 않은 경우 재생이 원래 위치로 돌아갈 것으로 예상하는 상황입니다. 예를 들어 알람을 재생하거나 VoIP 호출 중에 사용할 수 있습니다. 재생은 유한한 것으로 알려져 있습니다. 알람이 시간 초과되거나 해제되고 VoIP 호출이 시작 및 종료됩니다. 이러한 이벤트가 종료되고 사용자가 음악을 시작할 때 음악을 듣는 경우 사용자는 음악이 다시 시작될 것으로 예상하지만 동시에 두 가지 모두 듣고 싶지는 않았습니다.</리튬>

<li>AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK: 이 포커스 요청 유형은 포커스 요청의 임시 측면과 비슷하 AUDIOFOCUS_GAIN_TRANSIENT 지만 포커스를 소유한 시간 동안 다른 애플리케이션이 축소된 볼륨인 "ducked"에서 계속 플레이할 수 있다는 사실도 표현합니다. 예를 들어 운전 길이나 알림을 재생할 때 음악이 계속 재생해도 괜찮지만 방향을 이해하기 어려울 정도로 큰 소리는 아닙니다. "ducked" 애플리케이션에 의한 일반적인 감쇠는 0.2f(또는 -14dB)의 요소로, 재생에 이 클래스를 사용할 때 instance 적용 MediaPlayer.setVolume(0.2f) 할 수 있습니다.</리튬>

<li>AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE 는 임시 요청을 위한 것이지만 애플리케이션에서 디바이스가 다른 것을 재생하지 않을 것으로 예상한다는 것을 표현합니다. 이는 일반적으로 오디오 녹음 또는 음성 인식을 수행하는 경우 사용되며, 해당 시간 동안 시스템에서 예제 알림을 재생하지 않으려는 경우에 사용됩니다.</li></ul>

AudioFocusRequest instance 항상 위에서 설명한 네 가지 유형의 요청 중 하나를 포함합니다. 생성자 에서 Builder 작성기를 AudioFocusRequest.Builder#Builder(int)사용하여 AudioFocusRequest instance 빌드하거나 AudioFocusRequest.Builder#setFocusGain(int) 를 사용하여 기존 instance 복사한 후 를 AudioFocusRequest.Builder#Builder(AudioFocusRequest)사용하여 전달됩니다.

<h3>포커스 요청/h3><h4>포커스 요청<<이 필요한 사용 사례 적격/h4>

모든 포커스 요청은 요청을 따를 오디오 사용 사례를 설명하는 (참조Builder#setAudioAttributes(AudioAttributes))에 의해 AudioAttributes 정규화됩니다(성공하거나 부여된 후). 요청에 대해 오디오/미디어 재생에 사용하는 특성과 동일한 AudioAttributes 를 사용하는 것이 좋습니다. <br>특성이 설정되지 않은 경우 의 AudioAttributes#USAGE_MEDIA 기본 특성이 사용됩니다.

<h4>지연된 포커스</h4>

여러 가지 이유로 시스템에서 오디오 포커스를 "잠글" 수 있습니다. 전화 통화 중, 장치가 연결된 자동차가 긴급 메시지를 재생할 때... 이러한 상황을 지원하기 위해 애플리케이션은 요청이 처리될 때 을 사용하여 지연된 포커스 Builder#setAcceptsDelayedFocusGain(boolean)를 수락하는 것으로 플래그를 지정하여 알림을 요청할 수 있습니다. <br>시스템에 의해 잠겨 있는 동안 포커스가 요청되면 가 AudioManager#requestAudioFocus(AudioFocusRequest) 를 반환 AudioManager#AUDIOFOCUS_REQUEST_DELAYED합니다. 포커스가 더 이상 잠겨 있지 않으면 또는 Builder#setOnAudioFocusChangeListener(OnAudioFocusChangeListener, Handler) 로 설정된 Builder#setOnAudioFocusChangeListener(OnAudioFocusChangeListener) 포커스 수신기가 호출되어 현재 오디오 포커스를 소유하고 있는 애플리케이션에 알립니다.

<h4>일시 중지 및 더킹</h4>

애플리케이션이 를 사용하여 오디오 포커스 AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK를 요청하면 시스템은 현재 포커스 소유자를 더킹합니다. <p class="note">참고: 이 동작은 Android O</b>에 대해 새로운>동작이지만<, API 25까지 SDK 수준을 대상으로 하는 애플리케이션은 의 포커스 손실을 AudioManager#AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK받았을 때 더킹을 직접 구현해야 했습니다.

그러나 더킹이 항상 사용자가 기대하는 동작은 아닙니다. 일반적인 예는 사용자가 오디오 책이나 팟캐스트를 듣는 동안 디바이스가 운전 방향을 재생하고, 탐색 프롬프트와 음성 콘텐츠를 동시에 이해하기 어렵기 때문에 오디오 재생이 오리 대신 일시 중지되기를 기대하는 경우입니다. 따라서 시스템은 음성 콘텐츠를 더킹하는 것을 감지할 때 자동으로 오리를 처리하지 않습니다. 플레이어의 가 에 의해 AudioAttributes#CONTENT_TYPE_SPEECH자격을 갖추면 AudioAttributes 이러한 콘텐츠가 감지됩니다. 오디오 북, 팟캐스트에 대한 미디어 재생 애플리케이션을 작성하는 경우 및 에 대한 instance AudioAttributes.Builder#setContentType(int)MediaPlayer#setAudioAttributes(AudioAttributes) 참조하세요. 시스템은 음성을 재생하는 애플리케이션을 자동으로 오리하지 않으므로 대신 포커스 수신기를 호출하여 를 알리AudioManager#AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK므로 대신 일시 중지할 수 있습니다. 이 동작은 의 AudioFocusRequest사용과는 독립적이지만 의 사용 AudioAttributes과 관련이 있습니다.

애플리케이션에서 음성 재생 이외의 다른 이유로 더킹하는 대신 일시 중지해야 하는 경우 를 사용하여 선언 Builder#setWillPauseWhenDucked(boolean)할 수도 있습니다. 그러면 시스템이 자동으로 더킹하는 대신 포커스 수신기를 호출하게 됩니다.

<h4>예제</h4>

아래 예제에서는 오디오를 재생하고 오디오 포커스를 사용하는 모든 애플리케이션에서 찾을 수 있는 다음 단계를 설명합니다. 여기서는 오디오 북을 재생하며, 응용 프로그램은 포커스를 잃을 때 오리가 아닌 일시 중지를 위한 것입니다. 이러한 단계는 재생 및 포커스 요청에 사용할 ul><li>Create AudioAttributes 로 구성됩니다<.</li li>><의도한 포커스 동작을 AudioFocusRequest 정의하는 instance 구성하고 만듭니다.</li li><>오디오 포커스를 요청하고 반환 코드를 확인하여 재생이 즉시 발생할 수 있는지 또는 지연되는지 확인합니다.</li><li>포커스 증가 및 손실에 응답하는 포커스 변경 수신기를 구현합니다.</li></ul>

// initialization of the audio attributes and focus request
            mAudioManager = (AudioManager) Context.getSystemService(Context.AUDIO_SERVICE);
            mPlaybackAttributes = new AudioAttributes.Builder()
                    .setUsage(AudioAttributes.USAGE_MEDIA)
                    .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
                    .build();
            mFocusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
                    .setAudioAttributes(mPlaybackAttributes)
                    .setAcceptsDelayedFocusGain(true)
                    .setWillPauseWhenDucked(true)
                    .setOnAudioFocusChangeListener(this, mMyHandler)
                    .build();
            mMediaPlayer = new MediaPlayer();
            mMediaPlayer.setAudioAttributes(mPlaybackAttributes);
            final Object mFocusLock = new Object();

            boolean mPlaybackDelayed = false;

            // requesting audio focus
            int res = mAudioManager.requestAudioFocus(mFocusRequest);
            synchronized (mFocusLock) {
                if (res == AudioManager.AUDIOFOCUS_REQUEST_FAILED) {
                    mPlaybackDelayed = false;
                } else if (res == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
                    mPlaybackDelayed = false;
                    playbackNow();
                } else if (res == AudioManager.AUDIOFOCUS_REQUEST_DELAYED) {
                   mPlaybackDelayed = true;
                }
            }

            // implementation of the OnAudioFocusChangeListener
            &#64;Override
            public void onAudioFocusChange(int focusChange) {
                switch (focusChange) {
                    case AudioManager.AUDIOFOCUS_GAIN:
                        if (mPlaybackDelayed || mResumeOnFocusGain) {
                            synchronized (mFocusLock) {
                                mPlaybackDelayed = false;
                                mResumeOnFocusGain = false;
                            }
                            playbackNow();
                        }
                        break;
                    case AudioManager.AUDIOFOCUS_LOSS:
                        synchronized (mFocusLock) {
                            // this is not a transient loss, we shouldn't automatically resume for now
                            mResumeOnFocusGain = false;
                            mPlaybackDelayed = false;
                        }
                        pausePlayback();
                        break;
                    case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
                    case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
                        // we handle all transient losses the same way because we never duck audio books
                        synchronized (mFocusLock) {
                            // we should only resume if playback was interrupted
                            mResumeOnFocusGain = mMediaPlayer.isPlaying();
                            mPlaybackDelayed = false;
                        }
                        pausePlayback();
                        break;
                }
            }

            // Important:
            // Also set "mResumeOnFocusGain" to false when the user pauses or stops playback: this way your
            // application doesn't automatically restart when it gains focus, even though the user had
            // stopped it.

에 대한 Java 설명서입니다 android.media.AudioFocusRequest.

이 페이지의 일부는 만들고 공유하며 에 설명된 용어에 따라 사용되는 작업을 기반으로 수정됩니다.

속성

AudioAttributes

AudioFocusRequestAudioAttributes 대한 집합을 반환하거나, 설정되지 않은 경우 기본 특성을 반환합니다.

Class

Object의 런타임 클래스를 반환합니다.

(다음에서 상속됨 Object)
FocusGain

AudioFocusRequest에 대해 구성된 오디오 포커스 요청의 유형을 반환합니다.

Handle

기본 Android instance 대한 핸들입니다.

(다음에서 상속됨 Object)
JniIdentityHashCode

오디오 포커스 요청에 대한 정보를 캡슐화하는 클래스입니다.

(다음에서 상속됨 Object)
JniPeerMembers

오디오 포커스 요청에 대한 정보를 캡슐화하는 클래스입니다.

PeerReference

오디오 포커스 요청에 대한 정보를 캡슐화하는 클래스입니다.

(다음에서 상속됨 Object)
ThresholdClass

이 API는 Android용 Mono 인프라를 지원하며 코드에서 직접 사용할 수 없습니다.

(다음에서 상속됨 Object)
ThresholdType

이 API는 Android용 Mono 인프라를 지원하며 코드에서 직접 사용할 수 없습니다.

(다음에서 상속됨 Object)

메서드

AcceptsDelayedFocusGain()

이를 AudioFocusRequest 사용하는 애플리케이션이 임시 요청 실패 후 부여된 포커스 게인을 지원하는지 여부를 반환합니다.

Clone()

이 개체의 복사본을 만들고 반환합니다.

(다음에서 상속됨 Object)
Dispose()

오디오 포커스 요청에 대한 정보를 캡슐화하는 클래스입니다.

(다음에서 상속됨 Object)
Dispose(Boolean)

오디오 포커스 요청에 대한 정보를 캡슐화하는 클래스입니다.

(다음에서 상속됨 Object)
Equals(Object)

다른 개체가 이 개체와 "같음"인지 여부를 나타냅니다.

(다음에서 상속됨 Object)
GetHashCode()

개체의 해시 코드 값을 반환합니다.

(다음에서 상속됨 Object)
JavaFinalize()

가비지 수집에서 개체에 대한 참조가 더 이상 없다고 판단할 때 개체의 가비지 수집기에서 호출됩니다.

(다음에서 상속됨 Object)
Notify()

이 개체의 모니터에서 대기 중인 단일 스레드를 해제합니다.

(다음에서 상속됨 Object)
NotifyAll()

이 개체의 모니터에서 대기 중인 모든 스레드를 해제합니다.

(다음에서 상속됨 Object)
SetHandle(IntPtr, JniHandleOwnership)

Handle 속성을 설정합니다.

(다음에서 상속됨 Object)
ToArray<T>()

오디오 포커스 요청에 대한 정보를 캡슐화하는 클래스입니다.

(다음에서 상속됨 Object)
ToString()

개체의 문자열 표현을 반환합니다.

(다음에서 상속됨 Object)
UnregisterFromRuntime()

오디오 포커스 요청에 대한 정보를 캡슐화하는 클래스입니다.

(다음에서 상속됨 Object)
Wait()

현재 스레드가 각성될 때까지 대기하도록 합니다. 일반적으로 <알림을<> 받>거나<<> 중단/em>합니다.

(다음에서 상속됨 Object)
Wait(Int64)

현재 스레드가 깨어날 때까지 대기하게 하며, 일반적으로 <알림을 받<>거나 중단</>em>>을 받거나 <일정량의 실시간이 경과할 때까지 대기합니다.

(다음에서 상속됨 Object)
Wait(Int64, Int32)

현재 스레드가 깨어날 때까지 대기하게 하며, 일반적으로 <알림을 받<>거나 중단</>em>>을 받거나 <일정량의 실시간이 경과할 때까지 대기합니다.

(다음에서 상속됨 Object)
WillPauseWhenDucked()

duck을 요청했을 때 이를 AudioFocusRequest 사용하는 애플리케이션이 일시 중지되는지 여부를 반환합니다.

명시적 인터페이스 구현

IJavaPeerable.Disposed()

오디오 포커스 요청에 대한 정보를 캡슐화하는 클래스입니다.

(다음에서 상속됨 Object)
IJavaPeerable.DisposeUnlessReferenced()

오디오 포커스 요청에 대한 정보를 캡슐화하는 클래스입니다.

(다음에서 상속됨 Object)
IJavaPeerable.Finalized()

오디오 포커스 요청에 대한 정보를 캡슐화하는 클래스입니다.

(다음에서 상속됨 Object)
IJavaPeerable.JniManagedPeerState

오디오 포커스 요청에 대한 정보를 캡슐화하는 클래스입니다.

(다음에서 상속됨 Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

오디오 포커스 요청에 대한 정보를 캡슐화하는 클래스입니다.

(다음에서 상속됨 Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

오디오 포커스 요청에 대한 정보를 캡슐화하는 클래스입니다.

(다음에서 상속됨 Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

오디오 포커스 요청에 대한 정보를 캡슐화하는 클래스입니다.

(다음에서 상속됨 Object)

확장 메서드

JavaCast<TResult>(IJavaObject)

Android 런타임 확인 형식 변환을 수행합니다.

JavaCast<TResult>(IJavaObject)

오디오 포커스 요청에 대한 정보를 캡슐화하는 클래스입니다.

GetJniTypeName(IJavaPeerable)

오디오 포커스 요청에 대한 정보를 캡슐화하는 클래스입니다.

적용 대상