【安卓13-Framework】SystemUI定制之屏蔽下拉状态栏部分快捷按钮

1、需求

屏蔽下拉状态栏谷歌录屏、省电模式、二维码扫描器等快捷按钮。

2、修改路径

普及:安卓的SystemUI包提供了状态栏、导航栏、通知中心等重要的用户界面元素。
状态栏小部件UI显示修改路径:frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java

3、修改思路

下拉状态栏属于系统UI的一部分,位于SystemUI包下,不同安卓版本这个包的代码有些许出入,但是万变不离其宗,掌握修改原理即可,下面来一步步分析如何修改以及为什么要这样修改:

(1)修改方法

打开这个文件:frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java,定位到这个方法:
在这里插入图片描述
这个方法做了两件事,第一件事是加载“存货”(Stock tiles),什么是存货呢,就是安卓原生自带的小部件,比如WiFi、蓝牙、定位等快捷按钮,第二件事是加载工程师自定义的小部件(Custom tiles),在这里我们先不研究自定义的小部件,以后有时间再研究。
既然是加载“存货”,那这些存货从哪里来呢,先不看这个,我先把修改代码放出来,若不想研究原理可不看后面,修改代码如下:

    @Nullableprotected QSTileImpl createTileInternal(String tileSpec) {// Stock tiles.if (mTileMap.containsKey(tileSpec)// We should not return a Garbage Monitory Tile if the build is not Debuggable&& (!tileSpec.equals(GarbageMonitor.MemoryTile.TILE_SPEC) || Build.IS_DEBUGGABLE)) {//屏蔽下拉状态栏中的几个tile,返回空对象Set<String> multipleStrings = new HashSet<>();multipleStrings.add("screenrecord"); //谷歌录屏multipleStrings.add("battery");  // 省电模式multipleStrings.add("qr_code_scanner"); // 二维码扫描器if (multipleStrings.contains(tileSpec)) {return null;}return mTileMap.get(tileSpec).get();}// Custom tilesif (tileSpec.startsWith(CustomTile.PREFIX)) {return CustomTile.create(mCustomTileBuilderProvider.get(), tileSpec, mQsHostLazy.get().getUserContext());}// Broken tiles.Log.w(TAG, "No stock tile spec: " + tileSpec);return null;}

好了,结束!

nonono,开个玩笑,接下来讲解原理,因为有些版本不是这样改的,待会就知道了。

(2)修改原理

首先我们知道,谷歌的代码写的都是很优雅的,想完全看懂不容易,这里我们只啃一部分,那就是下拉状态栏那些快捷按钮(QS tile)是如何添加的。
首先我们观察SystemUI目录,里面有很多子目录,大部分都是每一个模块细化出来,比如WiFi相关UI放在一个目录,声音UI放一个目录,目录里面基本都是写小模块的具体实现。

而qs目录就是专门负责实现通知栏或状态栏这个面板的各种功能和交互效果,比如图标的显示、动画效果、点击事件的处理等。
这里我们主要看qs目录,该目录结构如图:
在这里插入图片描述
其中,QSContainerImpl.java 这个类作为下拉状态栏快速面板的布局承载各种View,QSTileHost.java类是个接口实现类,里面实现了对tile的增删改查操作:
在这里插入图片描述
例如,我们想移除谷歌相机,同样可以在布局初始化处调用removeTile方法:

    @Overridepublic void removeTile(String spec) {if (spec.startsWith(CustomTile.PREFIX)) {// If the tile is removed (due to it not actually existing), mark it as removed. That// way it will be marked as newly added if it appears in the future.setTileAdded(CustomTile.getComponentFromSpec(spec), mCurrentUser, false);}mMainExecutor.execute(() -> changeTileSpecs(tileSpecs-> tileSpecs.remove(spec)));}

传入一个字符串“screenrecord”,关于怎么知道各个组件的键值,后面会讲。
注意,调用这个方法只能移除原生自带的一些组件键值,addTile(String spec) 这个方法也是只能创建自带的组件。
接下来回到上面修改的实现类QSFactoryImpl.java里面看它是如何移除谷歌相机的,首先,这个mTileMap是一个map 集合,里面加载了所有的谷歌原生tile键值
在这里插入图片描述
我们看下这个map 是从哪里传递过来的,在这里插入图片描述
看到是通过构造方法传递,继续找哪里调用这个构造方法
在这里插入图片描述
在这个类里面,我们看到tileMap在这里传递了进来,看一下tileMap的结构

        val tileMap = mutableMapOf<String, Provider<QSTileImpl<*>>>("internet" to Provider { internetTile },"bt" to Provider { bluetoothTile },"dnd" to Provider { dndTile },"inversion" to Provider { colorInversionTile },"airplane" to Provider { airplaneTile },"work" to Provider { workTile },"rotation" to Provider { rotationTile },"flashlight" to Provider { flashlightTile },"location" to Provider { locationTile },"cast" to Provider { castTile },"hotspot" to Provider { hotspotTile },"battery" to Provider { batterySaverTile },"saver" to Provider { dataSaverTile },"night" to Provider { nightDisplayTile },"nfc" to Provider { nfcTile },"dark" to Provider { darkModeTile },"screenrecord" to Provider { screenRecordTile },"reduce_brightness" to Provider { reduceBrightColorsTile },"cameratoggle" to Provider { cameraToggleTile },"mictoggle" to Provider { microphoneToggleTile },"controls" to Provider { deviceControlsTile },"alarm" to Provider { alarmTile },"wallet" to Provider { quickAccessWalletTile },"qr_code_scanner" to Provider { qrCodeScannerTile },"onehanded" to Provider { oneHandedModeTile },"color_correction" to Provider { colorCorrectionTile },"dream" to Provider { dreamTile },"font_scaling" to Provider { fontScalingTile })

这段代码是 Kotlin 语言编写的,它定义了一个名为 tileMap 的可变映射(MutableMap)。这个映射的键是字符串类型(String),而值是 Provider<QSTileImpl<*>> 类型。Provider 是 Dagger 框架中的一个接口,它代表了一个对象的延迟提供者,即当需要时才会创建该对象。以**“screenrecord” to Provider { screenRecordTile },**为例,这个screenrecord键值映射了一个provider,当请求screenrecord键时,会返回一个screenRecordTile对象,这个对象就是谷歌录屏这个按钮的实体,实现了谷歌录屏这个快捷按钮的一些行为,比如点击录制,停止录制等。
我们回到创建过程看
在这里插入图片描述
在创建过程时加入过滤集合,将不需要显示的快捷按钮的键值加到set中,如果集合包含要创建的tile,就返回一个空对象,上面对对象判空,如果为空,则不会创建tile。

明白了创建原理,改起来就很简单了,比如在安卓其他版本,这个实现类并不是这样写的
在这里插入图片描述
这里这个实现类是直接在当前类根据tile标识返回对应的实体

    @Nullableprotected QSTileImpl createTileInternal(String tileSpec) {// Stock tiles.switch (tileSpec) {case "wifi":return mWifiTileProvider.get();case "internet":return mInternetTileProvider.get();case "bt":return mBluetoothTileProvider.get();/*case "cell":return mCellularTileProvider.get();*/case "dnd":return mDndTileProvider.get();case "inversion":return mColorInversionTileProvider.get();case "airplane":return mAirplaneModeTileProvider.get();/*case "work":return mWorkModeTileProvider.get();case "rotation":return mRotationLockTileProvider.get();case "flashlight":return mFlashlightTileProvider.get();case "location":return mLocationTileProvider.get();*/case "cast":return mCastTileProvider.get();case "hotspot":return mHotspotTileProvider.get();/*case "battery":return mBatterySaverTileProvider.get();case "saver":return mDataSaverTileProvider.get();case "night":return mNightDisplayTileProvider.get();case "nfc":return mNfcTileProvider.get();case "dark":return mUiModeNightTileProvider.get();*//*case "screenrecord":return mScreenRecordTileProvider.get();*//*case "reduce_brightness":return mReduceBrightColorsTileProvider.get();case "cameratoggle":return mCameraToggleTileProvider.get();case "mictoggle":return mMicrophoneToggleTileProvider.get();*/case "controls":return mDeviceControlsTileProvider.get();/*case "alarm":return mAlarmTileProvider.get();case "wallet":return mQuickAccessWalletTileProvider.get();case "qr_code_scanner":return mQRCodeScannerTileProvider.get();case "onehanded":return mOneHandedModeTileProvider.get();*/case "color_correction":return mColorCorrectionTileProvider.get();/*case "dream":return mDreamTileProvider.get();*/}// Custom tilesif (tileSpec.startsWith(CustomTile.PREFIX)) {return CustomTile.create(mCustomTileBuilderProvider.get(), tileSpec, mQsHostLazy.get().getUserContext());}// Debug tiles./*if (Build.IS_DEBUGGABLE) {if (tileSpec.equals(GarbageMonitor.MemoryTile.TILE_SPEC)) {return mMemoryTileProvider.get();}}*/// Broken tiles.Log.w(TAG, "No stock tile spec: " + tileSpec);return null;}

这种也很简单,直接注释掉不要的tile即可,这个版本的实现类写的稍微就没那么优雅了,但是基本原理都一样。
好了,先写到这里。

3、总结

系统下拉状态栏包含的内容还是很多的,目前只分析了如何移除快捷按钮,继续刨析还可以实现增加自定义的按钮,不过得遵循谷歌的一套做法,再深入了解还可以美化状态栏,这些就留给以后去慢慢分析了。

共勉:分享知识,共同进步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/3317.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java虚拟机(jvm)常见问题总结

1.电脑怎样认识我们编写的Java代码 首先先了解电脑是二进制的系统&#xff0c;他只认识 01010101比如我们经常要编写 HelloWord.java 电脑是怎么认识运行的HelloWord.java是我们程序员编写的&#xff0c;我们人可以认识&#xff0c;但是电脑不认识 Java文件编译的过程 1. 程…

git lab 2.7版本修改密码命令

1.gitlab-rails console -e production Ruby: ruby 2.7.5p203 (2021-11-24 revision f69aeb8314) [x86_64-linux] GitLab: 14.9.0-jh (51fb4a823f6) EE GitLab Shell: 13.24.0 PostgreSQL: 12.7 2根据用户名修改密码 user User.find_by(username: ‘username’) # 替换’use…

无人驾驶(移动机器人)路径规划之RRT与RRTStar算法及其matlab实现

在自动驾驶与移动机器人路径规划时&#xff0c;必定会用到经典的算法RRT与RRT Star。下面是RRT与RRTStar的matlab实现效果。可以发现RRTStar效果明显改善。 目录 一、效果比较 1.1 RRT算法效果&#xff08;黑色为障碍物&#xff0c;红色线为最终路径&#xff0c;蓝色三角形为…

C++之STL-vector+模拟实现

目录 一、vector的介绍和基本使用的方法 1.1 介绍 1.2 迭代器 1.3 vector的一些基本使用 1.3.1 构造函数 1.3.2 迭代器 1.3.3 有关容量的接口 1.3.4 增删查改 二、模拟实现vector 2.1 成员变量 2.2 迭代器的实现 2.3 容量接口的实现 2.3.1 size函数实现 2.3.2 capa…

阿斯达年代记三强争霸新手开荒注意事项 搬砖攻略和注意问题分享

阿斯达年代记三强争霸新手开荒注意事项 搬砖攻略和注意问题分享 阿斯达年代三强争霸这款游戏刚开始公测就获得了玩家们的集体关注&#xff0c;这是一款根据影视剧改编的MMORPG游戏&#xff0c;玩家将置身于名为阿斯大陆的奇幻世界&#xff0c;加入阿斯达、亚高、不法者三大势力…

Prompt之美:如何设计提示词让大模型变“聪明”

目录 一. Prompt关键要素 二. Prompt技巧 三. 实战中的Prompt优化 四. 参考文献 一. Prompt关键要素 Prompt是一个简短的文本输入&#xff0c;用于引导AI模型生成特定的回答或执行特定任务。换句话说&#xff0c;Prompt是你与AI模型沟通的方式。一个好的Prompt可以让AI更准…

从现在开始:让AI写代码,你只负责敲tab键

如果你是一名程序员&#xff0c;你一定有过这样的经历&#xff1a;在编写代码的时候&#xff0c;突然遇到了一个棘手的问题&#xff0c;需要花费大量的时间去查找资料、尝试不同的解决方案&#xff0c;甚至有时候还需要去问同事或者在网上寻求帮助。这样的情况不仅会浪费你的时…

用立方样条联合SHAP分析在危险因素鉴定中的作用

用立方样条联合SHAP分析在危险因素鉴定中的作用 1. SHAP分析告诉我们变量之间的关系 SHAP分析计算的SHAP值代表了某变量对于结局指标的贡献&#xff0c;代表了相关性的趋势&#xff0c;SHAP分析中的散点图是对以上关系的可视化&#xff0c;从中我们可以直观看到随着变量值的变…

百度 | 如何白嫖文心一言4.0,偷偷的用!

文心一言4.0 官方价一个月 59.9&#xff0c;贵不贵&#xff0c;很贵啊 现在有个白嫖文心一言4.0的方法 分享给大家 效果比3.0好用 如何使用 这里用到文心智能体平台&#xff0c;也是百度出的&#xff0c;和字节跳动的coze很像 这里打开文心智能体平台&#xff0c;自行百度…

diskMirror docker 使用容器部署 diskMirror 服务器!!!

Welcome to diskMirror-docker 获取项目 这个项目是 diskMirror-spring-boot 镜像版本的项目&#xff0c;您可以使用下面的命令将此项目编译为一个镜像&#xff01; # 进入到您下载的源码包目录 cd diskMirror-docker# 点击脚本来进行版本的设置以及对应版本的下载 设置 和 编…

JavaEE:File类查询一个文件的路径(举例+源码 )

一、File类概述 Java 中通过 java.io.File 类来对一个文件&#xff08;包括目录&#xff09;进行抽象的描述。File 类中的方法可以对文件路径以及文件名等信息进行查询&#xff0c;也可以对文件进行各项增删改操作&#xff0c;本文主要介绍 File 类的查询方法。 二、代码示例 …

Python入门第10篇(编码)

目录 一、编码是什么&#xff1f; 二、Python中编码 1.读取文件引发的问题 2.其实是Windows的问题 3.试着改改问题 4.各种骚操作 5.终极解决 6.推荐方案 总结 Python系列文章目录 前言 编码存在于所有文件&#xff0c;比较常见的ASCII、utf8、gbk等。最常用的还是ut…

大模型 AI 框架昇思 MindSpore 2.3.RC1 发布,训练、推理性能大幅提升,JIT 编译强化

经过社区开发者们几个月的开发与贡献&#xff0c;现正式发布昇思 MindSpore2.3.RC1 版本&#xff0c;通过多维混合并行以及确定性 CKPT 来实现超大集群的高性能训练&#xff0c;支持大模型训推一体架构&#xff0c;大模型开发训练推理更简、更稳、更高效&#xff0c;并在训推一…

【产品设计】B端产品权限设计~功能权限设计篇

对于B端设计而言&#xff0c;良好的权限设计架构是支持其复杂业务的基础和关键。 一、什么是权限管理 权限管理&#xff0c;一般指根据系统设置的安全规则或者安全策略&#xff0c;用户可以访问而且只能访问自己被授权的资源。 简而言之&#xff0c;用户登录系统后&#xff0…

使用 Redux 管理全局状态

Redux 是个状态集中管理框架&#xff0c;状态可以跨组件共享&#xff0c;状态更新后&#xff0c;调用监听器。其实状态可以认为就是个全局对象&#xff0c;为什么要做一个框架来管理呢&#xff1f;如果我们自己使用一个全解字典来管理状态是不是也行&#xff1f;如果不做任何控…

想在游泳健身的同时畅听音乐,随时哈氪漫游这款IP68防水的骨传导耳机

平时健身的过程中&#xff0c;音乐是许多健身爱好者的忠实伴侣。无论是在室内的健身房&#xff0c;还是户外的自然风光中&#xff0c;一副优质的耳机可以极大地提升我们的锻炼体验。现在市面上专为运动设计的耳机选择非常多&#xff0c;我喜欢用骨传导耳机&#xff0c;目前在用…

深入理解多线程编程

title: 深入理解多线程编程 date: 2024/4/25 17:32:02 updated: 2024/4/25 17:32:02 categories: 后端开发 tags:线程同步互斥锁死锁避免竞态条件线程池异步编程性能优化 第一章&#xff1a;多线程基础 1.1 线程概念与原理 线程&#xff1a;在操作系统中&#xff0c;一个程序…

ADB常用命令

大家好&#xff0c;今天给大家分享一些ADB的常用命令&#xff0c;我们作为测试了解ADB命令能给我们带来哪些好处呢&#xff1f; 1、ADB 命令可以帮助测试人员与Android设备进行交互&#xff0c;如安装、卸载应用&#xff0c;获取设备信息等&#xff0c;便于更深入地测试设备功能…

世强硬创获昕感科技授权代理,SiC MOSFET实现超低导通电阻

近日&#xff0c;世强先进&#xff08;深圳&#xff09;科技股份有限公司&#xff08;下称“世强先进”&#xff09;获北京昕感科技有限责任公司&#xff08;下称“昕感科技”&#xff0c;英文名&#xff1a;NEXIC&#xff09;授权代理&#xff0c;为光伏、储能、电网、新能源汽…

C# 给图片添加文字水印

目录 应用场景 开发运行环境 方法说明 方法代码 调用示例 小结 应用场景 在某些应用项目&#xff08;如电子档案信息管理&#xff09;中&#xff0c;查看电子图片信息是经常使用到的功能&#xff0c;此时我们就需要给显示在浏览器中的图片添加文字水印版权或提示信息。…