Android12系统以后,打开蓝牙的时候,状态栏上面是没有蓝牙图标显示的,只有当蓝牙连接到了设备,状态栏才会显示蓝牙已连接的图标。
如果要让状态在蓝牙打开后也有图标,我们需要修改一下frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java中的private final void updateBluetooth()函数,具体修改如下:
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) {
//=========add for dispplay bluetooth on icon start=========
if(mBluetooth.isBluetoothEnabled()) {
contentDescription = mResources.getString(R.string.accessibility_quick_settings_bluetooth_on);
bluetoothVisible = mBluetooth.isBluetoothEnabled();
iconId = R.drawable.qs_bluetooth_icon_on;
}
//=========add for dispplay bluetooth on icon end=========
if (mBluetooth.isBluetoothConnected()
&& (mBluetooth.isBluetoothAudioActive()
|| !mBluetooth.isBluetoothAudioProfileOnly())) {
//=========add for dispplay bluetooth on icon start=========
iconId = R.drawable.stat_sys_data_bluetooth_connected;
//=========add for dispplay bluetooth on icon end=========
contentDescription = mResources.getString(
R.string.accessibility_bluetooth_connected);
bluetoothVisible = mBluetooth.isBluetoothEnabled();
}
}
mIconController.setIcon(mSlotBluetooth, iconId, contentDescription);
mIconController.setIconVisibility(mSlotBluetooth, bluetoothVisible);
}
上面代码中当mBluetooth.isBluetoothEnabled()为true的时候,获取蓝牙图标的资源赋值给iconId进行显示。当蓝牙为连接状态的时候需要再将iconId赋值为已连接的图标资源。
Android12的SystemUI代码中没有蓝牙打开图标的文件资源,需要添加一个frameworks/base/packages/SystemUI/res-keyguard/drawable/qs_bluetooth_icon_on.xml。文件内容如下:
<?xml version="1.0" encoding="utf-8"?><!--
~ Copyright (C) 2020 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.
-->
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt">
<target