美文网首页Android开发Android开发经验谈Android
Android 12适配-行为变更:所有应用

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

作者: GameProgramer | 来源:发表于2022-06-30 15:44 被阅读0次

    应用启动画面

    造成影响

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

    image

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

    image

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

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

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

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

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

    适配方案

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

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

    image

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

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

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

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

    具体做法如下:

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

    麦克风和摄像头切换开关

    造成影响

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

    image

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

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

    • 当关闭摄像头使用权限后,画面录制将继续进行,但只会收到空白画面

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

    适配方案

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

    image

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

    image

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

    image

    因此,对于此行为变更的适配,我们要做的,就是验证在用户主动关闭了摄像头或麦克风使用权限后,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 权限,以便处理用户授予应用大致位置访问权限的情形。您应该在单个运行时请求中包含这两项权限。

    image

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

    适配方案

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

    image

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

    结语

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

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

    参考

    Android 12行为变更:所有应用

    相关文章

      网友评论

        本文标题:Android 12适配-行为变更:所有应用

        本文链接:https://www.haomeiwen.com/subject/mmwfbrtx.html