Android下拉状态栏快捷开关的添加

本文介绍如何在Android系统中添加自定义的静音快捷开关。通过修改SystemUI源码,可在快速设置面板中加入静音开关,实现对铃声音量的快速控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本博客转自 "莹波&微步" 的博客:http://blog.youkuaiyun.com/love000520/article/details/52190595



添加自己的快捷开关


此处以添加静音快捷开关为例,首先,打开这个文件frameworks/base/packages/SystemUI/res/values/config.xml,搜索“quick_settings_tiles_default”找到该处内容,如我的代码是

<!-- The default tiles to display in QuickSettings -->

<string name="quick_settings_tiles_default" translatable="false">

wifi,bt,inversion,cell,airplane,rotation,flashlight,location,cast,hotspot

</string>

这是自适应的布局,这些快捷按键的定义都在这里,如要添加或替换,在这里修改即可。这里我添加了静音开关mute,代码如下:

<!-- The default tiles to display in QuickSettings -->

<string name="quick_settings_tiles_default" translatable="false">

wifi,bt,inversion,cell,airplane,rotation,flashlight,location,cast,hotspot,mute

</string>


其次,打开frameworks/base/packages/SystemUI/src/com/Android/systemui/statusbar/phone/QSTileHost.Java文件,找到private QSTile<?> createTile(String tileSpec) 函数,并添加mute相关代码,如下所示:

private QSTile<?> createTile(String tileSpec) {

if (tileSpec.equals("wifi")) return new WifiTile(this);

else if (tileSpec.equals("bt")) return new BluetoothTile(this);

else if (tileSpec.equals("mute")) return new MuteTile(this);

......

}

这里主要是获取到预定义好的各个快捷图标的QSTile。

下面是新建MuteTile这个文件,在frameworks/base/packages/SystemUI/src/com/Android/systemui/qs/tiles
这个路径下面就是你定义的开关实现功能的地方,这里新添加的mute在原有的快捷开关里面是没有的,所以要在这里新添加一个文件MuteTile.java,该文件代码如下:


package com.android.systemui.qs.tiles;

import android.media.AudioManager;
import android.provider.Settings;
import android.provider.Settings.Global;

import com.android.systemui.R;
import com.android.systemui.qs.GlobalSetting;
import com.android.systemui.qs.QSTile;

public class MuteTile extends QSTile<QSTile.BooleanState> {

private boolean mListening;
private AudioManager mAudioManager;
private final GlobalSetting mSetting;

public MuteTile(Host host) {
super(host);
// TODO Auto-generated constructor stub
mAudioManager = (AudioManager)mContext.getSystemService(mContext.AUDIO_SERVICE);
mSetting = new GlobalSetting(mContext, mHandler, Settings.System.MODE_RINGER_STREAMS_AFFECTED) {
            @Override
            protected void handleValueChanged(int value) {
                handleRefreshState(value);
            }
        };
}


public void setListening(boolean listening) {
// TODO Auto-generated method stub
if (mListening == listening) return;
        mListening = listening;
        mSetting.setListening(listening);
}

@Override
protected BooleanState newTileState() {
// TODO Auto-generated method stub
return new BooleanState();
}

@Override
protected void handleClick() {
// TODO Auto-generated method stub
setMute();  
}

@Override
protected void handleUpdateState(
BooleanState state, Object arg) {
// TODO Auto-generated method stub
//int mode = mSetting.getValue();
state.visible = true;
state.value = true;
state.label = mContext.getString(R.string.quick_settings_mute_label);
if (mAudioManager.getStreamVolume(AudioManager.STREAM_RING) != 0) {
state.icon = ResourceIcon.get(R.drawable.ic_qs_mute_off);
state.contentDescription =  mContext.getString(R.string.accessibility_quick_settings_mute_off);
} else {
state.icon = ResourceIcon.get(R.drawable.ic_qs_mute_on);
state.contentDescription =  mContext.getString(R.string.accessibility_quick_settings_mute_on);
}
        
}

private void setMute() {
if (mAudioManager.getStreamVolume(AudioManager.STREAM_RING) != 0) {
mAudioManager.setStreamMute(AudioManager.STREAM_RING, true);
} else {
mAudioManager.setStreamMute(AudioManager.STREAM_RING, false);
}
mSetting.setValue(mAudioManager.getStreamVolume(AudioManager.STREAM_RING));
}
}


其中mSetting的定义很关键,GlobalSetting里的参数要结合自己的具体实际来写,不然点击图标是不会刷新界面的,另外,setMute()函数须放在handleClick中,不能放在handleUpdateState中,因为handleUpdateState是负责刷新界面的,会一直都在程序的刷新监听中,放在里面有可能会导致图标不断变化。


最后,mSetting.setValue(mAudioManager.getStreamVolume(AudioManager.STREAM_RING));这一句是刷新页面的关键,因为我们程序里面通过GlobalSetting定义了相关的监听ContentObserver ,每次点击图标后都是通过设置这个value的方式通知ContentObserver 刷新界面的。

### 修改Android下拉通知栏快捷开关图标大小和文本显示 #### 自定义快捷开关样式 对于修改Android下拉通知栏中的快捷开关图标大小以及关联的文字,通常涉及对`SystemUI`组件的定制化开发。由于这些更改涉及到系统的底层文件,在非root设备上直接修改存在较大难度。 为了实现这一目标,开发者可以选择创建自定义ROM或者通过Xposed框架等高级方法间接达成目的。然而,官方API并不支持此类个性化设置,因此建议遵循标准的设计指南[^3]。 如果确实需要进行这类改动,可以通过编译AOSP源码并调整其中的相关资源文件来完成: 1. **获取AOSP源代码** 需要下载对应版本的AOSP源码库,并找到负责渲染状态栏及其内部元素(包括快捷开关)的部分。 2. **编辑布局与图形资源** 找到位于`frameworks/base/packages/SystemUI/res/`目录下的XML布局文件及Drawable图像资源,这里包含了定义各个控件外观的信息。例如,想要改变Wi-Fi或飞行模式按钮的尺寸,则需定位至相应的drawable文件夹内寻找对应的PNG/SVG图片,并对其进行重新绘制以适应新的规格;而对于伴随文字说明部分,则应查阅strings.xml或其他地方存储的具体字符串值。 3. **调整字体属性** 若要影响整个系统范围内使用的字体风格,可以在`build.prop`配置文件里指定不同的Typeface路径,或是利用Theme.AppCompat.Light.DarkActionBar主题家族提供的textAppearance选项来自定义TextView的表现形式。 4. **构建并刷入新镜像** 完成上述所有变更之后,按照常规流程编译完整的固件包,最后将其安装到测试机上去验证效果。 值得注意的是,以上过程不仅技术门槛较高而且风险不小——任何不当操作都可能导致设备变砖甚至违反制造商保修条款。所以除非具备充分的技术背景并且愿意承担潜在后果,否则不推荐普通用户尝试自行实施这种深层次改造。 ```xml <!-- Example of modifying a drawable resource --> <resources> <!-- Modify the size attribute to change icon dimensions --> <item name="ic_wifi_signal_4" type="drawable">@mipmap/ic_custom_wifi</item> </resources> <!-- Adjusting text appearance within strings or styles XML files --> <style name="CustomTextAppearance"> <item name="android:textSize">18sp</item> <!-- Increase font size here --> <item name="android:textColor">#FF0000</item> <!-- Change color as needed --> </style> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值