最近,项目了有这么一个工作需求,当用户正在使用我们产品里提供的音乐播放器播放音乐时,用户把耳机或者蓝牙耳机接入后,过一会儿,用户又把耳机给拔除,或者断开蓝牙耳机的连接,我们需要暂停播放音乐,

google, baidu了一下, 一般做法是:

定义一个BroadcastReceiver对象,  对于有线耳机,监听Intent.ACTION_HEADSET_PLUG系统广播,对于蓝牙耳机,监听BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED系统广播

[java] view plain copy
  1. private void registerHeadsetPlugReceiver() {
  2. IntentFilter intentFilter = new IntentFilter();
  3. intentFilter.addAction("android.intent.action.HEADSET_PLUG");
  4. registerReceiver(headsetPlugReceiver, intentFilter);
  5. // for bluetooth headset connection receiver
  6. IntentFilter bluetoothFilter = new IntentFilter(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED);
  7. registerReceiver(headsetPlugReceiver, bluetoothFilter);
  8. }
  9. private BroadcastReceiver headsetPlugReceiver = new BroadcastReceiver() {
  10. @Override
  11. public void onReceive(Context context, Intent intent) {
  12. String action = intent.getAction();
  13. if (BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED.equals(action)) {
  14. BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
  15. if(BluetoothProfile.STATE_DISCONNECTED == adapter.getProfileConnectionState(BluetoothProfile.HEADSET)) {
  16. //Bluetooth headset is now disconnected
  17. handleHeadsetDisconnected();
  18. }
  19. } else if ("android.intent.action.HEADSET_PLUG".equals(action)) {
  20. if (intent.hasExtra("state")) {
  21. if (intent.getIntExtra("state", 0) == 0) {
  22. handleHeadsetDisconnected();
  23. }
  24. }
  25. }
  26. }
  27. };

这样做可以基本满足需求,但是项目组长说,这样做不完美,因为当拔出有线耳机时,播放器不会马上暂停,要等上一秒钟,才会收到Android的系统广播,

[java] view plain copy
  1. android.intent.action.HEADSET_PLUG,他说其他音乐播放器没有这个延迟,经过调查发现,QQ音乐确实没有这个延迟,耳机一拔,播放器立刻暂停,

在网上找了一会儿,找到相关资料:从硬件层面来看,直接监听耳机拔出事件不难,耳机的拔出和插入,会引起手机电平的变化,然后触发什么什么中断,

最终在stack overflow找到答案,监听Android的系统广播AudioManager.ACTION_AUDIO_BECOMING_NOISY, 但是这个广播只是针对有线耳机,或者无线耳机的手机断开连接的事件,监听不到有线耳机和蓝牙耳机的接入,但对于我的需求来说足够了,监听这个广播就没有延迟了,UI可以立即响应

[java] view plain copy
  1. private void registerHeadsetPlugReceiver() {
  2. IntentFilter intentFilter = new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY);
  3. registerReceiver(headsetPlugReceiver, intentFilter);
  4. }
  5. private BroadcastReceiver headsetPlugReceiver = new BroadcastReceiver() {
  6. @Override
  7. public void onReceive(Context context, Intent intent) {
  8. String action = intent.getAction();
  9. if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(action)) {
  10. handleHeadsetDisconnected();
  11. }
  12. }
  13. };

