Android 13(API 33)2022年8月15日 正式发布(发布时间较往年早了一些),正式版Release源代码也于当日被推送到AOSP Android开源项目。



截止到笔者撰写这篇文章时,国内部分应用软件开发厂商已逐步接到手机厂商(华米OV等)的新版本适配要求。当前,对于Android应用开发者来说,Android 13 的软件兼容适配已需提上工作日程。

为了贴合这篇文章的标题,本篇文章结合Android Developer官方文档,围绕Android13适配点Android13新特性两个方面进行详细说明。

适配点:

  • 细分媒体权限:

    READ_EXTERNAL_STORAGE 细分为IAMGES、VIDEO、AUDIO权限

    若设置 targetSdk>=33 则此项必需适配!
  • WebView调整:

    废弃setAppCacheEnabledsetForceDark方法;

    若设置 targetSdk>=33 则此项必需适配!
  • 静态广播注册:

    注册静态广播时,需设置对其他应用的可见性

    若设置 targetSdk>=33 则此项必需适配!
  • 通知权限:

    新增运行时通知权限:POST_NOTIFICATIONS

    若设置 targetSdk>=33 则此项必需适配!
  • Wi-Fi :

    新增 NEARBY_WIFI_DEVICES 运行时权限

    若设置 targetSdk>=33 则此项必需适配!
  • 身体传感器后台权限:

    新增 BODY_SENSORS_BACKGROUND 运行时权限

    若设置 targetSdk>=33 则此项必需适配!
  • 剪切板内容隐藏:

    新增内容隐藏API

    根据业务需求,选择性适配!
  • 非 SDK 接口的限制

    若设置 targetSdk>=33 则此项必需适配!

新特性:

  • 前台服务管理器:

    系统新增前台服务管理器

    系统新特性无需适配!

一、细分媒体权限

从Android 13开始,以Android13(API 33+)为目标平台的应用,系统新增运行时权限READ_MEDIA_IAMGESREAD_MEDIA_VIDEOREAD_MEDIA_AUDIO 替代原有的READ_EXTERNAL_STORAGE权限。

权限 权限说明
READ_MEDIA_IAMGES 图片权限
READ_MEDIA_VIDEO 视频权限
READ_MEDIA_AUDIO 音频权限

当应用升级到targetSdk>=33时:

  • 已授权READ_EXTERNAL_STORAGE权限的应用:系统将自动赋予对应的细化权限。
  • 未授权仍请求READ_EXTERNAL_STORAGE权限:亲测系统将不会授予任何权限。

细分媒体权限动态申请弹窗样式:

  • 如果同时请求 READ_MEDIA_IMAGESREAD_MEDIA_VIDEO 权限,系统将会提示如下权限弹窗:

  • 如果请求 READ_MEDIA_AUDIO 权限,系统将提示如下弹窗:

官方参考:

Android Developer 细分媒体权限:

https://developer.android.google.cn/about/versions/13/behavior-changes-13

二、WebView

从Android 13开始,以Android13(API 33+)为目标平台的应用,WebView存在以下方法与API调整:

  • WebSettings.setAppCacheEnabled() 方法废弃
  • WebSettings.setForceDark() 方法废弃

2.1 setAppCacheEnabled 废弃

WebView 95+版本不再支持 setAppCacheEnabled

Chrome 85+版本不再支持AppCache

2.2 setForceDark 废弃

从Android 13开始以Android13(API 33+)为目标平台的应用,系统会根据应用的主题属性isLightTheme,自动设置WebView的浅色或深色主题样式(系统会根据 isLightTheme 来设置 prefers-color-scheme)。同时,开发者Webview设置主题样式相关API WebSettings.setForceDark() 方法将被废弃。

基于以上更改:

  • 若开发者仍需自定义Webview主题颜色,可以使用:

    WebSettings.setAlgorithmicDarkeningAllowed()WebSettingsCompat.setAlgorithmicDarkeningAllowed()方法。
  • 若开发者仍然使用WebSettings.setForceDark()系统将提示错误:
W/cr_WebSettings: setForceDark() is a no-op in an app with targetSdkVersion>=T

