Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >[092]untrusted-touch-events

[092]untrusted-touch-events

作者头像
王小二
发布于 2023-12-06 07:09:50
发布于 2023-12-06 07:09:50
50500
代码可运行
举报
运行总次数:0
代码可运行

背景

来自于一个网友在技术交流群中问题,我正好之前开发过程中也遇到了类似的问题,写个文章记录一下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
InputDispatcher: Untrusted touch due to occlusion by com.xx.xx/10074 (obscuring opacity = 1.00, maximum allowed = 0.80)
InputDispatcher: Dropping untrusted touch event due to com.xx.xx/10074

大佬们,请教个问题哈,测试时发现launcher上有个app,点击按钮没反应,然后捞了下日志,发现有输出上述这2行日志。
请问下大佬们,这2行日志是干啥的呢?

一、这个功能到底有什么用

保护你的手机操作的安全,避免你误点了某个功能,怎么理解这件事?

举个例子,假如悬浮窗口B设置成了可穿透的触摸模式,就是touch事件可以穿透到应用A,那用户在不清楚状况的情况下,以为点击了紫色的“取消"按钮,最后生效的是绿色的“付款“”按钮那不是很危险吗?

为了维持系统安全并保持良好的用户体验,Android 12 会阻止应用使用[触摸事件],也就是说系统会屏蔽穿透某些窗口的触摸操作。

图中就应该屏蔽点击取消的触摸事件,阻止应用A使用这次触摸事件

二、受影响的应用

此变更会影响选择让触摸操作穿透其窗口的应用,例如使用 [FLAG_NOT_TOUCHABLE]标志,但不限于以下示例:

  • 需要 SYSTEM_ALERT_WINDOW权限并使用 FLAG_NOT_TOUCHABLE 标志的叠加层,例如使用 TYPE_APPLICATION_OVERLAY 的窗口。
  • 使用 FLAG_NOT_TOUCHABLE 标志的 activity 窗口。

三、允许被透传的例外情况

3.1 应用中的互动。您的应用会显示叠加层,并且只有当用户与您的应用进行互动时才会显示叠加层。

这个很好理解,以为都是你app内部的事,不用担心有什么不安全的,除非app自己想搞事情

3.2 可信窗口。包括但不限于以下窗口:

无障碍窗口 输入法 (IME) 窗口 Google 助理窗口

注意:类型为 TYPE_APPLICATION_OVERLAY 的窗口不受信任。

这个也好理解,毕竟都是系统内部的窗口

3.3 不可见窗口。窗口的根视图是 GONE 或 INVISIBLE。

不会造成用户的误解

3.4 全透明窗口。窗口的 alpha 属性为 0.0。

与3.3理由一样

3.5 足够半透明的系统警报窗口。当组合后的不透明度小于或等于系统针对触摸的最大遮掩不透明度时,系统会将一组系统警报窗口视为足够半透明。在 Android 12 中,默认最大不透明度为 0.8。

这个网友遇到的错误就是obscuring opacity = 1.00, maximum allowed = 0.80,不透明度1.00,怎么能允许被穿透呢,所以这个应用写的就是不符合规范。 只有让用户可以有足够的透明度知道自己点击的是后面那个窗口,那才是受信任的触摸。

四、检测不受信任的触摸操作是否被屏蔽

可以通过adb日志查看

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Untrusted touch due to occlusion by PACKAGE_NAME

如需允许不受信任的触摸操作,请在终端窗口中运行以下 ADB 命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# A specific app
adb shell am compat disable BLOCK_UNTRUSTED_TOUCHES com.example.app

# All apps
# If you'd still like to see a Logcat message warning when a touch would be
# blocked, use 1 instead of 0.
adb shell settings put global block_untrusted_touches 0

如需将行为还原为默认设置(不受信任的触摸操作被屏蔽),请运行以下命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# A specific app
adb shell am compat reset BLOCK_UNTRUSTED_TOUCHES com.example.app

# All apps
adb shell settings put global block_untrusted_touches 2

这里注意block_untrusted_touches为2是打开功能,1是关闭这个功能,但是还有日志输出,0是彻底关闭这个功能,没有日志输出。

