如何为api级20以上的android设备请求AudioFocus?

问题描述 投票:0回答:1

我如本文档中所述使用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()?

android android-tv android-audiomanager
1个回答
0
投票

音频管理器资源未释放

这是什么意思?你怎么知道?

a)如果您请求AUDIOFOCUS_GAIN,然后又放弃它,那么将保持沉默。

例如,我正在听应用程序A中的音乐,然后开始听应用程序B中的音乐并将其暂停。 App A不会自动开始播放,这很好。这与瞬态焦点不同。

  • [在您计划在可预见的将来播放音频时(例如,在播放音乐时)并且希望以前的音频焦点持有人停止播放时,请求永久音频焦点(AUDIOFOCUS_GAIN)。

b)放弃焦点时,您有责任停止播放。

如果放弃焦点并继续播放,您将不再参与音频焦点机制。如果我启动了除您的应用程序以外的其他音乐播放器,则当我的其他音乐播放器请求进行音频聚焦时,系统将无法停止您的应用程序的播放。

完成播放后,呼叫abandonAudioFocus()

来源:Audio focus pre-Android 8.0


设备[L-O]应该调用哪个函数

AudioManager.STREAM_*中提到的唯一具有Audio focus pre-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无关,在MediaPlayerSoundPool.Builder和所有其他播放声音的设备上可用。

© www.soinside.com 2019 - 2024. All rights reserved.