android音乐播放器的音频焦点控制
2019独角兽企业重金招聘Python工程师标准>>>
什么叫音频焦点 (audio focus)?
android系统是一个多任务操作系统,因此同一时刻允许许多任务同时工作。但是这对音频类应用来说是个挑战,因为如果多个音频同时播放的话,很多情况下用户体验会相当的差!比如听音乐时,来了个电话,这时你的耳机里就是电话和音乐共同工作,绝对是个悲剧!
为了解决这个问题从android2.2开始引入audio focus的概念。当你需要播放音乐或者发送一个通知的时候,你可以去要求获得音频焦点。一旦获得,就可以自由的使用音频输出设备。但是同时它也在时时刻刻的监听着音频焦点的变化。当音频焦点变化时,你需要去合适的处理你的音频输出。
音频焦点工作的示例:
第一步
首先你要获得一个音频管理服务AudioManager
mAudioManager = (AudioManager)getSystemService(AUDIO_SERVICE);
这个通常在service的oncreate中完成。
第二步
然后在合适的地方,比如播放音乐的按钮中放置获得音频焦点的代码
mAudioManager.requestAudioFocus(mAudioFocusListener,
AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
requestAudioFocus方法可以获得音频焦点,其有三个参数,解释如下:
第一个参数 OnAudioFocusChangeListener:就是音频焦点变化时的监听器,这是音频焦点控制的重点。
第二个参数streamType:焦点获得之后的数据传输类型,这里是AudioManager.STREAM_MUSIC
第三个参数durationHint :告知系统,你要求获得音频焦点的用途,系统根据你所要求的类型来给其他监听者发出相应的焦点控制参数。有三种可选
AUDIOFOCUS_GAIN_TRANSIENT:只是短暂获得,一会就释放焦点,比如你只是想发个notification时用下一秒不到的铃声。
AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK:只是背景获得,之前的音频焦点使用者无需释放焦点给我,我将与其共同使用。
AUDIOFOCUS_GAIN:我要求完全获得焦点,其他人需要释放焦点。比如我要播放音乐了,这时就要抢占整个音频焦点。
第三步
实现音频焦点监听器OnAudioFocusChangeListener,这个监听器会根据当前音频焦点的变化,调用onAudioFocusChange(int focusChange)方法,focusChange主要有以下四种参数:
AUDIOFOCUS_AGIN:你已经完全获得了音频焦点
AUDIOFOCUS_LOSS:你会长时间的失去焦点,所以不要指望在短时间内能获得。请结束自己的相关音频工作并做好收尾工作。比如另外一个音乐播放器开始播放音乐了(前提是这个另外的音乐播放器他也实现了音频焦点的控制,baidu音乐,天天静听很遗憾的就没有实现,所以他们两个是可以跟别的播放器同时播放的)
AUDIOFOCUS_LOSS_TRANSIENT:你会短暂的失去音频焦点,你可以暂停音乐,但不要释放资源,因为你一会就可以夺回焦点并继续使用
AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:你的焦点会短暂失去,但是你可以与新的使用者共同使用音频焦点
具体示例如下:
private OnAudioFocusChangeListener mAudioFocusListener = new OnAudioFocusChangeListener(){
public void onAudioFocusChange(int focusChange) {
switch(focusChange){
case AudioManager.AUDIOFOCUS_LOSS:
if(isPlaying()){
//we do not need get focus back in this situation
//会长时间失去,所以告知下面的判断,获得焦点后不要自动播放
mPausedByTransientLossOfFocus = false;
pause();//因为会长时间失去,所以直接暂停
}
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
if(isPlaying()){
//短暂失去焦点,先暂停。同时将标志位置成重新获得焦点后就开始播放
mPausedByTransientLossOfFocus = true;
pause();
}
break;
case AudioManager.AUDIOFOCUS_GAIN:
//重新获得焦点,且符合播放条件,开始播放
if(!isPlaying()&&mPausedByTransientLossOfFocus){
mPausedByTransientLossOfFocus = false;
resume();
}
break;
}
}};
最后
在适当的时候注销掉这个监听器比如在onDestroy()中
mAudioManager.abandonAudioFocus(mAudioFocusListener);
到此整个音频焦点的控制就完成了
讲一个自己的故事,mPausedByTransientLossOfFocus 这个参数一开始没理解有什么作用,就没写。直到发现,我的音乐播放器在我已经手动暂停的情况下,总是在我打完电话后自动播放音乐,才发现他的作用。打完电话,手机就这么一路唱着歌在我的口袋里二逼呵呵的欢乐着。自己还不知道,等再要用手机的时候发现电都被搞掉了不少,且无数人侧目看我是一个怎样的二货喜欢外放音乐.....庆幸手机里没有凤凰传奇的歌曲。
其实这个参数的作用就是可以让播放器仅仅在短暂失去音频焦点并重新获得后才开始播放音乐。而不是任何时候重新获得焦点都开始播放。
转载于:https://my.oschina.net/u/589963/blog/197515
android音乐播放器的音频焦点控制相关推荐
- linux 音频播放器源码,Android音乐播放器源码
相当完整的Android音乐播放器,直接上效果图及源代码,自己欣赏,具体不再解释了,可以说是一个很给力的Android音乐播放器. 示例代码: /* * Copyright (C) 2009 Tele ...
- 音频播放器android课程设计,Android课程设计:Android音乐播放器的设计与实现
内容简介: Android课程设计:Android音乐播放器的设计与实现,共21页,7729字,附源程序等. 摘要:本文主要介绍了一个基于Andriod的音乐播放器的设计与实现.主要包括可行性分析,需 ...
- 基于android音频感知系统,本科毕业论文—基于android音乐播放器的设计与实现专科.doc...
本科毕业论文-基于android音乐播放器的设计与实现专科.doc 专科毕业设计(论文) 题 目 基于Android的音乐播放器设计与实现 毕业论文(设计)原创性声明 本人所呈交的毕业论文(设计)是我 ...
- 简单android音乐播放器课程设计,android音乐播放器课程设计报告.doc
android音乐播放器课程设计报告 android音乐播放器课程设计报告 基于Android音乐播放器的设计与实现 滨江学院 <移动通信程序设计> 课程设计 题 目 院 系 专 业学生姓 ...
- 基于android音乐播放器的设计
本科毕业论文(设计)诚信声明 本人郑重声明:所呈交的毕业论文(设计),题目<---基于android音乐播放器的设计----------->是本人在指导教师的指导下,进行研究工作所取得的成 ...
- Android音乐播放器的设计与实现
课程设计报告 实习名称 课程设计2 设计题目 Android音乐播放器的设计与实现 目录 摘要11 1 引言22 2 可行性分析22 2.1 技术可行性22 2.2 经济可行性33 2.3 管理可行性 ...
- 安卓期末大作业——android音乐播放器
详情介绍 功能描述: 扫描手机上的音乐文件,显示音乐列表,显示歌词,上一首,下一首,音量控制进度条显示.app实现了在android6.0或以上动态权限申请功能,适合新手研究.搭建方法请看入门教程菜单 ...
- Android音乐播放器——甩动切歌
Android音乐播放器--甩动切歌 前言: 使用MediaPlayer实现Android的音乐播放器,能够播放.暂停.停止歌曲,控制播放上一首,下一首歌曲:同时可以使用感应器来感应甩动动作,然后完成 ...
- 基于android的音乐播放器毕业设计,基于android音乐播放器的毕业设计ppt
<基于android音乐播放器的毕业设计ppt>由会员分享,可在线阅读,更多相关<基于android音乐播放器的毕业设计ppt(29页珍藏版)>请在人人文库网上搜索. 1.1. ...
最新文章
- 李开复:发明期已过,AI科学家创业需谨慎(附演讲视频)
- day3.python 学习之列表
- 基于multisim的fm调制解调_矢量调制分析
- oracle 11g常用命令
- 产品设计的从0到1全流程:以优惠券为例
- Python数据结构与算法(1.5)——Python基础之函数与异常
- Android 四种启动模式
- layer子窗口与父窗口传值
- Activityn 生命周期
- 如何 把 laravel model 的主键修改为字符串类型
- ocr小白入门CRNN
- YOLO v2详细解读
- win7系统移动磁盘合并卷
- IDEA相对路径没有效果的问题
- html完整语句,html语句
- 汽车雨刷器的保养细则
- 考研数据结构之线性表(1.7)——练习题之分离单链表的奇数偶数(C表示)
- 原件常识:以“光”为传媒的光电耦合器
- Java注解annotation invalid type of annotation member
- 电解电容和钽电容的区别