这里写目录标题

  • 什么是焦点?
    • 使用场景举例
    • 具体使用规范

什么是焦点?

焦点顾名思义就是聚集点,而我们今天要说到的是音频的焦点。音频的焦点说简单点,就是你能听见的音频的声音。

在安卓设备上默认是可以好多声音一起播放的,而加入了焦点机制,可以更加有序的对声音进行管理,从而提高了用户的体验感。

官网给出的大致步骤如下:

  • 在开始播放之前,调用requestAudioFocus()方法,并检查返回值是否是AUDIOFOCUS_REQUEST_GRANTED,若成功获取,则开始播放。
  • 当App失去音频焦点时,根据失去的焦点类型,应该暂停播放,或者将音量调低。
  • 当播放结束时,释放音频焦点, abandonAudioFocus()

相关音频焦点的处理方法

requestAudioFocus():用于申请音频焦点
abandonAudioFocus():用于释放音频焦点
AudioManager.OnAudioFocusChangeListener接口,提供了onAudioFocusChange()方法来监听音频焦点变化

使用场景举例

当播放一个视频的时候,这时你想让另一个语音播放,在播放语音的时候,视频声音是不播放的,但是视频是继续播放的,等语音播放完的时候,视频的声音播放。

具体使用规范

处理音频焦点都是通过AudioManager这个类。
1、首先我们得在播放视频的逻辑代码中国,获得一个AudioManager 实例,一般放在oncreate中实现。

AudioManager mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);

2、设置实现音频焦点监听器OnAudioFocusChangeListener,这个监听器会根据当前音频焦点的变化,调用onAudioFocusChange(intfocusChange)方法。

