赞
踩
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 细分媒体权限:
行为变更:以 Android 13 或更高版本为目标平台的应用 | Android 开发者 | Android Developers
从Android 13开始,以Android13(API 33+)为目标平台的应用,WebView存在以下方法与API调整:
WebView 95+版本不再支持 setAppCacheEnabled
从Android 13开始以Android13(API 33+)为目标平台的应用,系统会根据应用的主题属性isLightTheme,自动设置WebView的浅色或深色主题样式(系统会根据 isLightTheme 来设置 prefers-color-scheme)。同时,开发者Webview设置主题样式相关API WebSettings.setForceDark() 方法将被废弃。
基于以上更改:
W/cr_WebSettings: setForceDark() is a no-op in an app with targetSdkVersion>=T
官方参考:
Android Developer 静态广播注册官方介绍:
行为变更:以 Android 13 或更高版本为目标平台的应用 | Android 开发者 | Android Developers
从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 静态广播注册官方介绍:
功能和 API 概览 | Android 开发者 | Android Developers
Android 13 引入了一种新的运行时通知权限:POST_NOTIFICATIONS
。POST_NOTIFICATIONS
权限级别被定义为dangerous
开发者使用该权限时需动态申请
,等待用户主动授权:
Android13(API 33+)为目标平台的应用
: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 通知运行时权限官方介绍:
通知运行时权限 | Android 开发者 | Android Developers
从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:
Manifest.permission | Android Developers
从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:
Manifest.permission | Android Developers
官方从 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
以上截图中,blacklist、greylist、greylist-max-o、greylist-max-p含义如下:
官方参考:
Android Developer 非SDK接口限制:
针对非 SDK 接口的限制 | Android 开发者 | Android Developers
从Android 13(API 33)开始,Android通知栏中新增了一项新特性
:
用户可以选择在通知栏中通过“前台服务管理器
”,对“正在运行的前台服务
”进行停止操作。
Android Developer:Andoid13
Android 13 | Android 开发者 | Android Developers
AOSP:Android13版本说明
Android 13 版本说明 | Android 开源项目 | Android Open Source Project
GoogleSource:Android13_r3
https://android.googlesource.com/platform/build/+/refs/tags/android-13.0.0_r4
————————————————
版权声明:本文为CSDN博主「A HandSome Man」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/as425017946/article/details/127530660
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。