TaskSnapshot保存应用画面截图快照的处理过程

2023-05-16

在前面讨论TaskSnapshot的时候,

https://blog.csdn.net/aaajj/article/details/114208770

 

我们知道

TaskSnapshotController中也通过获取layer的方式获取了graphicBuffer,这样按recent按键的时候就可以看到每个应用的快照截图,

并且保存了图像信息到手机data/system_ce/0/snapshots中,这样,手机重启后,点击recent任务按键,还可以看到关机前的任务快照截图

 

这里我们来看看其写graphicBuffer对象数据到图片的实现,

 

frameworks/base/services/core/java/com/android/server/wm/TaskSnapshotController.java

中,有




168    void snapshotTasks(ArraySet<Task> tasks) {  

169        for (int i = tasks.size() - 1; i >= 0; i--) {  

170            final Task task = tasks.valueAt(i);  

171            final int mode = getSnapshotMode(task);  

172            final TaskSnapshot snapshot;  

173            switch (mode) {  

174                case SNAPSHOT_MODE_NONE:  

175                    continue;  

176                case SNAPSHOT_MODE_APP_THEME:  

177                    snapshot = drawAppThemeSnapshot(task);  

178                    break;  

179                case SNAPSHOT_MODE_REAL:  

180                    snapshot = snapshotTask(task);  

181                    break;  

182                default:  

183                    snapshot = null;  

184                    break;  

185            }  

186            if (snapshot != null) {  

187                final GraphicBuffer buffer = snapshot.getSnapshot();  

188                if (buffer.getWidth() == 0 || buffer.getHeight() == 0) {  

189                    buffer.destroy();  

190                    Slog.e(TAG, "Invalid task snapshot dimensions " + buffer.getWidth() + "x"  

191                            + buffer.getHeight());  

192                } else {  

193                    mCache.putSnapshot(task, snapshot);  

194                    mPersister.persistSnapshot(task.mTaskId, task.mUserId, snapshot);  

195                    if (task.getController() != null) {  

196                        task.getController().reportSnapshotChanged(snapshot);  

197                    }  

198                }  

199            }  

200        }  

201    }  

 

 


mPersister.persistSnapshot(task.mTaskId, task.mUserId, snapshot);  

方法进行了数据保存

 

frameworks/base/services/core/java/com/android/server/wm/TaskSnapshotPersister.java

 


101    void persistSnapshot(int taskId, int userId, TaskSnapshot snapshot) {  

102        synchronized (mLock) {  

103            mPersistedTaskIdsSinceLastRemoveObsolete.add(taskId);  

104            sendToQueueLocked(new StoreWriteQueueItem(taskId, userId, snapshot));  

105        }  

106    }  

 

 


275        StoreWriteQueueItem(int taskId, int userId, TaskSnapshot snapshot) {  

276            mTaskId = taskId;  

277            mUserId = userId;  

278            mSnapshot = snapshot;  

279        }  

280  

 

最后调用到write方法




338        boolean writeBuffer() {  

339            final Bitmap bitmap = Bitmap.createHardwareBitmap(mSnapshot.getSnapshot());  

340            if (bitmap == null) {  

341                Slog.e(TAG, "Invalid task snapshot hw bitmap");  

342                return false;  

343            }  

344  

345            final Bitmap swBitmap = bitmap.copy(Config.ARGB_8888, false /* isMutable */);  

346            final File reducedFile = getReducedResolutionBitmapFile(mTaskId, mUserId);  

347            final Bitmap reduced = mSnapshot.isReducedResolution()  

348                    ? swBitmap  

349                    : Bitmap.createScaledBitmap(swBitmap,  

350                            (int) (bitmap.getWidth() * REDUCED_SCALE),  

351                            (int) (bitmap.getHeight() * REDUCED_SCALE), true /* filter */);  

352            try {  

353                FileOutputStream reducedFos = new FileOutputStream(reducedFile);  

354                reduced.compress(JPEG, QUALITY, reducedFos);  

355                reducedFos.close();  

356            } catch (IOException e) {  

357                Slog.e(TAG, "Unable to open " + reducedFile +" for persisting.", e);  

358                return false;  

359            }  

360  

361            // For snapshots with reduced resolution, do not create or save full sized bitmaps  

362            if (mSnapshot.isReducedResolution()) {  

363                return true;  

364            }  

365  

366            final File file = getBitmapFile(mTaskId, mUserId);  

367            try {  

368                FileOutputStream fos = new FileOutputStream(file);  

369                swBitmap.compress(JPEG, QUALITY, fos);  

370                fos.close();  

371            } catch (IOException e) {  

372                Slog.e(TAG, "Unable to open " + file + " for persisting.", e);  

373                return false;  

374            }  

375            return true;  

376        }  

377    }  

 

 

Bitmap中,通过


Bitmap bitmap = Bitmap.createHardwareBitmap(mSnapshot.getSnapshot());  

来把GraphicBuffer数据转换为Bitmap对象,