五、代码

具体的代码实现在findTouchedWindowTargetsLocked的逻辑中,会调用computeTouchOcclusionInfoLocked算出TouchOcclusionInfo,然后再调用isTouchTrustedLocked确认是否是信任的触摸事件,有兴趣的可以看看实现细节。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
InputEventInjectionResult InputDispatcher::findTouchedWindowTargetsLocked(
        nsecs_t currentTime, const MotionEntry& entry, std::vector<InputTarget>& inputTargets,
        nsecs_t* nextWakeupTime, bool* outConflictingPointerActions) {
        ...
        for (const sp<WindowInfoHandle>& windowHandle : newTouchedWindows) {
            // Drop events that can't be trusted due to occlusion
            if (mBlockUntrustedTouchesMode != BlockUntrustedTouchesMode::DISABLED) {
                TouchOcclusionInfo occlusionInfo =
                        computeTouchOcclusionInfoLocked(windowHandle, x, y);
                if (!isTouchTrustedLocked(occlusionInfo)) {
                    if (DEBUG_TOUCH_OCCLUSION) {
                        ALOGD("Stack of obscuring windows during untrusted touch (%d, %d):", x, y);
                        for (const auto& log : occlusionInfo.debugInfo) {
                            ALOGD("%s", log.c_str());
                        }
                    }
                    sendUntrustedTouchCommandLocked(occlusionInfo.obscuringPackage);
                    if (mBlockUntrustedTouchesMode == BlockUntrustedTouchesMode::BLOCK) {
                        ALOGW("Dropping untrusted touch event due to %s/%d",
                              occlusionInfo.obscuringPackage.c_str(), occlusionInfo.obscuringUid);
                        continue;
                    }
                }
            }
        }
}

bool InputDispatcher::isTouchTrustedLocked(const TouchOcclusionInfo& occlusionInfo) const {
    if (occlusionInfo.hasBlockingOcclusion) {
        ALOGW("Untrusted touch due to occlusion by %s/%d", occlusionInfo.obscuringPackage.c_str(),
              occlusionInfo.obscuringUid);
        return false;
    }
    if (occlusionInfo.obscuringOpacity > mMaximumObscuringOpacityForTouch) {
        ALOGW("Untrusted touch due to occlusion by %s/%d (obscuring opacity = "
              "%.2f, maximum allowed = %.2f)",
              occlusionInfo.obscuringPackage.c_str(), occlusionInfo.obscuringUid,
              occlusionInfo.obscuringOpacity, mMaximumObscuringOpacityForTouch);
        return false;
    }
    return true;
}

参考文献

