在网上有很多的文章,但是他们或多或少都有自己的问题,有的是版本太老了现在已经用不了,所以决定自己写一个
一.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();
...
结尾
到这里整个步骤就完成了,接下来进行刷机验证