运行和其他应用同时播放的实现原理

简介: 运行和其他应用同时播放的实现原理

在做音乐播放器的时候,一般需要写一个监听器来监听音频资源是否被抢占,比如当我们打开网易云播放音乐的时候,打开抖音,这时候就要求网易云音乐暂停播放,然后播放视频。一般需要写一个音频变化的监听器:OnAudioFocusChangeListener。当其他应用申请音频资源的方式不同时候我们做出相应的处理。


OnAudioFocusChangeListener:focusChange表示的是音频改变的模式,即抢占资源的应用的申请音频的方式,这里监听到音频的变化时候可以直接发送消息,利用handler异步处理播放器控件的状态和关闭播放器等操作,当用来修改notification的状态的时候,这时候可能播放器资源被回收(这取决于申请资源focusChange的方式),不能用notification.notify,需要重新创建notification


private OnAudioFocusChangeListener mAudioFocusListener = new OnAudioFocusChangeListener() {
       public void onAudioFocusChange(int focusChange)
   {
           if(focusChange == AudioManager.AUDIOFOCUS_GAIN )
             {        
                 ...
              }
           else if (focusChange =..)
              {
                 ...
              }
       }
   };    



  • AUDIOFOCUS_LOSS:失去了Audio Focus,并将会持续很长的时间。这里因为可能会停掉很长时间,所以不仅仅要停止Audio的播放,最好直接释放掉Media资源。而因为停止播放Audio的时间会很长,如果程序因为这个原因而失去AudioFocus,最好不要让它再次自动获得AudioFocus而继续播放,不然突然冒出来的声音会让用户感觉莫名其妙,感受很不好。这里直接放弃AudioFocus,当然也不用再侦听远程播放控制【如下面代码的处理】。要再次播放,除非用户再在界面上点击开始播放,才重新初始化Media,进行播放。


  • AUDIOFOCUS_LOSS_TRANSIENT:暂时失去Audio Focus,并会很快再次获得。必须停止Audio的播放,但是因为可能会很快再次获得AudioFocus,这里可以不释放Media资源;


AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:暂时失去AudioFocus,但是可以继续播放,不过要在降低音量。


AudioFocus的申请与释放


  获取/放弃AudioFocus的方法都在android.media.AudioManager中,获取AudioFocus用requestAudioFocus();用完之后,放弃AudioFocus,用abandonAudioFocus()


函数原型:

1、public int requestAudioFocus(AudioManager.OnAudioFocusChangeListener l, int streamType, int durationHint)


streamType:播放流类型 AudioStream,其值取决于AudioManager中的STREAM_xxx,


durationHint是持续性的指示:这个值对应于OnAudioFocusChangeListener中focusChange的方式 即值


AUDIOFOCUS_GAIN指示申请得到的Audio Focus不知道会持续多久,一般是长期占有;


AUDIOFOCUS_GAIN_TRANSIENT指示要申请的AudioFocus是暂时性的,会很快用完释放的;


AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK不但说要申请的AudioFocus是暂时性的,还指示当前正在使用AudioFocus的可以继续播放,只是要“duck”一下(降低音量)。


AudioManager.OnAudioFocusChangeListener是申请成功之后监听AudioFocus使用情况的Listener,后续如果有别的程序要竞争AudioFocus,都是通过这个Listener的onAudioFocusChange()方法来通知这个Audio Focus的使用者的。


2、 audioManager.abandonAudioFocus(OnAudioFocusChangeListener);


目录
相关文章
|
机器学习/深度学习 算法 数据可视化
无监督学习的集成方法:相似性矩阵的聚类
在机器学习中,术语Ensemble指的是并行组合多个模型,这个想法是利用群体的智慧,在给出的最终答案上形成更好的共识。
469 0
|
存储 数据安全/隐私保护 芯片
毕业设计 基于51单片机的指纹红外密码电子锁
毕业设计 基于51单片机的指纹红外密码电子锁
438 0
|
算法 JavaScript 前端开发
彩票中奖率的真相:用 JavaScript 看透彩票背后的随机算法(下)
至于分发?我们可以参考一下市面上已有的一些概念做一下对比,下面是笼统的一个网络服务器的TPS预估值,也就是说彩票服务器在1秒内可以处理的最大请求数:
|
JavaScript 前端开发 BI
最好用的 7 款 Vue admin 后台管理系统测评
Vue admin 后台管理系统作为每个项目必备的管理后台,对大家来说十分重要。选不好,配不好,不仅现在用着抓狂,未来迭代升级也困难重重,步步是坑。所以在技术选型阶段,就要对市面上主流的 Vue admin 做到全面了解,知道他们的优缺点,再根据自己项目的需求,有针对性的选择。我试用了市面上所有主流 Vue admin 都 npm 到本地测了一遍,筛掉长期不更新,bug 明显,社区活跃度低,功能单一的 admin 后台,把最好、最有特点的 7 款 Vue admin 挑出来,分享给大家。这些后台各有各的特点,有些功能多样,但整体很重;有些虽然稳定,但上线年头久远,含有大量陈旧功能;有些功能
3861 0
|
12月前
|
人工智能 算法 API
AutoGPT vs BabyAGI:自主任务执行框架对比与选型深度分析
在众多涌现的自主代理框架中,AutoGPT和BabyAGI无疑是最具代表性的两个项目。AutoGPT凭借其强大的任务分解能力和丰富的工具集成,在GitHub上获得了超过150k的星标;而BabyAGI则以其简洁优雅的架构设计和高效的任务执行循环,成为了许多开发者的首选框架。这两个项目的出现,标志着AI自主代理技术从理论研究走向了工程实践的重要转折点。
828 0
AutoGPT vs BabyAGI:自主任务执行框架对比与选型深度分析
|
人工智能 Cloud Native Java
新趋势、新开源、新实践|云栖大会 AI 原生应用架构专场邀您参会
新趋势、新开源、新实践|云栖大会 AI 原生应用架构专场邀您参会
770 109
|
存储 算法 固态存储
机械硬盘格式化就不能恢复吗?
今天我们就来聊聊——机械硬盘格式化后到底还能不能恢复数据?恢复的可能性有多大?应该怎么做才是正确的?
|
缓存 安全 PHP
攻防世界06-get_post
攻防世界06-get_post
|
机器学习/深度学习 人工智能 搜索推荐
🔥解锁AI魔法!生成式大模型入门,你的“提示词”就是金钥匙🗝️
【8月更文挑战第1天】在科技浪潮中,生成式大模型作为AI领域的明星,正引领创作革命。这些模型如GPT和DALL-E,通过深度学习技术,在海量数据中学习理解与创造内容。要驾驭这些模型,关键在于设计精妙的提示词。提示词不仅是简单的指令,更是激发AI创造力的灵魂。例如,创作关于“未来教育”的文章时,“2050年个性化学习如何颠覆传统教学?”比“未来教育”能引导生成更深入、生动的内容。在图像生成方面,详细描绘场景加上情感色彩的提示词,如“星空下的古老城堡”,能使生成的图像更加引人入胜。通过不断优化提示词,我们可以开启AI无限创意的大门,见证科技与艺术的完美融合。
681 7
|
JavaScript 前端开发 应用服务中间件
Nginx——一个域名下部署多个Vue项目
如何在同一域名下部署第二个Vue项目而不影响现有项目:更新`vue.config.js`,设置`publicPath`为`/screen/`。修改Vue Router的`base`为`screen`。在Nginx配置中添加新location `/screen`,指向第二项目`dist`目录。测试访问`http://<域名>/screen/`。别忘了检查并修复任何遗漏的配置,如数据看板默认设置。
1261 2