Android 4.x耳机插拔检测实现方法

本文详细介绍了Android 4.x中耳机插拔检测的两种机制:InputEvent和UEvent。主要讲解了硬件原理,以及Kernel和Android上层的处理流程。UEvent是默认机制,而InputEvent需要特定配置。通过分析内核中的switch driver和Android的WiredAccessoryManager,展示了如何实现耳机状态的检测和通知。
摘要由CSDN通过智能技术生成

        本文基于Android 4.4撰写,另外也参看了一下4.2,机制相同,也许细节方面会有所不同,这里以4.4为主。

        Android耳机插拔可以有两个机制实现:

       1.      InputEvent

       2.      UEvent

        其中UEvent是Android系统默认的耳机插拔机制,所以我这里最终代码是基于UEvent实现的,对于InputEvent机制只是大概看了看,并没有具体实现,因此不能保证一定正确,寻求解决方法的同学可以直接移步只对UEvent方式的介绍。

 

1.   耳机检测的硬件原理

        首先我们看看耳机检测的原理。一般的耳机检测包含普通的耳机检测和带mic的耳机检测两种,这两种耳机统称为Headset,而对于不带mic的耳机,一般称之为Headphone。

        对于Headset装置的插入检测,一般通过Jack即耳机插座来完成,大致的原理是使用带检测机械结构的耳机插座,将检测脚连到可GPIO中断上,当耳机插入时,耳机插头的金属会碰到检测脚,使得检测脚的电平产生变化,从而引起中断。这样就可以在中断处理函数中读取GPIO的的值,进一步判断出耳机是插入还是拔出。

        而对于Headset是否带mic的检测,需要通过codec附加的micbias电流的功能,具体可以参考我的下一篇文章。

2.   两种方式的切换

        前面提到Android默认提供了两种解决方法,那么一定也提供了两种方式的切换,这个提供切换的设置名为config_useDevInputEventForAudioJack,对Android源代码进行全局搜索,可以看到它在frameworks/base/core/res/res/values/config.xml中,默认为false,即不使用InputEvent方式,另外在源码包的厂商相关的文件夹中也找到了相关的设置,如下:

/android/4.4/device/asus/flo/overlay/frameworks/base/core/res/res/values/config.xml

 <boolname="config_useDevInputEventForAudioJack">false</bool>

/android/4.4/device/samsung/manta/overlay/frameworks/base/core/res/res/values/config.xml

     <boolname="config_useDevInputEventForAudioJack">true</bool>

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值