【Android WMS】从应用图像获取来认识WindowState

为了能够更动感的去学习WMS窗口概念,这里我们从应用的图像画面获取来认识WindowState,作为WMS学习的一个突破口,现在暂时记住下面这句话,

  1. WindowState是WMS中的一个对象,保存了APP窗口相关信息。

保存了窗口相关信息?图像信息也包含么?答案是包含了的,我们可以从WindowState里获取到应用的GrahpicBuffer,进而保存期图像画面。(使用SurfaceControl相关方法)

【Android】使用SurfaceControl.captureLayers获取应用图像Layer试验 里面

试验了调用WallPaperControll的方法Bitmap screenshotWallpaperLocked()方法来保存WapllPaper图像,

这个方法里通过SurfaceControl.captureLayers调用,传入wallpaperWindowState.getSurfaceControl().getHandle(),得到了相应的GraphicBuffer,

SurfaceControl.captureLayers( wallpaperWindowState.getSurfaceControl().getHandle(), bounds, 1 /* frameScale */);

695    /**
696     * Take a screenshot of the wallpaper if it's visible.
697     *
698     * @return Bitmap of the wallpaper
699     */
700    Bitmap screenshotWallpaperLocked() {
701        if (!mService.mPolicy.isScreenOn()) {
702            if (DEBUG_SCREENSHOT) {
703                Slog.i(TAG_WM, "Attempted to take screenshot while display was off.");
704            }
705            return null;
706        }
707
708        final WindowState wallpaperWindowState = getTopVisibleWallpaper();
709        if (wallpaperWindowState == null) {
710            if (DEBUG_SCREENSHOT) {
711                Slog.i(TAG_WM, "No visible wallpaper to screenshot");
712            }
713            return null;
714        }
715
716        final Rect bounds = wallpaperWindowState.getBounds();
717        bounds.offsetTo(0, 0);
718
719        GraphicBuffer wallpaperBuffer = SurfaceControl.captureLayers(
720                wallpaperWindowState.getSurfaceControl().getHandle(), bounds, 1 /* frameScale */);
721
722        if (wallpaperBuffer == null) {
723            Slog.w(TAG_WM, "Failed to screenshot wallpaper");
724            return null;
725        }
726        return Bitmap.createHardwareBitmap(wallpaperBuffer);
727    }

这里给了我们启发,WindowState.getSurfaceControl()方法可以获取到应用SurfaceControl相关内容,进而获取到应用图像。

命令dumpsys window windows可以查看到WIndowState的信息,如

WINDOW MANAGER WINDOWS (dumpsys window windows)
  Window #0 Window{bb28569 u0 ScreenDecorOverlayBottom}:
    mDisplayId=0 rootTaskId=1 mSession=Session{d35f7c7 3452:u0a10142} mClient=android.os.BinderProxy@1b679d8
    mOwnerUid=10142 showForAllUsers=true package=com.android.systemui appop=NONE
    mAttrs={(0,0)(fillxwrap) gr=BOTTOM CENTER_VERTICAL sim={adjust=pan} layoutInDisplayCutoutMode=always ty=NAVIGATION_BAR_PANEL fmt=TRANSLUCENT
      fl=NOT_FOCUSABLE NOT_TOUCHABLE NOT_TOUCH_MODAL LAYOUT_IN_SCREEN SPLIT_TOUCH FLAG_SLIPPERY
      pfl=SHOW_FOR_ALL_USERS NO_MOVE_ANIMATION IS_ROUNDED_CORNERS_OVERLAY COLOR_SPACE_AGNOSTIC USE_BLAST FIT_INSETS_CONTROLLED TRUSTED_OVERLAY
      vsysui=LAYOUT_STABLE
      bhv=DEFAULT}
    Requested w=1080 h=66 mLayoutSeq=125

一个比较朴素的试验,可以在WindowState的dump方法里,添加SurfaceControl.captureLayers方法,获取到相应的GraphicBuffer,再仿照 Bitmap screenshotWallpaperLocked()里的处理,调用

Bitmap.createHardwareBitmap方法,转换为Bitmap对象,再调用Bitmap的compress方法,就可以保存图像了。

