最近在做Marvell的项目,碰到个耳机热插拔的问题,所以顺便看了下相关代码,这里来贡献一下给大家。

我们这里以PXA的代码为例,整个框架比较的简单清晰,上层是分别是HeadsetObserver.java以及HookSwitchObserver.java,

它们会直接读取/sys/class/switch/中某一特定的设备的state,比如"/sys/class/switch/h2w/state",来获取最新的状态。

我们把它分为两部分来看

kernel/drivers/switch/

这里存放着headset以及hook的驱动代码,首先switch_class.c中会先注册switch这个子类,并提供switch_dev_register这个注册入口,

对应的设备驱动调用switch_dev_register把自己注册在switch这个子类中,比如:

switch_data_headset->sdev.name = pdata_headset->name; //name is h2w

switch_data_headset->name_on = pdata_headset->name_on;

switch_data_headset->name_off = pdata_headset->name_off;

switch_data_headset->state_on = pdata_headset->state_on;

switch_data_headset->state_off = pdata_headset->state_off;

switch_data_headset->sdev.print_state = switch_headset_print_state;

info->psw_data_headset = switch_data_headset;

ret = switch_dev_register(&switch_data_headset->sdev);

那么在/sys/class/switch目录中就会生成h2w这个子目录,里面会有state,name等一些成员,而驱动判断耳机是否插入则是通过

gpio模拟中断,在耳机插入的时候产生电平的变化来调用中断回调函数,回调函数中会改变state状态值,就这么简单

frameworks/base/services/java/com/android/server/HeadsetObserver.java这是android耳机监测的代码

它会通过读取/sys/class/switch/h2w/state来判断此时是否有耳机插入,比如:

private static final String HEADSET_STATE_PATH = "/sys/class/switch/h2w/state";

FileReader file = new FileReader(HEADSET_STATE_PATH);

然后通过

public void onUEvent(UEventObserver.UEvent event) {

if (LOG) Slog.v(TAG, "Headset UEVENT: " + event.toString());

try {

update(event.get("SWITCH_NAME"), Integer.parseInt(event.get("SWITCH_STATE")));

} catch (NumberFormatException e) {

Slog.e(TAG, "Could not parse switch state from event " + event);

}

}

来更新耳机的检测状态。hook监测和耳机监测类似,这里就不再重复了,写得有点乱,希望对朋友们有帮助。

android 拦截耳机按键,Android耳机监测以及耳机按键监测相关推荐

  1. android 拦截h5方法,android - webview 拦截资源的几个方法和特点

    android - webview 拦截资源的几个方法和特点 2017-08-12 18:27 访问量: 2060 分类: 技术 看下面的代码,就可以看出端倪来了 onPageStarted, 触发的 ...

  2. android 拦截音量键,Android 音量键增大减小捕捉

    Android 音量键增大减小捕捉: @Override public boolean onKeyDown( int keyCode, KeyEvent event) { // TODO Auto-g ...

  3. android 拦截国外电话号码,Android拦截外拨电话程序示例

    拦截监听外拨的电话,并进行处理: 向外拨打电话时系统会发出一个有序广播,虽然该广播最终会被拔号器里的广播接收者所接收并实现电话拔打,但我们可以在广播传递给拔号广播接收者之前先得到该广播,然后清除传递给 ...

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

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

  5. android之broadcastreceiver 耳机按键,Android BroadcastReceiver 实时监听耳机拔出事件

    写作背景:最近在做视频播放器,客户提出两项新需求: 插耳机看视频,拔出耳机,视频需要暂停. 视频播放时,按耳机按钮,视频暂停播放:再按耳机按钮,视频暂停. 第一个问题,插耳机看视频时,如何监听到耳机拔 ...

  6. 【Android 高性能音频】Oboe 音频流打开后 耳机 / 音箱 插拔事件处理 ( 动态注册广播接收者监听耳机插拔事件 | 重新打开 Oboe 音频流 )

    文章目录 一.动态注册广播接收者监听耳机插拔事件 二.jni 层的 Oboe 播放器代码 ( 重新打开 Oboe 音频流 ) 三.相关资料 基于 [Android 高性能音频]Oboe 开发流程 ( ...

  7. 一篇读懂:Android/iOS手机如何通过音频接口(耳机孔)与外设通信

    一文读懂Android/iOS手机如何通过音频接口与外设通信 更多技术干货,欢迎扫码关注博主微信公众号:HowieXue,一起学习探讨软硬件技术知识经验,关注就有海量学习资料免费领哦: 目录 一文读懂 ...

  8. 【Android 高性能音频】Oboe 音频流打开后 耳机 / 音箱 插拔事件处理 ( 设置 Oboe 音频设备 ID | setDeviceId 函数原型 | AudioStream 音频流 )

    文章目录 一.设置 Oboe 音频设备 ID ( AAudio ) 二.设置 Oboe 音频设备 ID ( OpenSL ES) 三.oboe :: AudioStreamBuilder :: set ...

  9. android 耳机检测,android – 检测耳机是否有麦克风

    更新: 继续在您的活动的onResume()中注册ACTION_HEADSET_PLUG. 如果用户在启动后插入/拔出耳机,平台将在恢复时为您的活动提供最新状态. 以下测试代码工作: package ...

最新文章

  1. 启动过程以及故障排除
  2. 解決yum [Errno -1] Metadata file does not match checksum
  3. java-number2
  4. ajax中的同步异步
  5. python 数据驱动接口自动化框架_python接口自动化测试 - 数据驱动DDT模块的简单使用...
  6. 【系统设计】发现类的方法
  7. 常用的前端跨域的几种方式
  8. 九张 Gif 图回顾 Web 设计的 25 年历史
  9. 04-07 接口请求构造
  10. swift基础语法(02-基本数据类型)
  11. 如何写一篇学术研讨会级的论文
  12. 关系数据库、关系代数和关系运算
  13. 大数据必学Java基础(二十六):数组的应用题
  14. Anaconda安装Jupyter Notebook的常用方法(安装失败解决方法)
  15. 什么是着色器/Threejs如何使用着色器/Threejs使用着色器实现平面网格的动态效果案例
  16. JZOJ8.14(C组)帕秋莉·诺雷姬
  17. MySQL5.7自带分词搜索使用
  18. Solr的精确匹配搜索
  19. 捕捉RAISERROR异常
  20. javax.swing的基本组成

热门文章

  1. JAVA的发展方向以及前辈的一些看法
  2. c语言上级题库,c语言上级题库.doc
  3. win7安全模式如何打开计算机管理,Win7怎么退出安全模式 win7系统退出安全模式的方法...
  4. CE学习修改卡槽时间
  5. 2003服务器系统QQ安装不了,qq怎么安装不了(QQ怎么都安装不上重装也不行,是哪里出了问题?)...
  6. PhoneGap移动开发框架
  7. Docker手把手教程(一)概述 安装
  8. 28岁,转行学IT还来得及么?
  9. Spring_Ioc基本配置使用(基于xml)
  10. 基于layui后台html模板免费下载