行为变更 | Android 12 中不受信任的触摸事件

image

我们在 Android 12 中进行了一些变更,来提升应用和平台的安全性,进而使我们的用户能够拥有更安全的使用体验。回顾关于隐私和安全的文章,请参阅: 政策更新 | 开发者如何处理软件包可见性

触摸控制是 Android 系统中同应用进行交互的主要方式。Android 12 中采取了额外的措施,来确保触摸事件被正确地传递给了应该响应此事件的应用,以此确保触摸交互的直观和安全性。具体地说,就是在 Android 12 中,如果触摸事件是从一个不同的应用窗口传递的,那么此事件会被屏蔽。这一改变将影响所有在 Android 12 中运行的应用,且与应用的 "targetSdkVersion" 无关。这有助于帮助用户更直观地确认他们正在进行交互的应用。继续阅读本文来看看您的应用是否会受到此变更的影响,以及了解如何针对此变更测试您的应用。

尽可能使用特殊用途 (Special-Purpose) 的 API

在检查您的应用是否会受此影响之前,最好先评估一下您应用的某些场景是否可以使用以下 Android API。这些 API 部分由系统控制,可以被信任,因此您不需要担心使用这些 API 会受到限制。它们是:

  • Bubbles: Bubbles 是像气泡一样浮动在其他应用内容的上层,并且会跟随用户所处的位置,还可以展开以显示应用功能和信息。
  • Picture-in-Picture (PIP): PIP 功能允许应用在一个小窗口中显示内容,用户可以通过固定到屏幕一角的小窗口观看视频,同时在应用之间进行导航或浏览主屏幕上的内容。用户还可以拖动 PIP 窗口,并可以点击它来展开或进行关闭。
  • Notifications: 通知是指 Android 在您应用的界面之外显示的消息,旨在向用户提供提醒、来自他人的通信信息或您应用中的其他适时弹出的信息。用户可以点按通知来打开应用,或直接在通知中执行操作。
  • SnackbarsToasts: 如果您需要在应用中显示一条简短的信息,可以使用 Snackbars。如果您需要应用在后台的情况下显示信息,可以看看 Toasts 是否符合您的需求。

如果您应用的使用场景匹配了上述某个 API 的使用场景,那么强烈建议您使用这些 API。不仅仅是因为这些 API 简单易用,它们还更加安全,而且用户已经对它们中的大多数很熟悉了。

我会受到影响吗?

如果您的应用不能使用上述 API,而是让触摸事件直接通过其窗口传递,那么在 Android 12 中它们可能无法按预期传递到下层。这方面的例子包括但不仅限于以下示例:

如果您正在使用 FLAG_NOT_TOUCHABLE,那么您的应用可能会被影响,除非您的应用符合以下某个豁免条件:

如果您的使用场景并不包含于上述列表内,那么触摸事件将会被屏蔽。否则的话,如果您想阻止触摸事件传递,可以考虑删除 FLAG_NOT_TOUCHABLE 标志,而如果想让触摸事件穿透下去,可以调整您的代码来符合上述的几种情况之一。接下来我们会介绍必须要改变的一些常见模式的例子。

有着透明背景且无 UI 元素的窗口

在有着透明背景的窗口中展示某些 UI 的应用,可以在适当的时候在视图层面隐藏它们的 UI,同时添加 FLAG_NOT_TOUCHABLE 标志,这样用户就可以与下层的内容进行交互了。

image

如果像上图一样,应用仅仅是隐藏了 UI,要么是通过删除子视图的方法隐藏,或是改变它们的可见性 (visibility) 并添加 FLAG_NOT_TOUCHABLE 标志来允许用户与下层的视图进行交互,因为对下层其他应用的触摸事件会被屏蔽,所以这样的方法在 Android 12 上就不再起作用了 (注意与前面提到的豁免条件的区别,在这里我们改变的是内部视图,而不是窗口)。在这种情况下想解决此类问题,您可以:

每当您需要再次显示那个界面时,您只需要把上面的动作反过来设置即可。

不必要的大窗口

有时应用会想要显示一些小的 UI 界面,并同时允许用户同窗口下层的内容进行交互。在之前,应用可以通过简单地使用一个全屏窗口,并将其标记为 FLAG_NOT_TOUCHABLE 来实现,如图 1 所示:

image

请注意,在以前的操作系统版本中,通过实际的 UI 元素进行的触摸事件,在这种情况下会传递到下层的窗口中。在这种情况下,首先请查看一下 Toast API 是否能满足需求,不行的话,解决方案也很简单——在右侧的图片有说明: 您只需要将窗口的边界缩小到实际的 UI 大小,并使用 FLAG_NOT_TOUCH_MODAL,有时您也可能需要删除 FLAG_NOT_TOUCHABLE

这样,在您的 UI 外的触摸事件,将直接穿透到下层的窗口,不再被屏蔽。

半透明窗口

如果您使用了一个 TYPE_APPLICATION_OVERLAY 窗口,并需要在显示内容时允许触摸事件穿透下去,那您就必须降低窗口的不透明度,让用户能够合理地看到他们在窗口后所触摸的 UI 元素。

image

您必须在 窗口级别 上降低不透明度,仅仅改变视图的不透明度是不行的。您可以使用 LayoutParams.alpha 来降低不透明度,使其低于或者等于
InputManager.getMaximumObscuringOpacityForTouch() 的值,如右边的图片所示。这个值目前是 0.8,但是在 Android 12 最终版本发布前可能会改变。

现在,只要您应用内的多个窗口没有相互重叠,触摸事件就会穿透到下层的窗口。关于重叠窗口的更多细节,请查阅 FLAG_NOT_TOUCHABLE 文档。

无障碍服务

当使用 AccessibilityService (无障碍服务) 时,它可以创建 TYPE_ACCESSIBILITY_OVERLAY 类型的窗口,这些窗口是可信任的,因此可以免于前面所描述的一些限制。您只需要结合 AccessibilityService 的上下文,通过 getSystemService() 方法获得一个 WindowManager 来创建上述窗口。

如何测试您的应用是否受到影响

如果系统屏蔽了触摸操作,Logcat 会输出以下信息:

Untrusted touch due to occlusion by PACKAGE_NAME.

接下来

如果您想了解到更多关于不受信任的触摸事件以及它们的例外情况,请查阅相关文档:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352

推荐阅读更多精彩内容