3305    void dump(PrintWriter pw, String prefix, boolean dumpAll) {
3306        final TaskStack stack = getStack();
3307        pw.print(prefix); pw.print("mDisplayId="); pw.print(getDisplayId());
3308                if (stack != null) {
3309                    pw.print(" stackId="); pw.print(stack.mStackId);
3310                }
3311                pw.print(" mSession="); pw.print(mSession);
3312                pw.print(" mClient="); pw.println(mClient.asBinder());
3313        pw.print(prefix); pw.print("mOwnerUid="); pw.print(mOwnerUid);
3314                pw.print(" mShowToOwnerOnly="); pw.print(mShowToOwnerOnly);
3315                pw.print(" package="); pw.print(mAttrs.packageName);
3316                pw.print(" appop="); pw.println(AppOpsManager.opToName(mAppOp));
3317        pw.print(prefix); pw.print("mAttrs="); pw.println(mAttrs.toString(prefix));
3318        pw.print(prefix); pw.print("Requested w="); pw.print(mRequestedWidth);
3319                pw.print(" h="); pw.print(mRequestedHeight);

这个就很直观的展现了WindowState和应用surface相关联系。也说明,WMS有能力获取到应用图像。

WMS在创建窗口的时候创建WIndowState,并且告诉SurfaceFlinger去创建Surface对象,提供给App去绘图。

Surface联系如下:

参考资料:

https://blog.csdn.net/yangwen123/article/details/80674965?spm=1001.2014.3001.5502

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ACM训练赛赛后补题:Happy Necklace(思维+递推+矩阵快速幂)

题目描述: 分析 这道题很容易就可以定性为动态规划,需要能够推出递推公式;然后观察发现n太大了,最多只能接收O(logn)的复杂度,这样的复杂度,实现的方式就是矩阵快速幂。 首先题目所说的是这一串项链里面…

77.qt qml-QianWindow-V1版本界面讲解

上章介绍: 76.qt qml-QianWindow开源炫酷界面框架简介(支持白色暗黑渐变自定义控件均以适配) 界面如下所示: 代码结构如下所示:

大学四年..就混了毕业证的我,出社会深感无力..辞去工作,从头开始

时间如白驹过隙,一恍就到了2023年,今天最于我来说是一个值得纪念的日子,因为我收获了今年的第一个offer背景18年毕业,二本。大学四年,也就将就混了毕业证和学位证。毕业后,并未想过留在湖南,就回…

西安石油大学C语言期末重点知识点总结

大一学生一周十万字爆肝版C语言总结笔记 是我自己在学习完C语言的一次总结,尽管会有许多的瑕疵和不足,但也是自己对C语言的一次思考和探索,也让我开始有了写作博客的习惯和学习思考总结,争取等我将来变得更强的时候再去给它优化出…

计算机组成原理笔记——计算机性能指标(CPI、IPS、MIPS等)

计算机系统的性能评价有两种指标,分别为非时间指标和时间指标。 非时间指标 机器字长总线宽度主存容量、存储带宽CPU内核数 时间指标 主频、周频、外频、倍频CPI、IPCMIPS、MFLOPSCPU执行时间 非时间指标 (1)机器字长 机器一次能处理的二…

复制带随机指针的复杂链表

目录一、题目题目链接二、题目分析三、解题思路四、解题步骤4.1 复制结点并链接到对应原节点的后面4.2 处理复制的结点的随机指针random4.3 分离复制的链表结点和原链表结点并重新链接成为链表五、参考代码六、总结一、题目题目链接 ​​​​ ​ 题目链接:https://…

IDEA搭建vue-cli | vue-router | 排错思路、Webpack、Axios、周期、路由、异步、重定向

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! Vue.js概述 Vue 是一套用于构建用户界面的渐进式JavaScript框架。 与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层…

C语言数据结构初阶(6)----链表常见OJ题

CSDN的uu们,大家好!编程能力的提高不仅需要学习新的知识,还需要大量的练习。所以,C语言数据结构初阶的第六讲邀请uu们一起来看看链表的常见oj题目。移除链表元素原题链接:203. 移除链表元素 - 力扣(Leetcod…

ENVI_IDL:批量获取影像文件各个波段的中值并输出为csv文件

01 实验数据诸多.float后缀的影像文件(但以ENVI默认格式存储)02 实验思路迭代循环所有影像文件所在的文件夹, 获取每一个float后缀的影像文件,并对每一个影像文件进行循环,获取循环文件的每一个波段影像的中值,最后将其输出为csv文…

设计模式之单例模式~

设计模式包含很多,但与面试相关的设计模式是单例模式,单例模式的写法有好几种,我们主要学习这三种—饿汉式单例,懒汉式单例、登记式单例,这篇文章我们主要学习饿汉式单例 单例模式: 满足要点: 私有构造 …

改进YOLO系列 | CVPR2023最新 PConv | 提供 YOLOv5 / YOLOv7 / YOLOv7-tiny 模型 YAML 文件

DWConv是Conv的一种流行变体,已被广泛用作许多神经网络的关键构建块。对于输入 I ∈ R c h w I \in R^{c \times h \times w} I∈

用chatgpt写insar地质灾害的论文,重复率只有1.8%,chatgpt4.0写论文不是梦

突发奇想,想用chatgpt写一篇论文,并看看查重率,结果很惊艳,说明是确实可行的,请看下图。 下面是完整的文字内容。 InSAR (Interferometric Synthetic Aperture Radar) 地质灾害监测技术是一种基于合成孔径雷达…

GPT-4,终于来了!

就在昨天凌晨,OpenAI发布了多模态预训练大模型GPT-4。 这不昨天一觉醒来,GPT-4都快刷屏了,不管是在朋友圈还是网络上都看到了很多信息和文章。 GPT是Generative Pre-trained Transformer的缩写,也即生成型预训练变换模型的意思。…

jupyter的安装和使用

目录 ❤ Jupyter Notebook是什么? notebook jupyter 简介 notebook jupyter 组成 网页应用 文档 主要特点 ❤ jupyter notebook的安装 notebook jupyter 安装有两种途径 1.通过Anaconda进行安装 2.通过pip进行安装 启动jupyter notebook ❤ jupyter …

5G(NR)信道带宽和发射带宽---频率资源

前言 查看此文之前建议先看看这篇 5G(NR)频率资源划分_nr运营商频段划分_达帮主的博客-CSDN博客NR频率有上面几个划分 ,可以使用低于1GHz的频端,既可以使用高于30GHz高频端。使用频端高于30GHz那我们称之为高频或者毫米波。使用毫米波是5G网络区别于4G…

蓝桥冲刺31天之317

在这个时代,我们总是在比较,觉得自己不够好 其实不必羡慕别人的闪光点 每个人都是属于自己的限量版 做你喜欢并且擅长的事,做到极致 自然会找到自己独一无二的价值 鸟不跟鱼比游泳,鱼不跟鸟比飞翔 你我各有所长 A:组队…

【数学基础】你还不理解最大似然估计吗?一篇文章带你快速了解掌握

📚引言 🙋‍♂️作者简介:生鱼同学,大数据科学与技术专业硕士在读👨‍🎓,曾获得华为杯数学建模国家二等奖🏆,MathorCup 数学建模竞赛国家二等奖🏅&#xff0c…

JAVA并发编程之锁

1、乐观锁和悲观锁 1.1、悲观锁 认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会加锁,确保数据不会别的线程修改。synchronized关键字和Lock的实现类都是悲观锁。适合写操作多的场景,先加锁可以保证写操作时数据…

leetcode刷题之回文链表

目录 做题思路 代码实现 1.找到链表的中间节点 2.反转中间节点之后的链表 3.判断倒置的后半部分的链表是否等于前半部分的链表 整体代码展示 总结: 这里是题目链接。 这道题目的意思是:判断该链表中后半部分倒置是否跟前半部分相同,如…

java 每日一练 (8)

文章目录1. 单选题2. 编程题1. 单选题 1. 下列选项中关于 java 中 super 关键字的说法正确的是 () A: super 关键字是在子类对象内部指代父类对象的引用. B : super 关键字不仅可以指代子类的直接父类,还可以直接指代父类的父类. C &#…