目录介绍
1.耳机拔出时暂停播放 1.1 拔出耳机自动暂停 , 插入耳机自动恢复播放 1.2 实现的原理分析 1.3 代码实现逻辑 2.耳机线控,耳机控制声音 2.1 耳机按键也可以控制音量调节 2.2 在5.0之前和5.0之后比较 2.3 实现的逻辑分析 3.蓝牙耳机特殊处理 3.1 如何监听蓝牙耳机打开关闭 3.2 如何监听蓝牙耳机按键调节声控功能 4.外放,耳机,听筒之间的切换 4.1 相关概念讲解 4.2 代码展示案例 5.其他问题说明 5.1 版本更新情况 5.2 参考链接 5.2 个人博客
好消息
博客笔记大汇总【16年3月到至今】,包括Java基础及深入知识点,Android技术博客,Python学习笔记等等,还包括平时开发中遇到的bug汇总,当然也在工作之余收集了大量的面试题,长期更新维护并且修正,持续完善……开源的文件是markdown格式的!同时也开源了生活博客,从12年起,积累共计47篇[近20万字],转载请注明出处,谢谢! 链接地址:https://github.com/yangchong211/YCBlogs 如果觉得好,可以star一下,谢谢!当然也欢迎提出建议,万事起于忽微,量变引起质变!
0.备注
1 耳机拔出时暂停播放
1.1 拔出耳机自动暂停 , 插入耳机自动恢复播放
在使用音频APP时,细心的你有没有发现,拔出耳机,暂停播放了;插上耳机又恢复播放了。是不是很神奇…… 如何实现这个功能了,这个我也是通过百度才知道了,但是代码还是不太懂,IntentFilter作用?后来明白,其实不用深入底层原理也没有多大关系……
1.2 实现的原理分析
其原理还是通过发广播接收者控制播放与暂停功能。首先创建一个广播接收者,然后在播放时注册,在暂停时取消,就可以实现这个功能。 具体的逻辑可以直接参考代码……其实这个也是百度查的!
1.3 代码实现逻辑
/**
* 来电/耳机拔出时暂停播放
* 在播放时调用,在暂停时注销
*/
private final AudioEarPhoneReceiver mNoisyReceiver = new AudioEarPhoneReceiver();
private final IntentFilter mFilter = new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY);
//注册监听来电/耳机拔出时暂停播放广播
registerReceiver(mNoisyReceiver, mFilter);
//注销监听来电/耳机拔出时暂停播放广播
unregisterReceiver(mNoisyReceiver);
/**
* 来电/耳机拔出时暂停播放
* 其实这个跟通知处理逻辑一样
*/
public class AudioEarPhoneReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if(action!=null && action.length()>0){
switch (action){
//来电/耳机拔出时暂停播放
case AudioManager.ACTION_AUDIO_BECOMING_NOISY:
PlayService.startCommand(context, MusicPlayAction.TYPE_START_PAUSE);
break;
default:
break;
}
}
}
}
2 耳机线控,耳机控制声音
2.1 耳机按键也可以控制音量调节
不得不说Android手机需要考虑不同情况,就拿耳机来说,有的有音控,有的没有音控,有的手机支持,有的手机不支持,虽然说不太重要,但还是可以思考一下。目前参考大量的案例,只能解决大部分的正常控制声音功能。 刚开始看到这个真是蒙圈了,不过有Google,不担心。对于程序员来说没有实现不了的功能,只有自己的技术过不过关,哈哈,同事说的……找到了答案
2.2 在5.0之前和5.0之后比较
对于5.0以上系统的手机,激活了MediaSession,就可以不用关心耳机声控了,会自己实现。 对于5.0以前系统的手机,还是需要自己手动设置相关属性的,需要自己手动实现
2.5.3 实现的逻辑分析
这里暂且只是讨论5.0以前的处理方法,需要自己监听耳机按键 通过代码KeyEvent event = intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);获取到KeyEvent的对象,然后获取对应点击事件的code,然后再做播放暂停,上一首,下一首处理。具体代码可以参考EarphoneControlReceiver类
3.蓝牙耳机特殊处理
3.1 如何监听蓝牙耳机打开关闭
3.2 如何监听蓝牙耳机按键调节声控功能
4.外放,耳机,听筒之间的切换
4.1 相关概念讲解
在Android系统中是用AudioManager来管理播放模式的,通过AudioManager.setMode()方法来实现. 在setMode()方法中有以下几种对应不同的播放模式:
MODE_NORMAL: 普通模式,既不是铃声模式也不是通话模式
MODE_RINGTONE:铃声模式
MODE_IN_CALL:通话模式
MODE_IN_COMMUNICATION:通信模式,包括音/视频,VoIP通话.(3.0加入的,与通话模式类似)
其中:
播放音乐的对应的就是MODE_NORMAL, 如果使用外放播则调用audioManager.setSpeakerphoneOn(true)即可.
4.2 代码展示案例
若使用耳机和听筒,则需要先设置模式为MODE_IN_CALL(3.0以前)或MODE_IN_COMMUNICATION(3.0以后).
public class AudioSoundManager {
private AudioManager mAudioManager;
/**
* 初始化操作
* @param content playService对象
*/
public AudioSoundManager(@NonNull PlayService content) {
mAudioManager = (AudioManager) content.getSystemService(AUDIO_SERVICE);
}
/**
* 切换到外放
*/
public void changeToSpeaker(){
mAudioManager.setMode(AudioManager.MODE_NORMAL);
mAudioManager.setSpeakerphoneOn(true);
}
/**
* 切换到耳机模式
*/
public void changeToHeadset(){
mAudioManager.setSpeakerphoneOn(false);
}
/**
* 切换到听筒
*/
@SuppressLint("ObsoleteSdkInt")
public void changeToReceiver(){
mAudioManager.setSpeakerphoneOn(false);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
} else {
mAudioManager.setMode(AudioManager.MODE_IN_CALL);
}
}
}
5.其他问题说明
5.1 版本更新情况
v1.0.0 2017年12月8日 v1.0.1 2018年2月2日
5.2 参考链接
5.2 个人博客