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
- Наследование
- Атрибуты
Комментарии
Класс для инкапсуляции сведений о запросе фокусировки звука. Экземпляр AudioFocusRequest
создается с помощью Builder
и используется для запроса и отмены аудиофокуса соответственно с AudioManager#requestAudioFocus(AudioFocusRequest)
и AudioManager#abandonAudioFocusRequest(AudioFocusRequest)
.
<h3>Что такое аудиофокус?</h3>
Фокус аудио — это концепция, представленная в API 8. Он используется для передачи того факта, что пользователь может сосредоточиться только на одном аудиопотоке за раз, например, прослушивая музыку или подкаст, но не оба одновременно. В некоторых случаях одновременно может воспроизводиться несколько аудиопотоков, но есть только один, который пользователь будет слушать (сосредоточьтесь на), в то время как другой воспроизводится в фоновом режиме. Примером этого является направление вождения, когда музыка играет на уменьшенной громкости (т. е. утки).
Когда приложение запрашивает фокус аудио, оно выражает намерение "владеть" аудио фокусом для воспроизведения звука. Давайте рассмотрим различные типы запросов фокуса, возвращаемое значение после запроса и ответы на потери. <p class="note"Примечание.> Приложения не должны воспроизводить ничего, пока не будет предоставлен фокус.
<h3>Различные типы запросов< фокуса/h3>
Существует четыре типа запросов фокуса. Успешный запрос фокуса с каждым из них приведет к по-разному поведению системы и другого приложения, которое ранее держало фокус аудио. <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 (или -14 дБ), который, например, можно применить с MediaPlayer.setVolume(0.2f)
при использовании этого класса для воспроизведения.</Литий>
<Li>AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE
также предназначен для временного запроса, но также выражает, что ваше приложение ожидает, что устройство не будет воспроизводить ничего другого. Обычно это используется, если вы выполняете аудиозапись или распознавание речи и не хотите, чтобы в течение этого времени система воспроизводила примеры уведомлений.</li></ul>
Экземпляр AudioFocusRequest
всегда содержит один из четырех типов запросов, описанных выше. Он передается при построении экземпляра AudioFocusRequest
с его построителем в Builder
конструкторе AudioFocusRequest.Builder#Builder(int)
или после AudioFocusRequest.Builder#setFocusGain(int)
копирования существующего экземпляра с 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)
или с Builder#setOnAudioFocusChangeListener(OnAudioFocusChangeListener, Handler)
, будет вызываться, чтобы уведомить приложение, которое теперь владеет звуковым фокусом.
<h4>Приостановка и утка</h4>
Когда приложение запрашивает аудиофокус с AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK
помощью , система откатит текущего владельца фокуса. <p class="note"Примечание.> Это поведение является <новым>для Android O</b>, в то время как приложения, предназначенные для уровня ПАКЕТА SDK до API 25, должны были реализовать сам ducking, когда они получили потерю фокуса AudioManager#AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK
.
Но утка не всегда является поведением, ожидаемым пользователем. Типичный пример — когда устройство воспроизводит маршруты движения, когда пользователь слушает аудиокниги или подкаст, и ожидает приостановки воспроизведения звука, а не утиной, так как трудно понять подсказку навигации и речевой контент одновременно. Таким образом, система не будет автоматически утка, когда обнаруживает, что это будет утиный речевой контент: такое содержимое обнаруживается, когда AudioAttributes
игрок имеет право на AudioAttributes#CONTENT_TYPE_SPEECH
. См. пример и AudioAttributes.Builder#setContentType(int)
MediaPlayer#setAudioAttributes(AudioAttributes)
если вы пишете приложение для воспроизведения мультимедиа для аудиокниги, подкасты... Так как система не будет автоматически использовать приложения, которые воспроизводят речь, вместо этого она вызывает прослушиватель фокусировки, чтобы уведомить их AudioManager#AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK
о , чтобы они могли приостановить работу. Обратите внимание, что это поведение не зависит от использования AudioFocusRequest
, но связано с использованием AudioAttributes
.
Если для приложения требуется приостановка, а не по какой-либо другой причине, кроме воспроизведения речи, вы также можете объявить это с помощью Builder#setWillPauseWhenDucked(boolean)
, что приведет к тому, что система будет вызывать ваш прослушиватель фокуса, а не автоматически уходить.
<h4>Example</h4>
В приведенном ниже примере рассматриваются следующие действия, которые можно найти в любом приложении, которое будет воспроизводить звук и использовать фокус аудио. Здесь мы воспроизводим аудиокниги, и наше приложение предназначено для паузы, а не утки, когда он теряет фокус. Эти шаги состоят в: <ul><li>Creating AudioAttributes
, который будет использоваться для воспроизведения и запроса фокуса.</li><li li>. Настройка и создание экземпляра AudioFocusRequest
, который определяет предполагаемое поведение фокуса.</li><li 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
@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
.
Части этой страницы являются изменениями, основанными на работе, созданной и совместно используемой проектом Android и используемой в соответствии с условиями, Creative Commons 2.5 Attribution License.
Свойства
AudioAttributes |
|
Class |
Возвращает класс среды выполнения данного объекта |
FocusGain |
Возвращает тип запроса аудиофокуса, настроенный для этого |
Handle |
Дескриптор базового экземпляра Android. (Унаследовано от Object) |
JniIdentityHashCode |
Класс для инкапсуляции сведений о запросе фокусировки звука. (Унаследовано от Object) |
JniPeerMembers |
Класс для инкапсуляции сведений о запросе фокусировки звука. |
PeerReference |
Класс для инкапсуляции сведений о запросе фокусировки звука. (Унаследовано от Object) |
ThresholdClass |
Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода. (Унаследовано от Object) |
ThresholdType |
Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода. (Унаследовано от Object) |
Методы
AcceptsDelayedFocusGain() |
Возвращает значение, указывающее, |
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() |
Вызывает ожидание текущего потока, пока он не пробудится, как правило, из-за <уведомления><<> или>прерывания или прерывания.>< (Унаследовано от Object) |
Wait(Int64) |
Вызывает ожидание текущего потока, пока он не пробудится, как правило, путем <уведомления><<> или>прерывания или прерывания<> или до истечения определенного количества реального времени. (Унаследовано от Object) |
Wait(Int64, Int32) |
Вызывает ожидание текущего потока, пока он не пробудится, как правило, путем <уведомления><<> или>прерывания или прерывания<> или до истечения определенного количества реального времени. (Унаследовано от Object) |
WillPauseWhenDucked() |
Возвращает значение, указывающее, будет ли приложение, которое будет использовать этот |
Явные реализации интерфейса
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) |
Класс для инкапсуляции сведений о запросе фокусировки звука. |