zoukankan      html  css  js  c++  java
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?

    腾讯优测是专业的移动自动化测试平台,提供多维度的自动化测试服务,让测试更简单!
    近期有报道称,澳大利亚悉尼市新某大学的一名男生在课堂上看电影,不料耳机没有插好,变成了现场直播。。。

    如果你认为耳机没插好事件尚且可以hold住,那么接下来的问题会不会让你更加尴尬?当你在手机插上耳机准备看电影时,声音却从扬声器里响了出来。。。
    没想到藏得这么深,还是让耳机出卖了。。。

    容我静静,为避免此类尴尬事件再次发生,我特意对耳机在手机上的插拔原理研究了一番。感兴趣的朋友我们可以一起讨论。。。
    1、Android耳机插拔检测原理
    Android系统在耳机插入和拔出的时候会发送广播,通过Broadcast Receiver 监听”android.intent.action.HEADSET_PLUG” 这个Intent来判断耳机是否插拔。

    2、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系统服务初始化的时候实例化的,在这个类的构造方法中,注册了一个广播接收器用来接收系统启动完毕的广播。


    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通路切换的工作。
    3、真机上的适配问题
    (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客户配备了专家团队提供定制化综合测试解决方案。

  • 相关阅读:
    js简单验证码的生成和验证
    基本够用的php.ini配置文件(CentOS7)
    转发:CentOS下tar压缩排除某个文件夹或文件及解压
    阿里云服务器CentOS7 vsftp安装、设置及后台端口的设置
    转发:entos7修改文件夹权限和用户名用户组
    转发:查看centos中的用户和用户组
    阿里云服务器CentOS7怎么分区格式化/挂载硬盘
    php调试用的几个小方法
    Jquery实现日期转换为 Unix时间戳及时间戳转换日期
    Jquery计算时间戳之间的差值,可返回年,月,日,小时等
  • 原文地址:https://www.cnblogs.com/utest/p/5866465.html
Copyright © 2011-2022 走看看