Android T 禁止应用添加窗口的操作

什么情况下会出现我们需要禁止应用添加窗口的情况呢?
假如有一个应用的窗口,我们点开后是透明的或者会影响到系统的使用,那么我们就有必要对这个窗口操作一下

回顾我们在Android T WMS窗口相关流程中所讲的内容
在这里插入图片描述
禁止应用添加窗口的操作有两种
1.直接在客户端对应用禁止添加窗口
2.在服务端禁止应用添加窗口

客户端对应用禁止添加窗口

一般来说,应用添加窗口的方式是通过addView()方法直接添加,我们也只需在这个里面修改即可,参考修改如下:
代码路径:frameworks/base/core/java/android/view/WindowManagerGlobal.java

    public void addView(View view, ViewGroup.LayoutParams params,Display display, Window parentWindow, int userId) {if (view == null) {throw new IllegalArgumentException("view must not be null");}if (display == null) {throw new IllegalArgumentException("display must not be null");}if (!(params instanceof WindowManager.LayoutParams)) {throw new IllegalArgumentException("Params must be WindowManager.LayoutParams");}/* modify TAG START */if (((WindowManager.LayoutParams) params).type == WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY&& "问题窗口包名".equals(ActivityThread.currentPackageName())) {android.util.Log.e("TEST","问题窗口包名    有毛病,我不想添加它");return;}/* modify TAG END */final WindowManager.LayoutParams wparams = (WindowManager.LayoutParams) params;if (parentWindow != null) {parentWindow.adjustLayoutParamsForSubWindow(wparams);} else {// If there's no parent, then hardware acceleration for this view is// set from the application's hardware acceleration setting.final Context context = view.getContext();if (context != null&& (context.getApplicationInfo().flags& ApplicationInfo.FLAG_HARDWARE_ACCELERATED) != 0) {wparams.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;}}

可以通过dump window来查看的窗口类型,这里我们以TYPE_APPLICATION_OVERLAY为例,其表示系统覆盖窗口在所有应用窗口上方,但在状态栏和输入法窗口下方。
此时的windowState是还没创建的,无法通过windowState的mAttrs属性获取包名,因此使用ActivityThread.currentPackageName()获取当前执行的进程的包名

在服务端禁止应用添加窗口

我们知道服务端添加窗口的方法就是WindowManagerService中的addWindow()方法,这个方法里面会对需要添加的窗口先进行验证
代码路径:frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java

    public int addWindow(Session session, IWindow client, LayoutParams attrs, int viewVisibility,int displayId, int requestUserId, InsetsVisibilities requestedVisibilities,InputChannel outInputChannel, InsetsState outInsetsState,InsetsSourceControl[] outActiveControls) {......res = displayPolicy.validateAddingWindowLw(attrs, callingPid, callingUid);if (res != ADD_OKAY) {return res;}......}

displayPolicy.validateAddingWindowLw(attrs, callingPid, callingUid)调用DisplayPolicy.java的validateAddingWindowLw()方法,该方法会对窗口TYPE,FLAG等多方面判断。只有返回ADD_OKAY时表示允许当前窗口的添加,反之则不允许添加该窗口。
在WindowManagerGlobal.java中有定义这些返回值

    public static final int ADD_OKAY = 0;public static final int ADD_BAD_APP_TOKEN = -1;public static final int ADD_BAD_SUBWINDOW_TOKEN = -2;public static final int ADD_NOT_APP_TOKEN = -3;public static final int ADD_APP_EXITING = -4;public static final int ADD_DUPLICATE_ADD = -5;public static final int ADD_STARTING_NOT_NEEDED = -6;public static final int ADD_MULTIPLE_SINGLETON = -7;public static final int ADD_PERMISSION_DENIED = -8;public static final int ADD_INVALID_DISPLAY = -9;public static final int ADD_INVALID_TYPE = -10;public static final int ADD_INVALID_USER = -11;

返回的res最终会走到ViewRootImpl的setView方法中
代码路径:frameworks/base/core/java/android/view/ViewRootImpl.java

    public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView,int userId) {synchronized (this) {if (mView == null) {......if (DEBUG_LAYOUT) Log.v(mTag, "Added window " + mWindow);if (res < WindowManagerGlobal.ADD_OKAY) {mAttachInfo.mRootView = null;mAdded = false;mFallbackEventHandler.setView(null);unscheduleTraversals();setAccessibilityFocus(null, null);switch (res) {case WindowManagerGlobal.ADD_BAD_APP_TOKEN:case WindowManagerGlobal.ADD_BAD_SUBWINDOW_TOKEN:throw new WindowManager.BadTokenException("Unable to add window -- token " + attrs.token+ " is not valid; is your activity running?");case WindowManagerGlobal.ADD_NOT_APP_TOKEN:throw new WindowManager.BadTokenException("Unable to add window -- token " + attrs.token+ " is not for an application");case WindowManagerGlobal.ADD_APP_EXITING:throw new WindowManager.BadTokenException("Unable to add window -- app for token " + attrs.token+ " is exiting");case WindowManagerGlobal.ADD_DUPLICATE_ADD:throw new WindowManager.BadTokenException("Unable to add window -- window " + mWindow+ " has already been added");case WindowManagerGlobal.ADD_STARTING_NOT_NEEDED:// Silently ignore -- we would have just removed it// right away, anyway.return;case WindowManagerGlobal.ADD_MULTIPLE_SINGLETON:throw new WindowManager.BadTokenException("Unable to add window "+ mWindow + " -- another window of type "+ mWindowAttributes.type + " already exists");case WindowManagerGlobal.ADD_PERMISSION_DENIED:throw new WindowManager.BadTokenException("Unable to add window "+ mWindow + " -- permission denied for window type "+ mWindowAttributes.type);case WindowManagerGlobal.ADD_INVALID_DISPLAY:throw new WindowManager.InvalidDisplayException("Unable to add window "+ mWindow + " -- the specified display can not be found");case WindowManagerGlobal.ADD_INVALID_TYPE:throw new WindowManager.InvalidDisplayException("Unable to add window "+ mWindow + " -- the specified window type "+ mWindowAttributes.type + " is not valid");case WindowManagerGlobal.ADD_INVALID_USER:throw new WindowManager.BadTokenException("Unable to add Window "+ mWindow + " -- requested userId is not valid");}throw new RuntimeException("Unable to add window -- unknown error code " + res);}......}}}

这里满足if (res < WindowManagerGlobal.ADD_OKAY) 才会进入后面的switch (res)
因此我们在服务端修改代码有三步:
1.在WindowManagerGlobal中添加返回值常量,该值小于ADD_OKAY,也就是小于0即可,例如:
public static final int ADD_FORBID = -99;
2.在ViewRootImpl的setView方法中switch (res)添加相应的 case,例如:

switch (res) {......case WindowManagerGlobal.ADD_FORBID:android.util.Log.e("ViewRootImpl.setView","问题窗口包名    有毛病,我不想添加它");return;}

3.DisplayPolicy.java的validateAddingWindowLw()方法中进行过滤窗口操作,例如

代码路径:frameworks/base/services/core/java/com/android/server/wm/DisplayPolicy.java

    /*** Check if a window can be added to the system.** Currently enforces that two window types are singletons per display:* <ul>* <li>{@link WindowManager.LayoutParams#TYPE_STATUS_BAR}</li>* <li>{@link WindowManager.LayoutParams#TYPE_NOTIFICATION_SHADE}</li>* <li>{@link WindowManager.LayoutParams#TYPE_NAVIGATION_BAR}</li>* </ul>** @param attrs Information about the window to be added.** @return If ok, WindowManagerImpl.ADD_OKAY.  If too many singletons,* WindowManagerImpl.ADD_MULTIPLE_SINGLETON*/int validateAddingWindowLw(WindowManager.LayoutParams attrs, int callingPid, int callingUid) {....../* modify TAG START */if (attrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY && "问题窗口包名".equals(attrs.packageName) {android.util.Log.e("DisplayPolicy.validateAddingWindowLw","问题窗口包名    有毛病,我不想添加它");return ADD_FORBID;}/* modify TAG END */return ADD_OKAY;}

此时的windowState已经创建了,所有我们直接通过attrs.packageName获取应用包名即可。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

程序开发常用在线工具汇总

菜鸟工具# https://c.runoob.com/ 编码# ASCII码# https://www.habaijian.com/ 在线转换# https://www.107000.com/T-Ascii/http://www.ab126.com/goju/1711.html Base64# 在线转换# https://www.qqxiuzi.cn/bianma/base64.htmhttp://www.mxcz.net/tools/Unicode.aspx …

Diffusion Autoencoders: Toward a Meaningful and Decodable Representation

Diffusion Autoencoders: Toward a Meaningful and Decodable Representation (Paper reading) Konpat Preechakul, VISTEC, Thailand, CVPR22 Oral, Cited:117, Code, Paper 1. 前言 扩散概率模型 (DPM) 在图像生成方面取得了显着的质量&#xff0c;可与 GAN 相媲美。但是与…

引入嵌入和向量搜索时的三个错误

将非结构化数据表示为嵌入向量以及使用向量搜索进行基于嵌入的检索 (embedding-based retrieval - EBR) 比以往任何时候都更加流行。 嵌入到底是什么&#xff1f; Roy Keyes 在《嵌入的最短定义&#xff1f;》中对此进行了很好的解释。 嵌入是学习的转换&#xff0c;使数据更有…

React redux更新数据的诡异特征==》彻底掌握redux更新state机制的精髓

此文章是跟随我上一篇文章《Redux Toolkit中action派发但state值不更新的原因》写的。 本来一切都搞定了&#xff0c;此时我突发奇想&#xff1a; 如果让api服务端不发送包含x-pagination的header信息&#xff0c;web端会不会报错。因为按照web端 redux原有的逻辑&#xff1a;…

ubuntu与win之间共享文件夹

ubuntu上设置共享文件夹 第一步&#xff1a;点击【设置】或【虚拟机弹窗下面的【设置】选项】 第二步&#xff1a;进入【虚拟机设置】页面&#xff0c;点击【选项】如下图所示 第三步&#xff1a;启用共享文件&#xff1a;点击【总是启用】第四步&#xff1a;添加共享文件&…

【深度学习】RNN循环神经网络和LSTM深度学习模型

1. 循环神经网络 RNN&#xff08; Recurrent Neural Network&#xff09; 循环神经网络的一个核心是可以把前面的序列数据用到后面的结果预测里面。怎么样实现这一点呢。RNN 结构如下图所示。 前部序列的信息经处理后&#xff0c;作为输入信息传递到后部序列。 数学模型&…

机器学习第十三课--主成分分析PCA

一.高维数据 除了图片、文本数据&#xff0c;我们在实际工作中也会面临更多高维的数据。比如在评分卡模型构建过程中&#xff0c;我们通常会试着衍生出很多的特征&#xff0c;最后就得到上千维、甚至上完维特征;在广告点击率预测应用中&#xff0c;拥有几个亿特征也是常见的事…

使用U3D、pico开发VR(一)——将unity的场景在设备中呈现

最近srtp项目在赶进度&#xff0c;自己之前是在电脑端进行的开发。但是项目是VR端&#xff0c;因此需要重新学习&#xff0c;在此记录一下自己的学习经历。 首先&#xff0c;如何将unity的场景在自己的眼镜中进行呈现呢&#xff1f; 对此&#xff0c;我也找了很多教程&#xff…

Ubuntu 安装Kafka

在本指南中&#xff0c;我们将逐步演示如何在 Ubuntu 22.04 上安装 Apache Kafka。 在大数据中&#xff0c;数以百万计的数据源生成了大量的数据记录流&#xff0c;这些数据源包括社交媒体平台、企业系统、移动应用程序和物联网设备等。如此庞大的数据带来的主要挑战有两个方面…

软件架构的演化和维护

软件架构的演化和维护 定义 定义 顶不住了&#xff0c;刷题去了&#xff0c;不搞这个了&#xff0c;想吐。。。

GLTF编辑器也可以转换GLB模型

1、GLB模型介绍 GLB&#xff08;GLTF Binary&#xff09;是一种用于表示三维模型和场景的文件格式。GLTF是"GL Transmission Format"的缩写&#xff0c;是一种开放的、跨平台的标准&#xff0c;旨在在各种3D图形应用程序和引擎之间进行交换和共享。 GLB文件是GLTF文件…

目标检测:Edge Based Oriented Object Detection

论文作者&#xff1a;Jianghu Shen,Xiaojun Wu 作者单位&#xff1a;Harbin Institute of Technology Shenzhen 论文链接&#xff1a;http://arxiv.org/abs/2309.08265v1 内容简介&#xff1a; 1&#xff09;方向&#xff1a;遥感领域中的目标检测技术 2&#xff09;应用&…

云原生Kubernetes:K8S存储卷

目录 一、理论 1.存储卷 2.emptyDir 存储卷 3.hostPath卷 4.NFS共享存储 5.PVC 和 PV 6.静态创建PV 7.动态创建PV 二、实验 1.emptyDir 存储卷 2.hostPath卷 3.NFS共享存储 4.静态创建PV 5.动态创建PV 三、问题 1.生成pod一直pending 2.shoumount -e未显示共享…

编译vtk源码

vtk和opengl关系 VTK&#xff08;Visualization Toolkit&#xff09;和OpenGL&#xff08;Open Graphics Library&#xff09;都是用于图形可视化和渲染的重要工具&#xff0c;但它们在图形编程中的角色和关系略有不同。 OpenGL&#xff1a; OpenGL是一种开放的图形库和API&a…

十六,镜面IBL--预滤波环境贴图

又到了开心的公式时刻了。 先看看渲染方程 现在关注第二部分&#xff0c;镜面反射。 其中 这里很棘手&#xff0c;与输入wi和输出w0都有关系&#xff0c;所以&#xff0c;再近似 其中第一部分&#xff0c;就是预滤波环境贴图&#xff0c;形式上与前面的辐照度图很相似&#…

uni-app:实现页面效果2(canvas绘制,根据页面宽度调整元素位置)

效果 代码 <template><view><!-- 车搭配指示器-双显 --><view class"content_position"><view class"content"><view class"SN"><view class"SN_title">设备1</view><view class…

【考研数学】概率论与数理统计 —— 第三章 | 二维随机变量及其分布(3,二维随机变量函数的分布)

文章目录 七、二维随机变量函数的分布7.1 二维随机变量函数分布的基本情形 ( X , Y ) (X,Y) (X,Y) 为二维离散型随机变量 ( X , Y ) (X,Y) (X,Y) 为二维连续型随机变量 X X X 为离散型变量&#xff0c; Y Y Y 为连续型变量 7.2 常见二维随机变量的函数及其分布 Z min ⁡ { X ,…

【IDEA】idea恢复pom.xml文件显示灰色并带有删除线

通过idea打开spring boot项目后&#xff0c;发现每个服务中的pom.xml文件显示灰色并带有删除线&#xff0c;下面为解决方案 问题截图 解决方案 打开file——settings——build,execution,deployment——Ignored Files&#xff0c;把pom.xml前面的复选框去掉&#xff0c;去掉之…

虹科分享 | 网络保险:有效承保网络风险解决方案

文章来源&#xff1a;虹科网络安全 点击阅读原文&#xff1a;https://mp.weixin.qq.com/s/myCFPYtVVz5TPSFQaKqvLg 网络风险似乎往往很难量化&#xff0c;这使得保险公司很难适当地承保其网络风险政策。威胁载体的数量和不断发展的威胁&#xff0c;如新型恶意软件/勒索软件&…

PSINS工具箱学习(二)姿态的表示:姿态阵、四元数、欧拉角、等效旋转矢量的概念和转换

原始 Markdown文档、Visio流程图、XMind思维导图见&#xff1a;https://github.com/LiZhengXiao99/Navigation-Learning 文章目录 一、基础概念1、坐标系定义1. 惯性坐标系&#xff08; i 系 &#xff09;2. 地心地固坐标系&#xff08; e 系 )3. 导航坐标系&#xff08; n 系&…