Android12适配指北

通常我们说的适配一般指两个部分:
一个是影响在 Android 12 上运行的所有应用,无论采用哪种 targetSdkVersion 都不例外的部分
一个是只以Android12为目标的应用(targetSdkVersion为31)

下面说说第一个部分:

影响Android 12 上运行的所有应用的部分

一.Splash Screen

Android12新增了系统默认的App启动页,该启动页会使用App定义的主题和Icon生成。如果不进行适配产生的后果可能会有:
1.如果原本使用了android:windowBackground实现了启动页,那么这个实现会被默认的启动页样式替换
2.如果使用了一个额外的Activity作为启动页则会先弹出默认的启动页再弹出这个额外的Activity,用户会看到两次闪屏。

默认情况下,SplashScreen 使用主题的 windowBackground(如果它是单色)和启动器图标。启动画面的自定义通过向应用主题添加属性来完成。

自定义应用中的启动画面

1.设置主题属性以更改其外观
  • 设置背景
// An highlighted block
<item name="android:windowSplashScreenBackground">@color/xxx
</item>
  • 替换中心部位的图标,如果使用 AnimationDrawable 和 AnimatedVectorDrawable 可呈现动画效果且可绘制,则也会在显示起始窗口的同时播放动画。
<item name="android:windowSplashScreenAnimatedIcon">@drawable/...</item>
  • 使用 windowSplashScreenAnimationDuration 设置启动画面在关闭之前显示的时长。最长时间为 1000 毫秒。

当应用绘制第一帧后,启动画面会立即关闭。如果需要延迟关闭,可以使用 ViewTreeObserver.OnPreDrawListener 让应用暂停绘制第一帧。

二.麦克风和摄像头切换开关

在 Android 12 中,部分设备允许用户通过按一个切换开关选项,为设备上的所有应用启用和停用摄像头和麦克风使用权限。该开关不影响应用处理 CAMERA 和 RECORD_AUDIO 权限的方式。

摄像头和麦克风切换开关会影响设备上的所有应用:

  • 当用户关闭摄像头使用权限后,应用会收到空白的摄像头画面。
  • 当用户关闭麦克风使用权限后,应用会收到无声音频。

检查设备是否支持麦克风和摄像头切换开关

SensorPrivacyManager sensorPrivacyManager = getApplicationContext()
        .getSystemService(SensorPrivacyManager.class);
boolean supportsMicrophoneToggle = sensorPrivacyManager
        .supportsSensorToggle(Sensors.MICROPHONE);
boolean supportsCameraToggle = sensorPrivacyManager
        .supportsSensorToggle(Sensors.CAMERA);

三.Display.getRealSize() & Display.getRealMetrics()废弃

Android 12 上进一步废弃了 Display.getRealMetrics() 和Display.getRealSize()。现在推荐使用 WindowMetrics, 并且谷歌提供了一个兼容到 Android 4.0 的 WindowManager 兼容库。通常情况可以使用如下代码代替以前计算屏幕宽高:

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R) {
     metrics = activity.getWindowManager().getCurrentWindowMetrics();
     int width = metrics.getBounds().width();
     int height = metrics.getBounds().height();
 }

四.应用无法关闭系统对话框

为了加强用户与应用和系统互动时的控制,从 Android 12 开始,弃用了 ACTION_CLOSE_SYSTEM_DIALOGS intent 操作。除了一些特殊情况之外,当应用尝试调用包含此操作的 intent 时,系统会基于应用的目标 SDK 版本执行以下操作之一:

  • 如果应用以 Android 12 为目标平台,则会发生 SecurityException。

  • 如果应用以 Android 11(API 级别 30)或更低版本为目标平台,则系统不会执行 intent

五.大致位置

应用以 Android 12 为目标平台并且请求 ACCESS_FINE_LOCATION 权限,还须请求 ACCESS_COARSE_LOCATION 权限。必须在单个运行时请求中包含这两项权限。如果仅请求 ACCESS_FINE_LOCATION,则系统会忽略该请求,并在 Logcat 中记录以下错误消息:ACCESS_FINE_LOCATION must be requested with ACCESS_COARSE_LOCATION

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值