再通过调用compress方法保存到图片文件中。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TaskSnapshot保存应用画面截图快照的处理过程 的相关文章

  • Maven使用教程

    一 Maven介绍 我们在开发项目的过程中 xff0c 会使用一些开源框架 第三方的工具等等 xff0c 这些都是以jar包的方式被项目所引用 xff0c 并且有些jar包还会依赖其他的jar包 xff0c 我们同样需要添加到项目中 xff
  • Linux下 文件类型不同颜色的含义

    linux 文件颜色的含义 蓝色 代表目录 绿色 代表可执行文件 红色 表示压缩文件 浅蓝色 表示链接文件 灰色 表示其他文件 红色闪烁 表示链接的文件有问题了 黄色 表示设备文件 蓝色文件 目录 白色文件 一般性文件 xff0c 如文本文
  • vim常用命令总结

    vim 选择文本 xff0c 删除 xff0c 复制 xff0c 粘贴 文本的选择 xff0c 对于编辑器来说 xff0c 是很基本的东西 xff0c 也经常被用到 xff0c 总结如下 xff1a v 从光标当前位置开始 xff0c 光标
  • Understanding ECMAScript 6

    原文 内容列表 简介 浏览器与 Node js 兼容性这本书的受众概述帮助与支持Block Bindings var 声明与提升 Hoisting 块级声明循环中的块级绑定全局块级绑定
  • Spring boot WebMvcConfigurerAdapte方法已经过时解决方法

    在spring boot 2 0以后 WebMvcConfigurerAdapter 这个方法已经过时 xff0c 通过百度网上的资料之后发现很多人说是改成继承WebMvcConfigurationSupport这个类 xff0c 这种方式
  • Linux开机详细流程

    计算机启动分为内核加载前 加载时和加载后3个大阶段 xff0c 这3个大阶段又可以分为很多小阶段 xff0c 本文将非常细化分析每一个重要的小阶段 内核加载前的阶段和操作系统无关 xff0c Linux或Windows在这部分的顺序是一样的
  • SDV、SIT、SVT、DFX、UAT

    SDV System design Verify 系统设计验证 SIT System Integration Testing 系统集成测试 xff0c 也叫做集成测试 是软件测试的一个术语 xff0c 在其中单独的软件模块被合并和作为一个组
  • 【Linux】Windows10 Ubuntu子系统初始配置及开启VNC

    环境 描述 xff1a 目标环境 Ubuntu18 04 已经通过win10 管理器安装好子系统处于初始化状态使用运行框 wsl 访问Ubuntu 系统的文件内容 配置阿里的apt get 源代 sudo vi etc apt source
  • 蓝桥杯_刷题_天干地支

    天干地支 题目描述 古代中国使用天干地支来记录当前的年份 天干一共有十个 xff0c 分别为 xff1a 甲 xff08 ji xff09 乙 xff08 y xff09 丙 xff08 b ng xff09 丁 xff08 d ng xf
  • 项目干系人

    项目干系人 xff08 Project Stakeholder xff09 xff0c 也称为项目利害关系者 是积极参与项目或其利益因项目的实施或完成受到影响的个人和组织 xff0c 这些利害关系着还可以对项目的目标或者结果施加影响 项目管
  • 搭建LAMP环境

    LAMP 是指Linux xff08 操作系统 xff09 43 Apache xff08 HTTP 服务器 xff09 43 MySQL xff08 数据库 xff09 和 PHP xff08 网络编程语言 xff09 xff0c 一般用
  • Python爬取CSDN博客所有文章

    需求 Python爬取某个账号CSDN博客所有文章的标题 xff0c 类型 xff0c 创建时间 xff0c 阅读数量 xff0c 并将结果保存至Excel 分析 CSDN主页URL为 xff1a https blog csdn net s
  • DLINK-DSN1100的安装使用记录

    网上淘了一套DSN1100存储 xff0c 说是企业级存储 xff0c 支持ISCSI xff0c 我这边正好想搭一套VMWARE的环境 xff0c 正好上手试试 先说这个存储的做工 xff0c 硬件在这个价位上可以说是超值 xff0c 加
  • 安装和使用ArchLiunx超详细教程

    安装系统 一 下载介质 https www archlinux org download 二 启动 ISO 到Live 环境 此步骤由很多种方式 xff1a 制作ISO为U盘启动工具 xff0c 可以使用 Ultra ISO 或 大白菜 有
  • Block Bindings

    Block Bindings 一般来讲 xff0c 变量的声明方式在 Javascript 的变成中是一个棘手的部分 tricky part 在大部分 C Based 语言中 xff0c 变量是在声明的地方创建的 但是在 Javascrip
  • openvas的安装和使用(kali2021)

    kali2020中已经不可以直接安装openvas了 xff0c 常用命令openvas setup等等 xff0c 在执行后都会在终端报错 xff1a 命令找不到 所以 xff0c 要使用GVM 下面用我的安装经验来介绍如何安装 xff0
  • 迁移CentOS 8到版本 almalinux8

    访问 https www ipaddress com xff0c 查询 raw githubusercontent com 的IP 添加到 etc hosts文件中 xff1a vim etc hosts 添加内容 xff1a Github

随机推荐