同一时间可能要好多个app在播放audio,Android用audio focus 来避免app之前互相影响.只有持有audio focus的app才可以播放audio.
可以用requestAudioFocus()来获取对应audio stream的audio focus.如果返回值是AUDIOFOCUS_REQUEST_GRANTED的话,即说明成功获得audio focus.
AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE);
// Request audio focus for playback
int result = am.requestAudioFocus(afChangeListener,
                                 // Use the music stream.
                                 AudioManager.STREAM_MUSIC,
                                 // Request permanent focus.
                                 AudioManager.AUDIOFOCUS_GAIN);

if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
    am.registerMediaButtonEventReceiver(RemoteControlReceiver);
    // Start playback.
}
当播放完成时,应该调用abandonAudioFocus()来告诉系统不再需要focus,其参数是AudioManager。OnAudioFocusChangeListner().
// Abandon audio focus when playback complete
am.abandonAudioFocus(afChangeListener);
可以通过下面的code来获得短暂的focus,和上面的差别在requestAudioFocus的第三个参数为AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK。
/ Request audio focus for playback
int result = am.requestAudioFocus(afChangeListener,
                             // Use the music stream.
                             AudioManager.STREAM_MUSIC,
                             // Request permanent focus.
                             AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK);

if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
    // Start playback.
}
在OnAudioFocusChangeListener 中我们可以检测audio focus的loss/gain 等事件.
AudioManager.OnAudioFocusChangeListener afChangeListener =
    new AudioManager.OnAudioFocusChangeListener() {
        public void onAudioFocusChange(int focusChange) {
            if (focusChange == AUDIOFOCUS_LOSS_TRANSIENT) {
                // Pause playback
            } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
                // Resume playback
            } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {
                am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);
                am.abandonAudioFocus(afChangeListener);
                // Stop playback
            }
        }
    };
当发生duck是,需要降低音量.
OnAudioFocusChangeListener afChangeListener = new OnAudioFocusChangeListener() {
    public void onAudioFocusChange(int focusChange) {
        if (focusChange == AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) {
            // Lower the volume
        } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
            // Raise it back to normal
        }
    }
};

Managing Audio Playback之Managing Audio Focus相关推荐

  1. Android Audio Playback Mode

    常见Playback Mode 常见 FLAG 常见的播放录音线程 Audio HAL 输出流设备 常见Playback Mode 1 Deep buffer Playback:音频文件是在AP侧解码 ...

  2. web audio api_带有Web Audio API的动态声音

    web audio api This article is part of a web dev series from Microsoft. Thank you for supporting the ...

  3. 如何一键制作DTS Audio DVD、AC3 Audio DVD、WAV Audio DVD纯音乐碟片

    DTS Audio DVD.AC3 Audio DVD.WAV Audio DVD纯音乐DVD碟片,不仅音质好.一张碟片可装90首左右的曲目(是普通CD碟片的6倍),而且支持5.1环绕声.播放时可显示 ...

  4. 如何制作WAV Audio DVD、AC3 Audio DVD、DTS Audio DVD封面音乐碟片?

    DTS Audio DVD.AC3 Audio DVD.WAV Audio DVD纯音乐DVD碟片,不仅音质好.一张碟片可装90首左右的曲目(是普通CD碟片的6倍),而且支持5.1环绕声.播放时可显示 ...

  5. html中audio使用src,HTML Audio src用法及代码示例

    DOM Audio的src属性用于设置或返回音频的src属性的值. src属性通常用于指定音频文件的位置(URL). 用法: 返回src属性:audioObject.src 设置src属性:audio ...

  6. html控制多个音频audio css,vue中audio自定义样式(页面中包含多个audio)

    前言 一开始看到UI设计稿,我内心是十分抗拒的.觉得用原生audio的样式就可以了,也不是特别丑,毕竟时间给的不多,自定义样式还要改逻辑啥的.在网上搜索了一番有没有合适的插件,没有看到心动的.最后还是 ...

  7. Training—Managing Audio Playback

    阅读:https://developer.android.com/training/managing-audio/index.html 系统将音频流分为了很多种:stream for playing ...

  8. 2-管理Audio焦点(Managing Audio Playback)

    由于许多App都可能会播放多媒体文件,对于它们之间该如何相互作用就必须要充分考虑.为了避免所有的音乐App同时播放音乐,Android系统提供了audio焦点机制来控制多媒体文件的播放,只有获得了au ...

  9. Managing Audio Playback

    主任务链接地址:http://docs.eoeandroid.com/training/managing-audio/index.html 翻译:长剑耿介 完成时间:2012年9月5日 管理音频播放 ...

最新文章

  1. day042前端之HTML
  2. rust 关于ARM 板卡的使用
  3. Linux bash中I/O重定向及管道
  4. 2022-01-06
  5. 安卓PopupWindow使用详解与源码分析(附项目实例)
  6. 迫于误解压力,RMS从自由软件基金会与MIT离职
  7. new/delete和malloc/free的区别一般汇总
  8. mysql 优化 修复原理_mysql下表的修复与优化
  9. Codeforces Round #439 (Div. 2)题解
  10. Matlab简单教程:条件分支
  11. 全球前十大证券交易所在区块链领域的探索和布局
  12. 服务端访问Linux的DNS出现DNS request timed out..
  13. python下载pywifi
  14. 支持向量机的特点,优点缺点
  15. 1047: 字符图形3-平行四边形
  16. jquery给input赋值 val()方法
  17. xshell6个人版解除窗口限制(亲测可用,需卸载当前xshell6)
  18. java中的轮子是什么意思_后端的轮子(一)
  19. 记录,太坑了,深度学习显卡损坏原来是这样子的。
  20. 多元分析(Multivariate Analysis)

热门文章

  1. 名编辑电子杂志大师教程 | 名编辑设计设置面板
  2. AntWithAntenna
  3. 中国姓氏的日语发音[补充部分]
  4. 【智能优化算法】基于融合莱维飞行与黄金正弦的蚁狮算法求解单目标优化问题matlab代码
  5. 【优化求解】基于精英反向学习带扰动因子的混沌蚁狮算法(EOPCALO)求解单目标优化问题附matlab代码
  6. MIT-6.828-JOS-lab4:Preemptive Multitasking
  7. 三角函数---诱导公式
  8. 数据之美(九):50个精美绝伦的 Infographics(下)
  9. 万顿思电商:拼多多普通类目有哪些?
  10. 无人机项目跟踪记录六十五----无线收发模块电路