Android13 Tv大屏设备出现了连接蓝牙后,蓝牙音箱声音特别大,并且调节蓝牙声音后,断开连接,再重新连接蓝牙声音还是很大。
从网上看到是可以打开设置里面的 “停用绝对音量功能” 进行规避这个问题。
看下网上对”停用绝对音量功能“的说明:
有时连接了蓝牙耳机,会出现声音突然变大的情况,这就是开启了绝对音量功能的原因。
如果“停用绝对音量功能”开启,那么蓝牙耳机的音量和手机的音量就是相互独立的。
如果“停用绝对音量功能”关闭,那么蓝牙耳机的音量和手机的音量就是相互同步的。(默认)
下面是原生Settings 中的字符串显示和图片:
上面的画面具体位置在开发者选项中,不过也有的手机是没有这个选项的。比如华为手机!
具体字符串:
停用绝对音量功能
停用蓝牙绝对音量功能,以防在连接到远程设备时出现音量问题(例如音量高得让人无法接受或者无法控制音量等)。
网上看了下,没几个对实现控制代码进行分析的,刚好看了一圈代码,顺便分享一下。
开发者选项中是有这个选项的,但是在Settings 里面未找到 开关的字符串,不过通过SettingsLib 工程可以看到对应的字符串。
文件位置和对应资源:
framework\base\packages\SettingsLib\res\values-zh-rCN\strings.xml
"停用绝对音量功能"
文件位置和对应布局文件:
packages\apps\Settings\res\xml\development_settings.xml
Java文件位置:
packages\apps\Settings\src\com\android\settings\development\BluetoothAbsoluteVolumePreferenceController.java
private static final String BLUETOOTH_DISABLE_ABSOLUTE_VOLUME_KEY = "bluetooth_disable_absolute_volume";
所以 控制“停用绝对音量功能”的代码基本可以确定是在 BluetoothAbsoluteVolumePreferenceController.java 这个类里面了。
继续查看Java文件,发现代码:
//prop字符串
static final String BLUETOOTH_DISABLE_ABSOLUTE_VOLUME_PROPERTY = "persist.bluetooth.disableabsvol";
//开关回调的地方
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
final boolean isEnabled = (Boolean) newValue;
SystemProperties.set(BLUETOOTH_DISABLE_ABSOLUTE_VOLUME_PROPERTY,
isEnabled ? "true" : "false");
return true;
}
所以啊所以,只需要设置 persist.bluetooth.disableabsvol 属性 true/false 就可以控制 “停用蓝牙绝对音量功能” !
setprop persist.bluetooth.disableabsvol true / false //设置
getprop persist.bluetooth.disableabsvol //获取
framework 源码中找不到关键字相关内容,在package 下找到了 !
再看看系统源码哪里做了具体事情,这里不做具体分析,需要的可以自行查阅:
android13/release/packages$ grep -nr persist.bluetooth.disableabsvol
modules/Bluetooth/system/profile/avrcp/connection_handler.cc:49: osi_property_get("persist.bluetooth.disableabsvol", volume_disabled, "false");
modules/Bluetooth/system/btif/src/btif_rc.cc:5514: osi_property_get("persist.bluetooth.disableabsvol", volume_disabled, "false");
apps/Settings/src/com/android/settings/development/BluetoothAbsoluteVolumePreferenceController.java:37: "persist.bluetooth.disableabsvol";
估计就是cc文件里面做了判断和处理,并且未设置的情况默认为false ,即未开启”停用蓝牙绝对音量功能“。
”停用蓝牙绝对音量功能“ 估计大部分开发者无法用到,但是多知道一些内容是不会吃灰的。
”停用蓝牙绝对音量功能“ 具体实现就是控制prop属性 persist.bluetooth.disableabsvol 就可进行开启和关闭。未设置的情况,默认是关闭。
就使用情况来看,似乎是记忆了蓝牙设备的音量大小,具体怎么实现的,不做分析研究。
网上也有对绝对音量和相对音量代码控制的分析(写得比较一般!):
https://blog.csdn.net/cheriyou_/article/details/122681239