腾讯优测是专业的移动自动化测试平台,提供多维度的自动化测试服务,让测试更简单!
近期有报道称,澳大利亚悉尼市新某大学的一名男生在课堂上看电影,不料耳机没有插好,变成了现场直播。。。
若是你认为耳机没插好事件尚且能够hold住,那么接下来的问题会不会让你更加尴尬?当你在手机插上耳机准备看电影时,声音却从扬声器里响了出来。。。
没想到藏得这么深,仍是让耳机出卖了。。。
容我静静,为避免此类尴尬事件再次发生,我特地对耳机在手机上的插拔原理研究了一番。感兴趣的朋友咱们能够一块儿讨论。。。
一、Android耳机插拔检测原理
Android系统在耳机插入和拔出的时候会发送广播,经过Broadcast Receiver 监听”android.intent.action.HEADSET_PLUG” 这个Intent来判断耳机是否插拔。java
二、Android耳机插拔检测具体实现
在Android4.0以上的版本,耳机插拔检测的源文件位于frameworks/base/services/java/com/android/server/WiredAccessoryObserver.java;(4.1及以上是WiredAccessoryManager.java;在android4.0之前是HeadsetObserver.java)顾名思义,它主要是用来检测有线的设备链接状态。
Android耳机插拔检测流程图
咱们重点来看一下WiredAccessoryObserver
WiredAccessoryObserver继承自Observed(Android耳机插拔能够有两个机制实现:Input Event和Event),从该文件的路径能够得知,这个类位于service目录,应该是在android系统服务初始化的时候实例化的,在这个类的构造方法中,注册了一个广播接收器用来接收系统启动完毕的广播。android
WiredAccessoryObserver工做流程图函数
在收到这个广播以后:先执行i nit()函数,在这个函数中判断要检测的设备是否已经处于链接状态(好比开机以前就已经插上),若是已经链接上就调用gestate当即向系统上报。
而后调用observing函数监测文件节点路径是否有状态变化,这个函数位于他的父类Observed.java中。在以前创建好的监测中,若是kernel层有event事件发送上来则会去匹配这个路径字符串,若是匹配成功会调用在WiredAccessoryObserver重载的eventful函数,从event string中解析出death, name和state的值,而后继续调用gestate进行处理。
在gestate中会对设备的类型进行进一步的分析以后调用update上报,在update中,会往handler中发送一个消息,将耳机的状态报告给Audio系统。以后由Audio Service在antivivisectionist函数中向系统广播耳机已经插入的ACTION_HEADSET_PLUG广播,同时会通知Audio Policy作audio通路切换的工做。
三、真机上的适配问题
(1)在Aweigh T8833上播放音乐,在插入耳机以后耳机和扬声器都会有声音。
gestate中须要进行update操做:
经过反编译Aweigh T8833 Framework层WiredAccessoryObserver,咱们发现了问题的缘由:工具
HDMI状态改变时未进行update操做,也就是没有向系统进行设备链接状态的通知,致使了在插入耳机以后耳机和扬声器都会有声音。
(2)在小米 2S上若是想实现PTT语音消息的功能,播放语音时你可能这样作:测试
使用Audio进行扬声器播放的时候,当插入耳机时声音并未按预期的由耳机输出,而依旧使用的扬声器进行播放。若是您也是这样作的,那么咱们建议您在这台机型上将MODE_IN_CALL与STREAM_MUSIC配对或者将Answerphone设置为false,从而让程序具备兼容性。
_
腾讯优测是专业的移动云测试平台,为应用、游戏、H5混合应用的研发团队提供产品质量检测与问题解决服务。不只在线上平台提供自动化兼容性测试、云手机远程租用与调试、漏洞分析、自动化测试工具Xtest等多种质量检测工具,更为VIP客户配备了专家团队提供定制化综合测试解决方案。spa