耳机插拔流程

插入拔出framework部分相关源码流程分析涉及到的类文件

./framework/base/services/core/java/com/android/server/input/InputManagerService.java

./framework/base/services/core/java/com/android/server/WiredAccessoryManager.java

./framework/base/core/res/res/values/config.xml

./framework/base/services/java/com/android/server/SystemServer.java

./base/media/java/android/media/AudioManager.java

./base/media/java/android/media/AudioService.java

UEvent和InputEvent的选择

这两个的切换主要是通过设置属性来的。该属性开关位于config.xml中:

从注释里面我们可以看到设置为true,选择/dev/input/event ,设置为false 选择uevent 来控制事件的上报。

在InputManagerService.java 构造方法中,config_useDevInputEventForAudioJack的值初始化mUseDevInputEventForAudioJack 决定采用哪种方式。

notifySwitch

WiredAccessoryCallbacks

看看这个回调注册的地方,在systemServer的startOtherServices中

从上面的代码可以看到WiredAccessoryManager对象直接被注册为callBack

因此mWiredAccessoryCallbacks.notifyWiredAccessoryChanged直接将后面的任务交给了WiredAccessoryManager类

WiredAccessoryManager.java -> notifyWiredAccessoryChanged

接着转到updateLocked方法,该方法作用是check当前模式是否变化。也就是是否发生耳机拔出了或者插入了(0->1;1->0的变化)。state无变化则不会继续处理。

updateLocked

mHandler

setDeviceStateLocked

接下来的流程就交给了AudioManager,不过真正的实现是在AudioService中

AudioDeviceBroker.java ->  setWiredDeviceConnectionState

AudioDeviceInventory.java -> setWiredDeviceConnectionState

postSetWiredDeviceConnectionState

handleMessage

onSetWiredDeviceConnectionState

handleDeviceConnection

sendDeviceConnectionIntent

从这个方法,可以看到intent耳机插拔的广播我们可以在app层通过监听ACTION_HEADSET_PLUG。 intent携带了,当前最新状态state ,name以及microphone(耳机是否带麦)。

在PhoneStatusBarPolicy.java注册ACTION_HEADSET_PLUG广播

接收到ACTION_HEADSET_PLUG广播之后决定是否显示耳机图标

通知底层,在上面的handleDeviceConnection 中会调用AudioSystem.setDeviceConnectionState

这个会往下调用到AudioPolicyManager的setDeviceConnectionState中去

以上就是插拔耳机的整个流程

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中,可以通过监听耳机插拔广播来检测耳机的插入和拔出事件。广播接收器可以通过实现BroadcastReceiver类来处理这些广播事件。通过注册一个广播接收器,并设置接收的广播事件为Intent.ACTION_HEADSET_PLUG,可以监听耳机插拔状态。在onReceive方法中,可以通过intent.getIntExtra("state", 0)来获取耳机的状态,其中1代表耳机插入,2代表耳机拔出。通过在onReceive方法中处理具体的逻辑,可以根据耳机插拔状态进行相应的操作,比如显示Toast提示信息。当需要监听耳机插拔事件时,可以在代码中创建一个BroadcastReceiver对象,并将其注册到系统中,如通过调用registerReceiver方法注册广播接收器。这样,当耳机插入或拔出时,广播接收器就会接收到相关的广播事件,从而可以进行相应的处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [android 不打开APP的情况下监听耳机插拔情况](https://blog.csdn.net/weixin_28872035/article/details/117540394)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Android 平时用到比较多的广播之飞行模式和耳机插拔](https://blog.csdn.net/qq_27062249/article/details/54962483)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值