官方参考:

Android Developer 静态广播注册官方介绍:

https://developer.android.google.cn/about/versions/13/behavior-changes-13

三、静态广播注册

从Android 13开始,以Android13(API 33+)为目标平台的应用,注册静态广播时,需设置对其他应用的可见性

  • 若对其他应用可见,广播注册时设置:Context.RECEIVER_EXPORTED
  • 若仅应用内使用,广播注册时设置:Context.RECEIVER_NOT_EXPORTED
private void registerTestReceiver() {
IntentFilter filter = new IntentFilter();
filter.addAction("com.xiaxl.test.action");
// api >= 33
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
// 跨应用间使用
MainActivity.this.registerReceiver(mTestReceiver, filter, Context.RECEIVER_EXPORTED);
// 应用内使用
//MainActivity.this.registerReceiver(mTestReceiver, filter, Context.RECEIVER_EXPORTED);
}
// api <= 32
else {
MainActivity.this.registerReceiver(mTestReceiver, filter);
}
}

官方参考:

Android Developer 静态广播注册官方介绍:

https://developer.android.google.cn/about/versions/13/features#java

四、通知权限

Android 13 引入了一种新的运行时通知权限:POST_NOTIFICATIONS

POST_NOTIFICATIONS 权限级别被定义为dangerous 开发者使用该权限时需动态申请,等待用户主动授权:

  • 对于以Android13(API 33+)为目标平台的应用

    在显示Android通知栏时,一方面需要在AndroidManifest中声明 android.permission.POST_NOTIFICATION,另一方面代码中需动态申请该通知栏权限。
<!-- AndroidManifest权限声明 -->
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.xiaxl.test"> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
</manifest> // Java代码动态申请POST_NOTIFICATIONS权限
if (Build.VERSION.SDK_INT >= 33) {
int checkPermission =
ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.POST_NOTIFICATIONS);
if (checkPermission != PackageManager.PERMISSION_GRANTED) {
//动态申请
ActivityCompat.requestPermissions(MainActivity.this, new String[]{
Manifest.permission.POST_NOTIFICATIONS}, PERMISSION_REQUEST_CODE);
} else {
//showRecordNotification();
}
} else {
//showRecordNotification();
}

POST_NOTIFICATIONS 动态授权申请弹窗如下图所示:

  • 对于以Android12(API 32-)为目标平台的应用

    对于以API 32-为目标平台的应用,运行在Android13及以上设备中时,当应用第一次显示通知时,系统会自动弹出以下提示框,要求用户动态授权

官方参考:

Android Developer 通知运行时权限官方介绍:

https://developer.android.google.cn/guide/topics/ui/notifiers/notification-permission

五、Wi-Fi 权限

从Android 13开始,Android系统新增了NEARBY_WIFI_DEVICES权限,将原有的ACCESS_FINE_LOCATION权限 与 Wi-Fi能力使用进行了区分(避免早先开发者使用Wi-Fi能力时,需要请求用户位置权限,从而引起用户的歧义)。

从Android 13开始,开发者只要不通过Wi-Fi推导用户的物理位置将无需再请求 ACCESS_FINE_LOCATION 权限,同时官方总结了新增权限NEARBY_WIFI_DEVICES的如下使用场景:

官方参考:

Android Developer NEARBY_WIFI_DEVICES:

https://developer.android.google.cn/reference/android/Manifest.permission#NEARBY_WIFI_DEVICES

六、剪切板内容隐藏

从Android 13(API 33)开始,Android剪切板新增了一项新API

Android 13(API 33)开始,用户可以选择使用API PersistableBundle#(ClipDescription.EXTRA_IS_SENSITIVE, true)隐藏要复制到剪切板的用户账户、密码登敏感信息。

相关API使用举例如下:

private void addData2Clipboard() {
ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clipData = ClipData.newPlainText("111111", "我是密码");
ClipDescription description = clipData.getDescription();
// 隐私内容:剪切板加密
PersistableBundle persistableBundle = new PersistableBundle();
if (Build.VERSION.SDK_INT >= 33) {
persistableBundle.putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true);
} else {
persistableBundle.putBoolean("android.content.extra.IS_SENSITIVE", true);
}
description.setExtras(persistableBundle);
// 剪切板添加加密内容
clipboardManager.setPrimaryClip(clipData);
}

