Android16 蓝牙打开时,状态栏显示蓝牙图标
2026-06-27 / 龙之叶   

说明

本修改主要针对 Android 16(API 36)AOSP 源码中的 SystemUI 模块。

项目 内容
适用版本 Android 16(API 36)
涉及模块 frameworks/base/packages/SystemUI
修改类 PhoneStatusBarPolicy
修改方法 updateBluetooth()

在 Android 16 原生 SystemUI 中,PhoneStatusBarPolicy.updateBluetooth() 默认仅在蓝牙已连接且满足音频 Profile 条件时才显示状态栏图标。用户仅打开蓝牙开关、尚未连接设备时,状态栏不会出现蓝牙图标,与快捷设置中蓝牙已开启的状态不一致。

本次修改在 Android 16 上实现:

  • 蓝牙开启即显示 stat_sys_data_bluetooth 图标(新增资源)
  • 蓝牙已连接时切换为 stat_sys_data_bluetooth_connected 图标
  • 蓝牙关闭时隐藏图标

若移植到其他 Android 版本,需确认对应分支中 PhoneStatusBarPolicy.java 路径及 updateBluetooth() 实现是否一致,资源命名是否相同。


修改文件

1
2
frameworks/base/packages/SystemUI/res/drawable/stat_sys_data_bluetooth.xml          (新增)
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java (修改)

1. 新增 stat_sys_data_bluetooth.xml

路径: frameworks/base/packages/SystemUI/res/drawable/stat_sys_data_bluetooth.xml

蓝牙图标

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<!--
Copyright (C) 2017 The Android Open Source Project

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="17dp"
android:height="17dp"
android:viewportWidth="17.0"
android:viewportHeight="17.0">
<group
android:translateY="0.5"
android:translateX="0.5" >
<path
android:pathData="M8.84,8l2.62,-2.62c0.29,-0.29 0.29,-0.75 0,-1.04L8.33,1.22L8.31,1.2c-0.3,-0.28 -0.76,-0.26 -1.03,0.04c-0.13,0.13 -0.2,0.31 -0.2,0.5v4.51L4.24,3.4c-0.29,-0.29 -0.74,-0.29 -1.03,0s-0.29,0.74 0,1.03L6.78,8l-3.56,3.56c-0.29,0.29 -0.29,0.74 0,1.03s0.74,0.29 1.03,0l2.83,-2.83v4.51c0,0.4 0.33,0.73 0.73,0.73c0.18,0 0.36,-0.07 0.5,-0.2l0.03,-0.03l3.12,-3.12c0.29,-0.29 0.29,-0.75 0,-1.04L8.84,8zM8.47,6.37V3.36l1.5,1.5L8.47,6.37zM8.47,12.63V9.62l1.5,1.5L8.47,12.63z"
android:fillColor="#FFFFFF"/>
</group>
</vector>

2. 修改 PhoneStatusBarPolicy.java

路径: frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java

方法: updateBluetooth()

修改前

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private final void updateBluetooth() {
int iconId = R.drawable.stat_sys_data_bluetooth_connected;
String contentDescription =
mResources.getString(R.string.accessibility_quick_settings_bluetooth_on);
boolean bluetoothVisible = false;
if (mBluetooth != null) {
// Bug 2687381, The Bluetooth icon is not displayed normally.
Log.d(TAG, "updateBluetooth(), mIsActive:" + mBluetooth.isBluetoothAudioActive());
if (mBluetooth.isBluetoothConnected()
&& (mBluetooth.isBluetoothAudioActive()
|| !mBluetooth.isBluetoothAudioProfileOnly())) {
contentDescription = mResources.getString(
R.string.accessibility_bluetooth_connected);
bluetoothVisible = mBluetooth.isBluetoothEnabled();
}
}
// ...
}

修改后

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
private final void updateBluetooth() {
// Create by yeruilai 2026-6-6 19:54:14 Display Bluetooth icon when open
// int iconId = R.drawable.stat_sys_data_bluetooth_connected;
int iconId = R.drawable.stat_sys_data_bluetooth;
String contentDescription =
mResources.getString(R.string.accessibility_quick_settings_bluetooth_on);
boolean bluetoothVisible = false;
if (mBluetooth != null) {
// Bug 2687381, The Bluetooth icon is not displayed normally.
Log.d(TAG, "updateBluetooth(), mIsActive:" + mBluetooth.isBluetoothAudioActive());
// Create by yeruilai 2026-6-6 19:54:14 Display Bluetooth icon when open
bluetoothVisible = mBluetooth.isBluetoothEnabled();
if (mBluetooth.isBluetoothConnected()
&& (mBluetooth.isBluetoothAudioActive()
|| !mBluetooth.isBluetoothAudioProfileOnly())) {
contentDescription = mResources.getString(
R.string.accessibility_bluetooth_connected);
bluetoothVisible = mBluetooth.isBluetoothEnabled();
// Create by yeruilai 2026-6-6 19:54:14 Display Bluetooth icon when open
iconId = R.drawable.stat_sys_data_bluetooth_connected;
}
}
// ...
}

修改点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 private final void updateBluetooth() {
- int iconId = R.drawable.stat_sys_data_bluetooth_connected;
+ // Create by yeruilai 2026-6-6 19:54:14 Display Bluetooth icon when open
+ // int iconId = R.drawable.stat_sys_data_bluetooth_connected;
+ int iconId = R.drawable.stat_sys_data_bluetooth;
String contentDescription =
mResources.getString(R.string.accessibility_quick_settings_bluetooth_on);
boolean bluetoothVisible = false;
if (mBluetooth != null) {
// Bug 2687381, The Bluetooth icon is not displayed normally.
Log.d(TAG, "updateBluetooth(), mIsActive:" + mBluetooth.isBluetoothAudioActive());
+ // Create by yeruilai 2026-6-6 19:54:14 Display Bluetooth icon when open
+ bluetoothVisible = mBluetooth.isBluetoothEnabled();
if (mBluetooth.isBluetoothConnected()
&& (mBluetooth.isBluetoothAudioActive()
|| !mBluetooth.isBluetoothAudioProfileOnly())) {
contentDescription = mResources.getString(
R.string.accessibility_bluetooth_connected);
bluetoothVisible = mBluetooth.isBluetoothEnabled();
+ // Create by yeruilai 2026-6-6 19:54:14 Display Bluetooth icon when open
+ iconId = R.drawable.stat_sys_data_bluetooth_connected;
}
}

附图

状态栏效果对比

蓝牙图标显示逻辑

本文链接:
http://longzhiye.top/2026/06/27/2026-06-27/