AudioManager.OnAudioFocusChangeListener mAudioFocusChangeListener = new AudioManager.OnAudioFocusChangeListener() {@Overridepublic void onAudioFocusChange(int focusChange) {//音频焦点切换switch (focusChange) {case AudioManager.AUDIOFOCUS_GAIN://完全获得了音频焦点, 重新获取audio focus,开始播放或者提高音量break;case AudioManager.AUDIOFOCUS_LOSS:// 失去audio focus很长一段时间,必须停止所有的audio播放,清理资源//onAudioFocusChange长时间失去音频焦点,停止播放或者降低音量,释放资源break;case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:// 暂时失去audio focus,但是很快就会重新获得,在此状态应该暂停所有音频播放,但是不能清除资源// if (mediaPlayer.isPlaying())//   mediaPlayer.pause();break;case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:// 暂时失去 audio focus,但是允许持续播放音频(以很小的声音),不需要完全停止播放,也可降低音量。break;default:break;}}};

2、然后在视频播放的地方进行request请求,即申请获得音频焦点,一般在onprepare中,根据自己的情况而定。就在合适的地方,比如播放音乐的按钮中放置获得音频焦点的代码。哈哈哈,具体你自己定~~

 mAudioManager.requestAudioFocus(mAudioFocusListener,AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);

这个方法有三个参数,接下来讲下他们分别代表的是什么意思

第一个参数 OnAudioFocusChangeListener:就是音频焦点变化时的监听器,这是音频焦点控制的重点。

第二个参数streamType:申请音频焦点处理的音频类型,这里是AudioManager.STREAM_MUSIC

  • STREAM_MUSIC——音乐类
  • STREAM_VOICE_CALL——通话
  • STREAM_SYSTEM——系统
  • STREAM_RING——电话铃声
  • STREAM_ALARM——闹钟
  • STREAM_NOTIFICATION——系统通知
  • STREAM_DTMF——DTMF调音

他有好几个可选的。

第三个参数durationHint :告知系统,你要求获得音频焦点的用途,系统根据你所要求的类型来给其他监听者发出相应的焦点控制参数。有三种可选
AUDIOFOCUS_GAIN:我要求完全获得焦点,其他人需要释放焦点。比如我要播放音乐了,这时就要抢占整个音频焦点。
AUDIOFOCUS_GAIN_TRANSIENT:只是短暂获得,一会就释放焦点,比如你只是想发个notification时用下一秒不到的铃声。
AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK:只是背景获得,之前的音频焦点使用者无需释放焦点给我,我将与其共同使用。

二、在另一个短暂声音的功能类中,在其oncreate中进行注册

 // 处理音频焦点-处理多个程序会来竞争音频输出设备mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {// 对于Android 8.0+audioFocusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT).setOnAudioFocusChangeListener(mAudioFocusChangeListener).build();audioFocusRequest.acceptsDelayedFocusGain();}

具体功能地方进行以下代码的实现

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {mAudioManager.requestAudioFocus(audioFocusRequest);Log.e(TAG, "请求音频焦点");} else {// 小于Android 8.0int result = mAudioManager.requestAudioFocus(mAudioFocusChangeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);if (result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {// could not get audio focus.}else {}}

记得一定要释放资源

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {mAudioManager.abandonAudioFocusRequest(audioFocusRequest);}else
{mAudioManager.abandonAudioFocus(mAudioFocusChangeListener);
}

android音视频焦点切换相关推荐

  1. android音视频指南-支持的媒体格式

    android音视频指南-支持的媒体格式 本文描述了Android平台提供的媒体编解码器.容器和网络协议支持. 作为应用程序开发人员,您可以使用任何可以在任何Android设备上使用的媒体编解码器,包 ...

  2. Android音视频点/直播模块开发

    前言 随着音视频领域的火热,在很多领域(教育,游戏,娱乐,体育,跑步,餐饮,音乐等)尝试做音视频直播/点播功能,那么作为开发一个小白,如何快速学习音视频基础知识,了解音视频编解码的传输协议,编解码方式 ...

  3. Android 音视频采集与软编码总结

    请尊重原创,转载请注明出处:http://blog.csdn.net/mabeijianxi/article/details/75807435(本文已在 "任玉刚" 微信公众号发布 ...

  4. Android音视频点/直播模块开发实践总结-zz

    随着音视频领域的火热,在很多领域(教育,游戏,娱乐,体育,跑步,餐饮,音乐等)尝试做音视频直播/点播功能.那么作为开发一个小白,如何快速学习音视频基础知识,了解音视频编解码的传输协议,编解码方式,以及 ...

  5. Android 音视频开发(二) -- Camera1 实现预览、拍照功能

    音视频 系列文章 Android 音视频开发(一) – 使用AudioRecord 录制PCM(录音):AudioTrack播放音频 Android 音视频开发(二) – Camera1 实现预览.拍 ...

  6. 反思 | Android 音视频缓存机制的系统性设计

    反思 系列博客是我的一种新学习方式的尝试,该系列起源和目录请参考 这里 . 背景 在自媒体的时代,音视频播放 俨然已成为内容类型 APP 最基础的能力,对于 Android 开发者而言,无论是 Goo ...

  7. Android+音视频 全新面试题,求职/跳槽吊打面试官

    每年的金三银四.金九银十都是程序员狂欢的时刻,众多企业在这个时期也都大规模的进行招聘. 就我身边的很多Android开发都有这么一个习惯:跳槽之前都会遍寻各种面试题进行刷题,不过尽管找了很多面试题,面 ...

  8. android音/视频,直播

    流媒体 采用流式传输的方式在Internet / Intranet播放的媒体格式.流媒体的数据流随时传送随 时播放,只是在开始时有些延迟.边下载边播入的流式传输方式不仅使启动延时大幅度地缩短,而且对系 ...

  9. Android音视频编辑库,Android音视频处理.pdf

    Android音视频处理 Android 视频处理 沈青海 admin@3 Copyright 2008-2009 Farsight. All rights reserved. 频处理 } Media ...

  10. Android音视频学习系列(九) — Android端实现rtmp推流

    系列文章 Android音视频学习系列(一) - JNI从入门到精通 Android音视频学习系列(二) - 交叉编译动态库.静态库的入门 Android音视频学习系列(三) - Shell脚本入门 ...

最新文章

  1. AD二次开发提示“出现了一个操作错误”的解决办法
  2. Web开发者需养成的好习惯
  3. python中tile的用法_python3中numpy函数tile的用法详解
  4. 小议WebRTC拥塞控制算法:GCC介绍
  5. ArcGIS Desktop开发基础(转)
  6. wpf 开源框架_.NET Core跨平台基础框架:10 篇热文汇总
  7. linux多线程求和_linux 多线程信号处理总结
  8. [js] Geolocation.getCurrentPosition()用来做什么的?在什么浏览器不受兼容?
  9. python爬取b站弹幕分析_python爬取B站视频弹幕分析并制作词云
  10. 用户行为分析笔记(二):系统的整体架构
  11. C# Dispose模式详细分析
  12. only has output.xml, how to check failed step.
  13. [转载] python数学计算模块之math常用函数学习使用
  14. Js打印object对象两种方法
  15. 路由器的工作原理、超详细的路由器转发数据包的封装过程及华为配置静态和默认路由命令
  16. 微信小程序getLocation定位偏差问题
  17. 关于迪文屏T5L使用C51编程
  18. vue和 element ui下载到本地后引入
  19. linux 软链接 相对路径,Linux入门之ln命令创建软链接的绝对路径和相对路径详解(Ubuntu)...
  20. mysql是什么数据库

热门文章

  1. android 读取excel表格数据,并存入数据库
  2. 新员工来到项目组的愿景_为您的项目设定愿景
  3. 什么样的团队才是理想中的团队? (转自AtTeam官微的博客)
  4. Java面向对象编程练习:定义一个交通工具的基类,包含成员属性商标和颜色,成员方法run和showInfo显示信息。编写小汽车类和卡车类来继承交通工具类,添加相应的方法显示各自的信息
  5. 阿拉伯数字转中文数字(大写或小写)
  6. GitLab之Runner注册K8S
  7. ir2104驱动电路原理
  8. 【系】微信小程序云开发实战坚果商城-前端之分类实现
  9. 连接网络计算机提示没有访问权限,无网络访问权限,教您无网络访问权限怎么办...
  10. 网络 计算机 访问权限,电脑无网络访问权限如何解决