Android12 SystemUI QS面板新增截屏功能

发布于:2024-08-14 ⋅ 阅读:(143) ⋅ 点赞:(0)

问题:Android12 中SystemUI版本,QS下拉快捷面板式没有截屏功能的。
需求:客户要求在项目中实现下拉快捷面板具备一键截屏功能

目前自己只针对Android12 mtk/RK平台实践过,接触的全志平台暂未实验验证。


前言

Android12 中在SystemUI的QS面板添加截屏功能按钮,目前在RK和mtk 平台验证过,实现步骤基本一致


一、实际实现效果

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/9577a485e11a404b8e1adfe2c86384a3.png在这里插入图片描述

视频效果如下

Android12 SystemUI新增截屏功能

二、修改点

1.新增文件

packages\apps\SystemUI\src\com\android\systemui\qs\tiles\ScreenShotTile.java
packages\apps\SystemUI\src\com\android\systemui\statusbar\policy\ScreenShotController.java
packages\apps\SystemUI\src\com\android\systemui\statusbar\policy\ScreenShotControllerImpl.java
packages\apps\SystemUI\res\drawable\ic_screenshot.xml

2.修改文件

packages\apps\SystemUI\src\com\android\systemui\qs\tileimpl\QSFactoryImpl.java
packages\apps\SystemUI\src\com\android\systemui\statusbar\policy\dragger\StatusBarPolicyModule.java    
packages\apps\SystemUI\res\values\config.xml

具体代码实现,可以在文章末尾下载源代码,查看具体修改

三、基础知识储备

我从个人角度从零到1过程中,特别对于刚入手SystemUI,对SystemUI内容、架构、布局不熟悉的同学,更要针对SystemUI基本知识充电了解。方便当前需求实现和后续相关功能的定制和需求实现。

基础知识内容了解

SystemUI是什么、SystemUI启动流程、SystemUI布局、SystemUI有哪些内容、SystemUI架构、SystemUI组件.

相关资料参考:

谷歌开源项目,SystemUI基础必备

谷歌安卓开源项目SystemUI Remind
谷歌安卓开源项目SystemUI doc文档
Dragger
Qs-Titles

以上官方资料其实介绍很详细了,看完后还是模棱两可很正常,建议多看几遍,品味品味流程,跟进代码。
下面是部分其它自己认为写的比较好的博客或者专题,可以借鉴看看。 建议多看几遍,理解更为透彻了,然后跟一下代码流程,收获会是巨大的。

其它文章推荐

SystemUI 架构分析
深入理解SystemUI
SystemUI下拉框自定义(Android9.0)
SystemUI栏目(MTK平台)
SystemUI专题一
SystemUI专题二

源码查询平台

SystemUI源码查询

四、需求实现

从三中的相关基础准备,思路其实都很清晰了的,下面是我自己思路相关,来实现这个需求。
在QS面板中,已经有现成的功能,比如投屏功能,那么我们找到投屏相关代码和分析的流程来实现需求就可以了。
这里涉及到几个类:

  • QSFactoryImpl:在 SystemUI 中,QSFacturer 工厂的仅有一个实现,即QSFactoryImpl中的默认工厂 ( ) CurrentTilesInteractorImpl
  • QSTileImpl:抽象实现QSTile,为所有图块提供基本的通用行为。还为不同类型的实现扩展Icon。当前在 SystemUI 子类中定义的所有图块均来自此实现。

下面先分析投屏的部分代码

继承QSTileImpl

/** Quick settings tile: Cast **/
public class CastTile extends QSTileImpl<BooleanState> {
   

创建的地方

private final Provider<CastTile> mCastTileProvider;
....
  @Inject
    public QSFactoryImpl(
          .....
            Provider<CastTile> castTileProvider,
            ...
          ) {
   
           mCastTileProvider = castTileProvider;
          }


   private QSTileImpl createTileInternal(String tileSpec) 

网站公告

今日签到

点亮在社区的每一天
去签到