应用启动画面

造成影响

简单讲,就是从Android 12开始,所有的App在每次启动时(特指冷启动与温启动),系统都会为我们加上一个默认的启动画面,如下所示:

Android-12适配-行为变更:所有应用_android

该启动画面主要由以下4个元素组成,分别为:

Android-12适配-行为变更:所有应用_App_02

(1) 应用图标:可以是静态或动画形式。默认情况下,使用Launcher图标。

(2) 图标背景:可选,在图标与窗口背景之间需要更高的对比度时很有用。

(3) 前景遮罩:可选,前景的 ⅓ 将被遮盖。

(4) 窗口背景:不透明的单色,默认是所设置主题的windowBackground。

虽然这个启动画面允许我们一定程度的自定义,但总体都无法跳脱出以上4个元素,且无法去除。如果不做任何处理,加上我们原有的闪屏页和广告页,视觉上会有多个启动画面

适配方案

方案1(懒人专用):设置除窗口背景之外的元素都为透明

处理后的效果就是,在启动时会先显示由所设置主题的windowBackground指定的纯色背景,即与大多数开发者之前为了解决启动黑屏/白屏问题所采用的方法一致。

Android-12适配-行为变更:所有应用_Android_03

方案2(常规做法):改用SplashScreen API定制系统启动画面

缺点就是可定制程度低,可能无法满足产品的需求;

如果总体的效果可以接受,那么接下来要处理的就是对原有闪屏页的取舍,以及与原有广告页的画面衔接了。

但如开头所言,我们的目标是将改动最小化,那么,原有闪屏页该干嘛还是让它干嘛,初始化也好,路由也罢,逻辑不变,要求只是不再显示而已。

具体做法如下:

  1. 添加 SplashScreen compat 库

Android-12适配-行为变更:所有应用_App_04

  1. 在闪屏页调用 SplashScreen#setKeepOnScreenCondition{ true } 使得默认的启动画面持续覆盖原有的闪屏页,直到广告页开始显现时,才调用SplashScreen#setKeepOnScreenCondition{ false } 让页面重新显示,以此实现平稳过渡

Android-12适配-行为变更:所有应用_android_05

Android-12适配-行为变更:所有应用_Android_06

麦克风和摄像头切换开关

造成影响

简单讲,就是从Android 12开始,用户可以通过状态栏下拉菜单中两个新增的切换开关选项,一键启用/停用摄像头和麦克风使用权限。

Android-12适配-行为变更:所有应用_android_07

请注意,这里的「使用权限」针对的是设备上的所有App,是全局的,不要和Android 6.0的「运行时权限」混淆。

而两者在具体表现上也有所不同,在实际操作中:

  • 当关闭摄像头使用权限后,画面录制将继续进行,但只会收到空白画面
  • 当关闭麦克风使用权限后,声音录制将继续进行,但只会收到无声视频

适配方案

尽管官网上提供了检查设备是否支持麦克风和摄像头切换开关的API,也就是检查状态栏下拉菜单是否有这两个开关选项,然而这对于我们实际的适配工作几乎没有什么卵用:

Android-12适配-行为变更:所有应用_启动画面_08

SensorPrivacyManager类倒是有提供检查指定切换开关是否开启的API,但由于是系统权限,因此即使是通过反射形式也无法调用:

Android-12适配-行为变更:所有应用_android_09

所幸的是,如果用户主动关闭了摄像头或麦克风的使用权限,那么当下次App再需要启动摄像头或麦克风时,系统就会提醒用户,相关硬件的使用权限已关闭,并申请重新开启:

Android-12适配-行为变更:所有应用_Android_10

因此,对于此行为变更的适配,我们要做的,就是验证在用户主动关闭了摄像头或麦克风使用权限后,App的相关功能是否受影响,至于监听/提示/重新开启的工作则交给系统帮我们完成即可。

大致位置

造成影响

做过定位功能的Android开发者都知道,Android提供了两种不同精确度的位置权限,分别是:

  • ACCESS_COARSE_LOCATION(大致位置)
    提供设备位置的估算值,将范围限定在大约 1.6 公里(1 英里)内
  • ACCESS_FINE_LOCATION(确切位置)
    通常将范围限定在大约 50 米(160 英尺)内,有时精确到几米(10 英尺)范围以内

而在以Android 12为目标平台的App上,当App尝试请求ACCESS_FINE_LOCATION权限时,系统权限对话框会提供两个选项,即允许App获取确切位置,还是仅允许获取大致位置。

并且如果您的应用请求 ACCESS_FINE_LOCATION运行时权限,您还应请求 ACCESS_COARSE_LOCATION 权限,以便处理用户授予应用大致位置访问权限的情形。您应该在单个运行时请求中包含这两项权限。

Android-12适配-行为变更:所有应用_Android_11

也即是说,给了用户拒绝提供确切位置的权力,一旦用户拒绝,这种情况下App就只能获取到大致位置了。

适配方案

虽然用户可能拒绝提供确切位置,但我们依旧可以再次请求升级到确切位置:

Android-12适配-行为变更:所有应用_启动画面_12

当然,在再次请求前提供一个适当的解释说明是一个比较好的做法,App本身也要做好只能获取到大致位置时的业务降级处理。

结语

还有许多的行为变更,以上我只选了几条重要的,其他变更及更详细的文档可以参见:
Android 12行为变更:所有应用

以上只是针对在 Android 12 上运行的所有应用应为变更,此外,请务必查看:
Android 12适配-行为变更:以 Android 12 为目标平台的应用

参考

Android 12行为变更:所有应用