Android 实时监听耳机拔除相关推荐

  1. android之broadcastreceiver 耳机按键,Android 实时监听耳机按钮事件

    写作背景:最近在做视频播放器,客户提出两项新需求: 插耳机看视频,拔出耳机,视频需要暂停.(Android 实时监听耳机拔出事件) 视频播放时,按耳机按钮,视频暂停播放:再按耳机按钮,视频暂停. 如何 ...

  2. JAndFix: 基于Java实现的Android实时热修复方案

    简述 JAndFix是一种基于Java实现的Android实时热修复方案,它并不需要重新启动就能生效.JAndFix是在AndFix的基础上改进实现,AndFix主要是通过jni实现对method(A ...

  3. [转] Android实时抓包分析 : 善用adb调试桥

    Android实时抓包分析 : 善用adb调试桥 谈到android网络抓包,很多人都能想到牛逼轰轰的神器tcpdump.方法就是在android机器上面安装tcpdump,然后通过-w参数把抓包记录 ...

  4. Android 实时录音和回放,边录音边播放 (KTV回音效果)

    原文地址为: Android 实时录音和回放,边录音边播放 (KTV回音效果) 上一篇介绍了如何使用Mediarecorder来录音,以及播放录音.不过并没有达到我的目的,一边录音一边播放.今天就讲解 ...

  5. Android Kotlin - 监听耳机的插入和拔出

    Android Kotlin - 监听耳机的插入和拔出 开发音乐应用时需要监听耳机的插入和拔出,用以调整音量或暂停播放. 采用注册广播的方式. 新建 HeadsetChangeReceiver 类 i ...

  6. Android实时网络质量检测

    Android实时质量检测 传送门: github csdn 原理 使用ping -n -i %f -c %d %s命令实现网络质量检测,具体参数如下: -n count 发送 count 指定的 E ...

  7. C++版Android实时投屏软件系统源码,安卓手机投屏软件源码,无需root权限

    QtScrcpy QtScrcpy 可以通过 USB / 网络连接Android设备,并进行显示和控制.无需root权限. 同时支持 GNU/Linux ,Windows 和 MacOS 三大主流桌面 ...

  8. java到站提醒实现,基于安卓Android实时公交查询系统的设计(Androidstudio)

    基于安卓Android实时公交查询系统的设计(Androidstudio)(任务书,开题报告,中期检查表,外文翻译,论文16000字,程序代码) 摘要:时至今日,公交仍是人们主要的出行方式之一,用手机 ...

  9. Android 实时采集声音的频率和大小

    Android实时采集声音的频率和大小 注 笔者本不是专业人士,通过查了几篇资料和请教软件部门的同学搭的demo ,如有不正确之处,请及时指出 1.原理 声音大小省略,网上可以很好搜到 使用Audio ...

最新文章

  1. javascript语言学习
  2. 刚评上院士的马斯克就飘了,说要每天发射三次大火箭,向火星转移100万吨物资...
  3. Distributed System: Lamport clock vs Vector clock | 分布式系统:Lamport clock 和 Vector clock 详解
  4. Pentium 4处理器架构/微架构/流水线 (4) - NetBurst框图
  5. python colormap_Python科学计算技巧积累八——colormap 和 contour map的绘制
  6. decimal在java中用什么类型,MYSQL数据库 的 decimal 字段类型 和 Java 的BigDecimal
  7. linux mysql-5.7.13 源码安装,Linux下安装-配置-mysql-5.7.13
  8. 用mapreduce 处理气象数据集
  9. mac设置多个屏幕显示的问题
  10. iCode代码托管的一些基本指令
  11. 带宽、特征频率、截止频率、-3dB
  12. java openxml word_C#采用OpenXml实现给word文档添加文字
  13. 百度网盘分享文件已经被取消的解决办法
  14. 常用测试软件01——串口调试软件
  15. 使用Xavier读取RealSense D435i的踩坑经历
  16. Fortran NINT函数意思
  17. App Store 审核指南 2017-12-11
  18. 课程设计题十二:电子密码锁
  19. 公司新来了个00后测试工程师,一副毛头小子的样儿,哪想到是新一代卷王...
  20. Nginx支持TCP端口转发

热门文章

  1. make命令和makefile文件
  2. Flutter 解决App登录页面软键盘遮挡住登录按钮或顶起底部控件的问题
  3. linux 用户相关操作
  4. 实践出真知:大乱斗游戏
  5. 搜索算法--爬山法 (代码示例)
  6. 前端代码规范——CSS代码规范
  7. 优化理论20---插值法: Hermite插值法、龙格现象、分段插值、样条插值
  8. 如何使用ssh来连接windows
  9. css样式对IOS设备苹果手机不支持解决方法
  10. 文字/文本超出显示省略号