Android Framework 音频子系统(10)耳麦插拔之应用案例

news/2024/11/29 2:50:23/

该系列文章总纲链接:专题分纲目录 Android Framework 音频子系统​​​​​​​


本章关键点总结 & 说明:

本章节主要关注➕ 以上思维导图左上 耳麦插拔 部分中的应用案例部分 即可。这里主要以一个案例进行说明,在有些Android版本中并不会在状态栏上显示耳麦图标,需要我们自己添加。我们这个应用端的需求就是插拔耳机,会在状态栏中设置相应的图标状态。


接下来看具体怎么做?在PhoneStatusBarPolicy中注册这个Intent,代码如下:

public PhoneStatusBarPolicy(Context context, CastController cast, HotspotController hotspot) {mContext = context;mCast = cast;mHotspot = hotspot;mService = (StatusBarManager)context.getSystemService(Context.STATUS_BAR_SERVICE);// listen for broadcastsIntentFilter filter = new IntentFilter();filter.addAction(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED);filter.addAction(Intent.ACTION_SYNC_STATE_CHANGED);filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);filter.addAction(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION);filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);filter.addAction(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED);filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED);filter.addAction(TelecomManager.ACTION_CURRENT_TTY_MODE_CHANGED);filter.addAction(Intent.ACTION_USER_SWITCHED);//新添加filter.addAction(Intent.ACTION_HEADSET_PLUG);//...
}

当收到消息后onReceive会被调用(updateHeadset是处理函数),代码如下:

    private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (action.equals(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED)) {updateAlarm();}else if (action.equals(Intent.ACTION_SYNC_STATE_CHANGED)) {updateSyncState(intent);}else if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED) ||action.equals(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED)) {updateBluetooth();}else if (action.equals(AudioManager.RINGER_MODE_CHANGED_ACTION) ||action.equals(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION)) {updateVolumeZen();}else if (action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) {updateSimState(intent);}else if (action.equals(TelecomManager.ACTION_CURRENT_TTY_MODE_CHANGED)) {updateTTY(intent);}else if (action.equals(Intent.ACTION_USER_SWITCHED)) {updateAlarm();}//新添加,收到消息后onReceive会被调用,updateHeadset是对应的处理函数else if (action.equals(Intent.ACTION_USER_SWITCHED)) {updateAlarm();}}};

updateHeadset这个处理函数是我们新添加的,主要功能是在状态栏中设置head set图标的状态,代码如下:

private final void updateHeadset(Intent intent) {final String action = intent.getAction();final int state = intent.getIntExtra("state", 4);final int mic = intent.getIntExtra("microphone", 4);switch (state) {case 0: //拔出mService.setIconVisibility("headset", false);break;case 1: //插入if (mic == 1) { //耳机上有mic显示这张图标mService.setIcon("headset", R.drawable.stat_sys_headset_with_mic, 0, null);} else {//耳机上没有mic显示这张图标mService.setIcon("headset", R.drawable.stat_sys_headset_without_mic, 0, null);}mService.setIconVisibility("headset", true);break;}
}

这里注意一些资源文件的配置和添加, 修改 frameworks/base/core/res/res/values/config.xml 添加一行:

<item><xliff:g id="id">headset</xliff:g></item> 

根据自己设备的实际分辨率 创建对应的图标文件:

  • frameworks/base/packages/SystemUI/res/"分辨率"/stat_sys_headset_with_mic.png
  • frameworks/base/packages/SystemUI/res/"分辨率"/stat_sys_headset_without_mic.png

这样以来,一个简单的功能(耳麦插拔->状态栏图标变化)就实现了。


http://www.ppmy.cn/news/380327.html

相关文章

RK3288 android切换耳麦通道

通过耳机状态切换耳机mic与板子麦/work/rk3288/firefly-rk3288_android5.1_git_20180126/kernel/sound/soc/codecs/es8323.c static int es8323_hp_jack_change(struct notifier_block *nb,unsigned long flags, void *data) {if(es8323_adc)hp_jack_adc(flags);else{if(es8323…

Android Framework 音频子系统(11)耳麦插拔之声音通道切换

该系列文章总纲链接&#xff1a;专题分纲目录 Android Framework 音频子系统​​​​​​​ 本章关键点总结 & 说明&#xff1a; 本章节主要关注➕ 以上思维导图左上 耳麦插拔 部分中的 声音通道切换 部分 即可。主要说明了声道切换的原理和声道切换的流程分析。 1 耳麦插拔…

Android Framework 音频子系统(09)耳麦插拔之流程分析

该系列文章总纲链接&#xff1a;专题分纲目录 Android Framework 音频子系统​​​​​​​ 本章关键点总结 & 说明&#xff1a; 本章节主要关注➕ 以上思维导图左上 耳麦插拔 部分 即可。本章节主要分析耳麦插拔流程&#xff0c;耳机发生插拔后&#xff0c;android是如何在…

openwrt+Linkit7688+wm8960:粗略实现wm8960耳麦和喇叭音频输出

引言&#xff1a; 本文只是介绍怎么使用linkit7688开发板上的wm8960的输出喇叭声音和耳机声音&#xff0c;主要是怎么输出喇叭声音&#xff0c;默认的音频驱动是只有耳麦的音频输出而没有喇叭音频输出的。别人指导我&#xff0c;有点成果也给大家参考一下。 感谢huangkj-hena…

耳麦浅度DIY

作为一个伪音乐爱好者&#xff0c;自己DIY一个耳麦肯定是必须的。 抽时间做一次非深度DIY。 在马云爸爸的淘宝上选了些东西&#xff0c; 喇叭单元&#xff0c;做工还可以&#xff0c;买不起高端货&#xff0c;150左右RMB凑合用吧&#xff1a; 对于一个小白来说&#xff0c;焊…

【转载】Android音频(7)——项目实战——耳麦插拔

Android音频(7)——项目实战——耳麦插拔 7.4.3 声音路由切换实例分析 深入理解Android&#xff1a;卷1 看云 一、驱动程序上报耳麦拔插事件 1. 在有些Android版本中并不会在状态栏上显示耳麦图标。切换声道也不在系统中实现&#xff0c;而是在驱动中实现的。 2. headset …

8.5.1耳麦拔插_驱动程序上报耳麦拔插事件

目录 分析+概念 驱动框架​ 输入系统流程 编写驱动程序如下 switch dev驱动的流程

USB耳麦_从无到有(一)

我想做一个基于STM32F1芯片的USB耳麦。不确定能不能搞出来&#xff0c;简单记录一下这个过程。 首先&#xff0c;这个项目需要先学USB&#xff0c;再学音频。 那就先学USB。 USB 我对USB有一点了解&#xff0c;但忘得差不多了。我复习一下基本的USB协议&#xff0c;再开始学音…