我如本文档中所述使用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()?
音频管理器资源未释放
这是什么意思?你怎么知道?
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
无关,在MediaPlayer
,SoundPool.Builder
和所有其他播放声音的设备上可用。