Как запросить AudioFocus для устройств Android выше уровня API 20? - PullRequest
0 голосов
/ 08 ноября 2019

Я реализовал вызов с использованием класса AudioManager, как упомянуто в этом документе: https://developer.android.com/guide/topics/media-apps/audio-focus. Я вижу, как ресурс аудио-менеджера удерживается, когда я звоню:

audioManager.requestAudioFocus(audioFocusChangeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);

, но ресурс аудио-менеджера не 'чтобы получить освобождение, позвонив по номеру:

audioManager.abandonAudioFocus(audioFocusChangeListener);

Кроме того, как уже упоминалось в вышеприведенном документе:

Для приложений, ориентированных на Android 5.0 (уровень API 21) и более поздних версий, аудио-приложенияследует использовать AudioAttributes для описания типа аудио, которое воспроизводит ваше приложение. Например, приложения, которые воспроизводят речь, должны указывать CONTENT_TYPE_SPEECH.

Но в классе AudioManager функция для вызова с AudioAttributes помечается как SystemApi, упомянутое ниже:

@SystemApi
    @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
    public int requestAudioFocus(OnAudioFocusChangeListener l,
            @NonNull AudioAttributes requestAttributes,
            int durationHint,
            int flags)

Итак, какая функция должнавызываться для устройств между уровнями API 20 (Android L) и 26 (Android O) для запроса AudioFocus () и AbandonAudioFocus ()?

1 Ответ

0 голосов
/ 08 ноября 2019

ресурс аудио-менеджера не выпущен

Что это значит? Как вы можете сказать?

a) Если вы запросите AUDIOFOCUS_GAIN, а затем откажетесь от него, тогда наступит тишина.

Например, я слушаю музыку из приложения A, затемЯ начинаю слушать музыку из приложения B и приостанавливаю ее. Приложение А не начнет автоматически играть, и это нормально. В этом отличие от переходной фокусировки.

  • Запросите постоянную фокусировку звука (AUDIOFOCUS_GAIN), когда вы планируете воспроизводить звук в обозримом будущем (например, при воспроизведении музыки), и вы ожидаетепредыдущий держатель аудио-фокуса, чтобы остановить воспроизведение.

b) Вы несете ответственность за остановку воспроизведения при отказе от фокуса.

Если вы откажетесь от фокуса и продолжите воспроизведение, выбольше не участвуем в механизме фокусировки звука. Если бы я запустил другой музыкальный проигрыватель, кроме вашего приложения, система не смогла бы остановить воспроизведение вашего приложения, когда мой другой музыкальный проигрыватель запросил фокусировку звука.

Когда вы закончите воспроизведение, наберите abandonAudioFocus().

Источник: Аудио фокус перед Android 8.0


, какую функцию следует вызывать для устройств [LO]

Единственный доступный с одной из AudioManager.STREAM_* констант, как указано в Аудио фокус перед Android 8.0 .

// Request audio focus for playback
val result: Int = audioManager.requestAudioFocus(
    afChangeListener,
    // Use the music stream.
    AudioManager.STREAM_MUSIC, // There's no AudioAttributes, just the more general constant.
    // Request permanent focus.
    AudioManager.AUDIOFOCUS_GAIN
)

Для приложенийкоторые предназначены для Android 5.0 (уровень API 21) и более поздних версий, аудио приложения должны использовать AudioAttributes для описания типа звука, который воспроизводит ваше приложение.

Цитата, которую вы упомянули, не относится к requestAudioFocusзвоните, это около setAudioAttributes, который доступен на MediaPlayer, SoundPool.Builder и всех других вещах, которые воспроизводят звук.

...