不使用新API使用新API隐藏敏感信息,剪切板前后对比如下所示:

七、身体传感器后台权限

从Android 13开始,以Android13(API 33+)为目标平台的应用,在后台访问身体传感器(例如心率、体温和血氧饱和度)时,除了需要请求现有的 BODY_SENSORS 权限外,还需要请求 BODY_SENSORS_BACKGROUND 权限。

官方参考:

Android Developer BODY_SENSORS_BACKGROUND:

https://developer.android.google.cn/reference/android/Manifest.permission#BODY_SENSORS_BACKGROUND

八、非 SDK 接口限制

官方从 Android 9(API 级别 28)开始,逐步开始对应用使用的非 SDK 接口实施了限制。

如果你的APP通过引用非 SDK 接口或尝试使用反射或 JNI 来获取句柄,这些限制就会起作用。官方给出的解释是为了提升用户体验、降低应用崩溃风险

8.1、非SDK接口检测工具

官方给出了一个检测工具,下载地址:veridex

https://android.googlesource.com/platform/prebuilts/runtime/+archive/master/appcompat.tar.gz

veridex使用方法:

appcompat.sh --dex-file=apk.apk

8.2、blacklist、greylist、greylist-max-o、greylist-max-p含义

以上截图中,blacklist、greylist、greylist-max-o、greylist-max-p含义如下:

  • blacklist 黑名单:禁止使用的非SDK接口,运行时直接Crash(因此必须解决)
  • greylist 灰名单:即当前版本仍能使用的非SDK接口,但在下一版本中可能变成被限制的非SDK接口
  • greylist-max-o: 在targetSDK<=O中能使用,但是在targetSDK>=P中被禁止使用的非SDK接口
  • greylist-max-p: 在targetSDK<=P中能使用,但是在targetSDK>=Q中被禁止使用的非SDK接口

官方参考:

Android Developer 非SDK接口限制:

https://developer.android.google.cn/guide/app-compatibility/restrictions-non-sdk-interfaces#test-for-non-sdk

九、前台服务管理器

从Android 13(API 33)开始,Android通知栏中新增了一项新特性

用户可以选择在通知栏中通过“前台服务管理器”,对“正在运行的前台服务”进行停止操作。

参考

Android Developer:Andoid13

https://developer.android.google.cn/about/versions/13

AOSP:Android13版本说明

https://source.android.google.cn/docs/setup/start/android-13-release

GoogleSource:Android13_r3

https://android.googlesource.com/platform/build/+/refs/tags/android-13.0.0_r4

= THE END =

文章首发于公众号”CODING技术小馆“,如果文章对您有帮助,欢迎关注我的公众号。

