Android11进行下拉快捷功能qs的增加

本文详细介绍了如何在Android系统中自定义SystemUI的快速设置(QS)项,包括修改`config.xml`来添加新的QS砖块,创建对应的Tile服务类`ToCameraTile`,更新`metrics_constants.proto`文件,以及在`QSFactoryImpl`中注册新砖块。通过这些步骤,可以将新的功能如拍照快捷方式整合进QS,提升用户体验。

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

在网上有很多的文章,但是他们或多或少都有自己的问题,有的是版本太老了现在已经用不了,所以决定自己写一个

一.QS是什么

SystemUI分为很多的部分,底部导航栏以及手机上方的顶部状态栏或者下拉状态栏快捷设置都是属于SystemUI,在SystemUI中,有一个qs文件夹,里面存放的是下拉快捷栏的相关文件,用来管理设置,qs是quick setting的缩写,对于一些进入比较繁琐的功能,我们可以把它设置在qs中简化用户的操作,优化用户体验

二.更改过程

1.config.xml

framework/base/packages/SystemUI/res/values/config//更改路径

在config文件中分别有以下两个字段,他们代表着不同的作用,只有在这里添加了才会最终可以显示出来

字段描述
quick_settings_tiles_default代表当前前台显示的快捷设置选项
quick_settings_tiles_stock代表当前库存后台可选的快捷设置选项

所以我们在两个字段中,都加入自己想要的内容,如果只更改上面字段而不更改下面这一个的话,移除后就不能重新添加了,所以我们在这里把两个都加上去,最后两个都是本人添加的

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- The default tiles to display in QuickSettings -->
    <string name="quick_settings_tiles_default" translatable="false">
        wifi,singlehand,bt,dnd,volte1,volte2,vowifi,lte1,lte2,flashlight,rotation,custom(com.google.android.gms/.nearby.sharing.SharingTileService),battery,cell,airplane,cast,screenrecord,dataswitch,tocamera,autobrightness
    </string>

    <!-- Tiles native to System UI. Order should match "quick_settings_tiles_default" -->
    <string name="quick_settings_tiles_stock" translatable="false">
        wifi,cell,battery,dnd,volte1,volte2,vowifi,lte1,lte2,flashlight,rotation,custom(com.google.android.gms/.nearby.sharing.SharingTileService),bt,airplane,location,hotspot,inversion,saver,dark,work,cast,night,screenrecord,reverse,singlehand,longscreenshot,superbattery,dataswitch,tocamera,autobrightness
    </string>
</resources>

注意,如果你的手机厂商有进行定制,那么要在vendor下的overlay文件夹中去寻找同路径同名的文件去进行更改,否则会出现更改完了但是失败的情况。

2.Tocamera(编写自己想要添加的类)

com.android.systemui.qs.tiles.ToCameraTile//添加路径

这一块没啥好说的,里面都是一些重写的类,根据名字去判断意思

package com.android.systemui.qs.tiles;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.os.UserManager;
import android.provider.Settings;
import android.provider.Settings.Global;
import android.service.quicksettings.Tile;
import android.sysprop.TelephonyProperties;
import android.telephony.TelephonyManager;
import android.widget.Switch;
import android.widget.Toast;
import android.provider.MediaStore;


import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.systemui.R;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.qs.QSTile.BooleanState;
import com.android.systemui.qs.GlobalSetting;
import com.android.systemui.qs.QSHost;
import com.android.systemui.qs.tileimpl.QSTileImpl;

import javax.inject.Inject;

/** Quick settings tile: Airplane mode **/
public class ToCameraTile extends QSTileImpl<BooleanState> {

    @Inject
    public ToCameraTile(QSHost host){
        super(host);
    }

    @Override
    public BooleanState newTileState() {
        return new BooleanState();
    }

    @Override
    protected void handleClick() {
        Toast.makeText(mContext,"Camera Click",Toast.LENGTH_LONG).show();
    }

    @Override
    protected void handleUpdateState(BooleanState state, Object arg) {
        state.label = mContext.getString(R.string.quick_settings_camera_label);
        //定义图标
        state.icon = ResourceIcon.get(R.drawable.ic_camera);
    }

    protected void handleLongClick(){
        Toast.makeText(mContext,"CameraLongClick",Toast.LENGTH_LONG).show();
    }

    @Override
    public int getMetricsCategory() {
        return MetricsEvent.QS_CAMERA;
    }
    @Override
    public Intent getLongClickIntent() {
        return new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    }
    @Override
    protected void handleSetListening(boolean listening) {
    }
    @Override
    public CharSequence getTileLabel() {
        return mContext.getString(R.string.quick_settings_camera_label);
    }



}

这里面导的包有一些并没有用到,是从别的类复制过来的,所以没有进行更改,大家根据自己实际需要去进行导包

注意事项

1.必须要重写父类的抽象方法
2.构造方法上面要加上注释@Inject
3.点击方法与长按的实现是父类中带handle的那一个
4.记得导包
5.getMetricsCategory()这个方法中的返回值定义在metrics_constants.proto文件中

这里只是去添加一个qs,没有功能的实现!!!
如果要写一些功能,可以自行添加

3.metrics_constants.proto

//自己添加
QS_CAMERA = 5869;

4.QSFactoryImpl

这里只有两个地方要添加,模仿其他的就可以了,更容易漏掉的事情是导包

//添加
    @Inject
    Provider<ToCameraTile> mToCameraTileProvider;
    ...
    ...
     private QSTileImpl createTileInternal(String tileSpec) {
        // Stock tiles.
        switch (tileSpec) {
        ...
    case "tocamera":
                return mToCameraTileProvider.get();
        ...

结尾

到这里整个步骤就完成了,接下来进行刷机验证

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值