https://developer.android.google.cn/about/versions/12/behavior-changes-all#untrusted-touch-events

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-12-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
行为变更 | Android 12 中不受信任的触摸事件
我们在 Android 12 中进行了一些变更,来提升应用和平台的安全性,进而使我们的用户能够拥有更安全的使用体验。回顾关于隐私和安全的文章,请参阅: 政策更新 | 开发者如何处理软件包可见性。
Android 开发者
2022/03/09
1.5K0
行为变更 | Android 12 中不受信任的触摸事件
Android 12的行为变更和版本兼容思路
一年一度的产品线兼容活动又开始了。Android系统每更新一次系统,对开发者而言都是持续而漫长的挑战。
aqi00
2022/01/05
4.7K0
Android 12的行为变更和版本兼容思路
基础篇章:关于 React Native 之 Touchable 系列组件的讲解
提示:前天文章,重发,不想看的请略过,上次失误忘了加效果图 (友情提示:RN学习,从最基础的开始,大家不要嫌弃太基础,会的同学请自行略过,希望不要耽误已经会的同学的宝贵时间) 在上篇 ScrollVi
非著名程序员
2018/02/09
2.1K0
基础篇章:关于 React Native 之 Touchable 系列组件的讲解
十分钟了解Android触摸事件原理(InputManagerService)
从手指接触屏幕到MotionEvent被传送到Activity或者View,中间究竟经历了什么?Android中触摸事件到底是怎么来的呢?源头是哪呢?本文就直观的描述一个整个流程,不求甚解,只求了解。
看书的小蜗牛
2018/06/29
3.5K0
十分钟了解Android触摸事件原理(InputManagerService)
手势魅力-设置一个触摸菜单
本篇为一移动端博文,个人觉得这篇外文还可以,就翻译了一下,最终实现的一个效果是:用手势创建一个本地菜单(点击一菜单按钮,实现设置一个触摸侧滑,滑动滑出效果,如下文中的gif图所示),主要涉及的知识点有移动端三大触摸事件(touchstart,touchmove,touchend),触摸属性,以及实现侧边栏动画,在处理移动端点击,拖动,滑动时,是不得要考虑用户的触摸手势,判断手指在页面上到底是点击还是滑动的,利用原生js的方法封装点击,移动,抬起功能函数,尽管移动(手机)端与pc端有很多相似之处,但还是有很多要注意的地方的,如果你想获得该Demo的源码,复制该标题后台回复[手势魅力-设置一个触摸菜单]就可以了的,初次翻译,如果有误导的地方,欢迎路过的老师,多提意见和指正,如果你想阅读英文原文,扫文末下方二维码或者跳转到指定链接就可以了的
itclanCoder
2020/10/28
1.9K0
手势魅力-设置一个触摸菜单
React Native按钮详解|Touchable系列组件使用详解
尊重版权,未经授权不得转载 本文出自:贾鹏辉的技术博客(http://www.devio.org) 在做App开发过程中离不了的需要用户交互,说到交互,我们首先会想到的就是按钮了,在React Native中没有专门的按钮组件。 为了能让视图能够响应用的的点击事件,我们需要借助Touchablexxx组件,来包裹我们的视图。为什么说是Touchablexxx呢,因为它不只是一个组件,而是一组组件,一下四个组件都可以用来包裹视图来响应用户的点击事件。 TouchableWithoutFeedback:
CrazyCodeBoy
2018/05/07
4.3K0
React Native按钮详解|Touchable系列组件使用详解
十分钟让你了解Android触摸事件原理(InputManagerService)
从手指接触屏幕到MotionEvent被传送到Activity或者View,中间究竟经历了什么?Android中触摸事件到底是怎么来的呢?源头是哪呢?本文就直观的描述一个整个流程,不求甚解,只求了解。
Android技术干货分享
2019/07/23
1.3K0
运维:推荐一款非常实用的窗口管理增强工具WindowTop
WindowTop Pro专业版是一款Windows上使用的窗口管理增强工具,支持Win7及以上系统,将当前窗口设置在顶部,使其变暗,应用透明性,缩小它,等等!该软件使您可以将任何窗口固定在顶部,启用窗口透明度,甚至单击透明窗口,设置窗口黑暗/阅读模式,将窗口缩小到小尺寸等等。您可以轻松地将窗口设置在顶部,并用红框突出显示最顶部的窗口。您可以在设置中配置此行为(框架颜色等)。
小明互联网技术分享社区
2024/07/22
3310
运维:推荐一款非常实用的窗口管理增强工具WindowTop
眨个眼就学会了Pixi.js
当今的Web开发中,图形和动画已经成为了吸引用户注意力的重要手段之一。而 Pixi.js 作为一款高效、易用的2D渲染引擎,已经成为了许多开发者的首选(我吹的)。本文将为工友们介绍PixiJS的基础知识和使用方法,希望可以和工友们**快速光速入门**,掌握 Pixi.js 的用法。
德育处主任
2023/04/23
7.2K0
眨个眼就学会了Pixi.js
Android中Input事件初始化、接收以及分发
至此 , InputManager完成初始化. 接下来就等待/dev/input中添加设备文件.
None_Ling
2020/09/24
2.1K0
那些与 IE 相伴的日子
Internet Explorer(简称:IE)是 微软公司 (https://baike.baidu.com/item/微软公司/732128) 为了对抗 网景浏览器 (https://baike.baidu.com/item/网景浏览器)(NetscapeNavigator)从而投入开发,并于 1995 年推出的一款网页浏览器,曾经一度成为同 Windows 系统捆绑安装的流氓软件横行于世,也占据了极高的市场份额,但在近些年里,它却一直因为本身的落后而被众多用户和开发者诟病。
政采云前端团队
2021/03/16
1K0
那些与 IE 相伴的日子
Android | 输入系统(IMS)
一般情况下很多同学对于点击事件的认识都只存在于从 Activity 开始的,然后从 Window 中进行分发,甚至有些人可能也只知道 onTouchEvent 和 dispatchTouchEvetn 这几个方法,对于 View 层的了解都不属性。
345
2023/03/08
1.5K0
Android | 输入系统(IMS)
[首发] 苹果iOS 13 新设计规范全面解析
静电说:iOS 13已经发布了半个月时间。很多小伙伴都特别想对iOS13的全新设计规范有一个全面的了解。在这里静电结合WWDC 2019的官方视频与苹果官方资料,花了一整天的时间翻译整理,为大家带来最全面细致的iOS 13交互设计指南及规范解析。赶紧转发收藏吧!
用户5009027
2019/06/20
4.6K0
[首发] 苹果iOS 13 新设计规范全面解析
【QT】Widget 控件核心属性
Widget 是 Qt 中的核⼼概念. 英⽂原义是 “⼩部件”, 我们此处也把它翻译为 “控件” 。控件是构成⼀个图形化界⾯的基本要素.
YoungMLet
2024/07/16
2280
【QT】Widget 控件核心属性
Android中窗口Input事件接收
至此 , 在InputMangerService与应用窗口间就建立了Socket连接.
None_Ling
2020/09/28
4K0
iOS14开发-触摸与手势识别
用于描述触摸的窗口、位置、运动和力度。一个手指触摸屏幕,就会生成一个 UITouch 对象,如果多个手指同时触摸,就会生成多个 UITouch 对象。
YungFan
2021/05/10
2.4K0
笔记27 | WindowManager实现悬浮窗口总结
地址 http://blog.csdn.net/xiangyong_1521/article/details/78401755 目录 关于Window/WindowManagerService的简介
项勇
2018/06/19
2.4K0
react native简单入门
只执行一次: constructor、componentWillMount、componentDidMount 执行多次:render 、子组件的componentWillReceiveProps、componentWillUpdate、componentDidUpdate 有条件的执行:componentWillUnmount(页面离开,组件销毁时) 不执行的:根组件(ReactDOM.render在DOM上的组件)的componentWillReceiveProps(因为压根没有父组件给传递props)
前端迷
2019/12/05
3.7K0
react native简单入门
ClickJacking攻击-获取管理员权限
前言 有一段时间没做测试了,偶尔的时候也会去挖挖洞。本文章要写的东西是我利用ClickJacking拿下管理员权限的测试过程。但在说明过程之前,先带大家了解一下ClickJacking的基本原理以及简单的漏洞挖掘。 ClickJacking ClickJacking背景说明: ClickJacking(点击劫持)是由互联网安全专家罗伯特·汉森和耶利米·格劳斯曼在2008年首创的。 ClickJacking是一种视觉欺骗攻击手段,在web端就是iframe嵌套一个透明不可见的
奶糖味的代言
2018/04/16
1.5K0
《101 Windows Phone 7 Apps》读书笔记-ALARM CLOCK
课程内容 Ø 隔离存储空间 Ø 设置 Ø 设置页面向导 Ø Toggle Switch控件 Ø 使用自定义字体     Alarm Clock模仿的是一种有点复古的数字闹钟。它具有固定的显示,上面的分段可以根据需要进行打开或者关闭。它不仅能够显示当前的时间、周几,而且可以设置午休的闹钟(即使它被锁屏界面遮盖,闹钟会在程序运行的状态下发出提醒)。     Alarm Clock提供了一些诸如颜色、时间格式和震动方式等与用户可设置的功能。它也能够保留状态信息,比如闹铃是否被打开,什么时间应该发出提
ShiJiong
2018/01/10
1.2K0
《101 Windows Phone 7 Apps》读书笔记-ALARM CLOCK
相关推荐
行为变更 | Android 12 中不受信任的触摸事件
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验