Android 13 新特性及适配指南的更多相关文章

  1. Android12 新特性及适配指南

    Android 12(API 31)于2021年10月4日正式发布,正式版源代码也于当日被推送到AOSP Android开源项目.截止到笔者撰写这篇文章时,国内各终端厂商的在售Android设备,已经 ...

  2. 腾讯云安全:开发者必看|Android 8.0 新特性及开发指南

    欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 背景介绍 谷歌2017 I/O开发者大会今年将于5月17-19日在美国加州举办.大会将跟往年一样发布最新的 A ...

  3. 开发者必看|Android 8.0 新特性及开发指南

    背景介绍 谷歌2017 I/O开发者大会今年将于5月17-19日在美国加州举办.大会将跟往年一样发布最新的 Android 系统,今年为 Android 8.0.谷歌在今年3 月21日发布 Andro ...

  4. Android O新特性和行为变更总结zz

    https://mp.weixin.qq.com/s/Ezfm-Xaz3fzsaSm0TU5LMw Android O 行为变更https://developer.android.google.cn/ ...

  5. Android N 新特性

    2016年5月19日,谷歌在美国加州的山景城举办了 Google I/O 开发者大会中发布.2016年6月,Android N正式命名为“牛轧糖” 本届I/O开发者大会上,Google重点介绍了And ...

  6. Angular4.0.0正式发布,附新特性及升级指南

    本文首发地址:Angular4.0.0正式发布,附新特性及升级指南 作者|孙薇 编辑|尾尾 经历了6个RC版本之后,Angular项目组终于发布了新版,即正式版 Angular 4.0.0.新版的 A ...

  7. 可能是最早的学习Android N新特性的文章

    可能是最早的学习Android N新特性的文章 Google在今天放出了Android N开发者预览版.Android N支持Nexus6及以上的设备.5太子Nexus5不再得到更新. Android ...

  8. 转:iOS9的新特性以及适配方案

    2015年9月8日,苹果宣布iOS 9操作系统的正式版在太平洋时间9月16日正式推出,北京时间9月17日凌晨1点推送. 新的iOS 9系统比iOS8更稳定,功能更全面,而且还更加开放.iOS 9加入了 ...

  9. iOS9的新特性以及适配方案-----转载

    2015年9月8日,苹果宣布iOS 9操作系统的正式版在太平洋时间9月16日正式推出,北京时间9月17日凌晨1点推送. 新的iOS 9系统比iOS8更稳定,功能更全面,而且还更加开放.iOS 9加入了 ...

随机推荐

  1. 关于mybatis-plus出现Not Found TableInfoCache. 的解决方法

    查看自己的pom里面是不是导入了多个mybatis相关,若是的话就全部删去,然后添加如下代码段即可 <dependency> <groupId>com.baomidou< ...

  2. Luogu2290 [HNOI2004]树的计数 (组合计数,prufer编码)

    这不prufer编码吗,防爆long long就行了啊 #include <iostream> #include <cstdio> #include <cstring&g ...

  3. 【游记】CSP 2021 J2

    这次是第一次参加CSP的复赛,所以考的就很LJ. \(DAY-\infty\) 到 \(DAY-14\) 知道了自己苟过了初赛,像个SB一样. (我初赛66分,旁边那位63.5,cao着线过去的) \ ...

  4. 使用二手 gopro 做行车记录仪

    背景 自打开了博客以后,一直在写技术说明文,今天打算写点程序以外的东西换换味口.前段时间在某鱼上以 300 元的价格入手了一套完整的 gopro3+ 运动摄像头,带一张 32G SD 卡,两块备用电池 ...

  5. Jmeter工具使用总结

    Jmeter工具使用总结 目录 Jmeter函数总结 第一章 前言 第二章 常用函数的介绍 2.1. timeShift函数 2.2. time函数 2.3. groovy函数 第三章 常用用法 3. ...

  6. KingbaseES R6 集群 recovery 参数对切换的影响

    案例说明:在KingbaseES R6集群中,主库节点出现宕机(如重启或关机),会产生主备切换,但是当主库节点系统恢复正常后,如何对原主库节点进行处理,保证集群数据的一致性和安全,可以通过对repmg ...

  7. SDUT 2022 Autumn Team Contest 7th

    1.J题:给你T组数据,每一组数据给你一个区间,让你求这个区间的范围,区间的起始时间和终止时间可能被包含或重复 思路:思路的话,就是直接把给定的两个区间的之间的数包括端点存到vector去重,然后直接 ...

  8. FileInputStream字节输入流

    FileInputStream字节输入流 编码思想:首相顶一个FileInputStream字节输入流对象,fis设置为nul,在try/catch里面放入FileInputStream字节输入流对象 ...

  9. kibana启动停止命令

    前提条件:kibana文件是属于kibana用户的 注意:路径根据具体实际情况修改 更改日志所属用户和用户组 chown kibana:kibana /usr/local/kibana-7.5.1-l ...

  10. 关于Elasticsearch使用java的说明

    从Elastic 7.0开始,我们可以不安装JAVA.安装包包含一个相匹配的JAVA版本在里面. Elasticsearch包含来自JDK维护者(GPLv2 + CE)的捆绑版OpenJDK. 要使用 ...