Android 13 新特性及适配指南
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调整:
废弃setAppCacheEnabled
与setForceDark
方法;
(若设置 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_IAMGES
、READ_MEDIA_VIDEO
、READ_MEDIA_AUDIO
替代
原有的READ_EXTERNAL_STORAGE
权限。
权限 | 权限说明 |
---|---|
READ_MEDIA_IAMGES | 图片权限 |
READ_MEDIA_VIDEO | 视频权限 |
READ_MEDIA_AUDIO | 音频权限 |
当应用升级到targetSdk>=33
时:
- 已授权
READ_EXTERNAL_STORAGE
权限的应用:系统将自动赋予对应的细化权限。 - 未授权仍请求
READ_EXTERNAL_STORAGE
权限:亲测系统将不会授予任何权限。
细分媒体权限动态申请弹窗样式:
- 如果同时请求
READ_MEDIA_IMAGES
和READ_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
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 新特性及适配指南的更多相关文章
- Android12 新特性及适配指南
Android 12(API 31)于2021年10月4日正式发布,正式版源代码也于当日被推送到AOSP Android开源项目.截止到笔者撰写这篇文章时,国内各终端厂商的在售Android设备,已经 ...
- 腾讯云安全:开发者必看|Android 8.0 新特性及开发指南
欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 背景介绍 谷歌2017 I/O开发者大会今年将于5月17-19日在美国加州举办.大会将跟往年一样发布最新的 A ...
- 开发者必看|Android 8.0 新特性及开发指南
背景介绍 谷歌2017 I/O开发者大会今年将于5月17-19日在美国加州举办.大会将跟往年一样发布最新的 Android 系统,今年为 Android 8.0.谷歌在今年3 月21日发布 Andro ...
- Android O新特性和行为变更总结zz
https://mp.weixin.qq.com/s/Ezfm-Xaz3fzsaSm0TU5LMw Android O 行为变更https://developer.android.google.cn/ ...
- Android N 新特性
2016年5月19日,谷歌在美国加州的山景城举办了 Google I/O 开发者大会中发布.2016年6月,Android N正式命名为“牛轧糖” 本届I/O开发者大会上,Google重点介绍了And ...
- Angular4.0.0正式发布,附新特性及升级指南
本文首发地址:Angular4.0.0正式发布,附新特性及升级指南 作者|孙薇 编辑|尾尾 经历了6个RC版本之后,Angular项目组终于发布了新版,即正式版 Angular 4.0.0.新版的 A ...
- 可能是最早的学习Android N新特性的文章
可能是最早的学习Android N新特性的文章 Google在今天放出了Android N开发者预览版.Android N支持Nexus6及以上的设备.5太子Nexus5不再得到更新. Android ...
- 转:iOS9的新特性以及适配方案
2015年9月8日,苹果宣布iOS 9操作系统的正式版在太平洋时间9月16日正式推出,北京时间9月17日凌晨1点推送. 新的iOS 9系统比iOS8更稳定,功能更全面,而且还更加开放.iOS 9加入了 ...
- iOS9的新特性以及适配方案-----转载
2015年9月8日,苹果宣布iOS 9操作系统的正式版在太平洋时间9月16日正式推出,北京时间9月17日凌晨1点推送. 新的iOS 9系统比iOS8更稳定,功能更全面,而且还更加开放.iOS 9加入了 ...
随机推荐
- Angular 新建项目错误:The Schematic workflow failed. See above
记录踩坑填坑,有不正之处请指出 错误 解决方法1 npm config set registry https://registry.npmjs.org/ 也可使用淘宝镜像 npm config set ...
- LuoguP5390 [Cnoi2019]数学作业(数论)
转进制,然后发现贡献只有\(1_{(2)}\),取奇数个的子集方案是\(2^{n-1}\) #include <iostream> #include <cstdio> #inc ...
- 手把手教你分析MySQL查询性能瓶颈,包教包会
当一条SQL执行较慢,需要分析性能瓶颈,到底慢在哪? 我们一般会使用Explain查看其执行计划,从执行计划中得知这条SQL有没有使用索引?使用了哪个索引? 但是执行计划显示内容不够详细,如果显示用到 ...
- 它把RabbitMQ的复杂全屏蔽了,我朋友用它后被老板一夜提拔为.NET架构师
本文技术源自外企,并已在多个世界500强大型项目开发中运用. 本文适合有初/中级.NET知识的同学阅读.(支持.NET/.NET Framework/.NET Core) RabbitMQ作为一款主流 ...
- 基于vue的脚手架开发与发布到npm仓库
什么是脚手架 在项目比较多而且杂的环境下,有时候我们想统一一下各个项目技术栈或者一些插件/组件的封装习惯,但是每次从零开发一个新项目的时候,总是会重复做一些类似于复制粘贴的工作,这是一个很头疼的事情, ...
- window环境导入odbc数据源
<ODBC指南>中只介绍了window环境如何配置odbc数据源,但是没有介绍如何导入数据源驱动,这里做个补充. 在没有导入数据源驱动之前,按照文档操作是查不到kingbaseES的odb ...
- KingbaseES 两表关联Update的两种写法与性能
熟悉oracle 的人都知道,对于两表的关联更新,其执行计划主要有 Filter 和 Outer Join 两种方式.对于大批量数据的update,Join方式明显是更优的选择.KingbaseES ...
- filebeat客户端传输cisco日志到elasticsearch
一.安装相应版本的filebeat wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.5.2-x86_64.r ...
- kubeadm使用外部etcd部署kubernetes v1.17.3 高可用集群
文章转载自:https://mp.weixin.qq.com/s?__biz=MzI1MDgwNzQ1MQ==&mid=2247483891&idx=1&sn=17dcd7cd ...
- Elasticsearch:如何把Elasticsearch中的数据导出为CSV格式的文件
本教程向您展示如何将数据从Elasticsearch导出到CSV文件. 想象一下,您想要在Excel中打开一些Elasticsearch中的数据,并根据这些数据创建数据透视表. 这只是一个用例,其中将 ...