Android 13 新特性及适配指南

Android 13 新特性及适配指南

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

Android 13 新特性及适配指南
截止到笔者撰写这篇文章时,国内部分应用软件开发厂商已逐步接到手机厂商(华米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 音频权限

Android 13 新特性及适配指南

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

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

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

  • 如果同时请求 READ_MEDIA_IMAGESREAD_MEDIA_VIDEO 权限,系统将会提示如下权限弹窗:
    Android 13 新特性及适配指南
  • 如果请求 READ_MEDIA_AUDIO 权限,系统将提示如下弹窗:
    Android 13 新特性及适配指南

官方参考:
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

Android 13 新特性及适配指南

Chrome 85+版本不再支持 AppCache;

Android 13 新特性及适配指南

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); } < code></=>

官方参考:
Android Developer 静态广播注册官方介绍:
https://developer.android.google.cn/about/versions/13/features#java

四、通知权限

Android 13 引入了一种新的运行时通知权限: POST_NOTIFICATIONS
POST_NOTIFICATIONS 权限级别被定义为 dangerous 开发者使用该权限时需 &#x52A8;&#x6001;&#x7533;&#x8BF7;,等待用户主动授权:

Android 13 新特性及适配指南
  • 对于以 Android13&#xFF08;API 33+&#xFF09;&#x4E3A;&#x76EE;&#x6807;&#x5E73;&#x53F0;&#x7684;&#x5E94;&#x7528;
    在显示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">
</uses-permission></manifest>

// Java&#x4EE3;&#x7801;&#x52A8;&#x6001;&#x7533;&#x8BF7;POST_NOTIFICATIONS&#x6743;&#x9650;
if (Build.VERSION.SDK_INT >= 33) {
    int checkPermission =
            ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.POST_NOTIFICATIONS);
    if (checkPermission != PackageManager.PERMISSION_GRANTED) {
        //&#x52A8;&#x6001;&#x7533;&#x8BF7;
        ActivityCompat.requestPermissions(MainActivity.this, new String[]{
                Manifest.permission.POST_NOTIFICATIONS}, PERMISSION_REQUEST_CODE);
    } else {
        //showRecordNotification();
    }
} else {
    //showRecordNotification();
}

POST_NOTIFICATIONS &#x52A8;&#x6001;&#x6388;&#x6743;&#x7533;&#x8BF7;&#x5F39;&#x7A97;如下图所示:

Android 13 新特性及适配指南
  • 对于以 Android12&#xFF08;API 32-&#xFF09;&#x4E3A;&#x76EE;&#x6807;&#x5E73;&#x53F0;&#x7684;&#x5E94;&#x7528;
    对于以 API 32-为目标平台的应用,运行在Android13及以上设备中时,当 &#x5E94;&#x7528;&#x7B2C;&#x4E00;&#x6B21;&#x663E;&#x793A;&#x901A;&#x77E5;&#x65F6;&#xFF0C;&#x7CFB;&#x7EDF;&#x4F1A;&#x81EA;&#x52A8;&#x5F39;&#x51FA;&#x4EE5;&#x4E0B;&#x63D0;&#x793A;&#x6846;&#xFF0C;&#x8981;&#x6C42;&#x7528;&#x6237;&#x52A8;&#x6001;&#x6388;&#x6743;

Android 13 新特性及适配指南

官方参考:
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&#x80FD;&#x529B;&#x4F7F;&#x7528;进行了区分(避免早先开发者使用Wi-Fi能力时,需要请求用户位置权限,从而引起用户的歧义)。

Android 13 新特性及适配指南

从Android 13开始,开发者只要 &#x4E0D;&#x901A;&#x8FC7;Wi-Fi&#x63A8;&#x5BFC;&#x7528;&#x6237;&#x7684;&#x7269;&#x7406;&#x4F4D;&#x7F6E;将无需再请求 ACCESS_FINE_LOCATION 权限,同时官方总结了新增权限 NEARBY_WIFI_DEVICES的如下使用场景:

Android 13 新特性及适配指南

官方参考:
Android Developer NEARBY_WIFI_DEVICES:
https://developer.android.google.cn/reference/android/Manifest.permission#NEARBY_WIFI_DEVICES

六、剪切板内容隐藏

从Android 13(API 33)开始,Android剪切板新增了一项 &#x65B0;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", "&#x6211;&#x662F;&#x5BC6;&#x7801;");
    ClipDescription description = clipData.getDescription();
    // &#x9690;&#x79C1;&#x5185;&#x5BB9;&#xFF1A;&#x526A;&#x5207;&#x677F;&#x52A0;&#x5BC6;
    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);
    // &#x526A;&#x5207;&#x677F;&#x6DFB;&#x52A0;&#x52A0;&#x5BC6;&#x5185;&#x5BB9;
    clipboardManager.setPrimaryClip(clipData);
}

&#x4E0D;&#x4F7F;&#x7528;&#x65B0;API&#x4F7F;&#x7528;&#x65B0;API隐藏敏感信息,剪切板前后对比如下所示:

Android 13 新特性及适配指南

七、身体传感器后台权限

从Android 13开始, &#x4EE5;Android13&#xFF08;API 33+&#xFF09;&#x4E3A;&#x76EE;&#x6807;&#x5E73;&#x53F0;&#x7684;&#x5E94;&#x7528;,在 &#x540E;&#x53F0;访问 &#x8EAB;&#x4F53;&#x4F20;&#x611F;&#x5668;(例如心率、体温和血氧饱和度)时,除了需要请求现有的 BODY_SENSORS 权限外,还需要请求 BODY_SENSORS_BACKGROUND 权限。

Android 13 新特性及适配指南

官方参考:
Android Developer BODY_SENSORS_BACKGROUND:
https://developer.android.google.cn/reference/android/Manifest.permission#BODY_SENSORS_BACKGROUND

八、非 SDK 接口限制

官方从 Android 9(API 级别 28)开始,逐步开始对应用使用的非 SDK 接口实施了限制。
如果你的APP通过引用 &#x975E; SDK &#x63A5;&#x53E3;或尝试 &#x4F7F;&#x7528;&#x53CD;&#x5C04;&#x6216; JNI &#x6765;&#x83B7;&#x53D6;&#x53E5;&#x67C4;,这些限制就会起作用。官方给出的解释是为了 &#x63D0;&#x5347;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#x3001;&#x964D;&#x4F4E;&#x5E94;&#x7528;&#x5D29;&#x6E83;&#x98CE;&#x9669;

8.1、非SDK接口检测工具

官方给出了一个检测工具,下载地址:veridex
https://android.googlesource.com/platform/prebuilts/runtime/+archive/master/appcompat.tar.gz

veridex使用方法:

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

Android 13 新特性及适配指南

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
  • greylist-max-p: 在targetSDK

官方参考:
Android Developer 非SDK接口限制:
https://developer.android.google.cn/guide/app-compatibility/restrictions-non-sdk-interfaces#test-for-non-sdk

九、前台服务管理器

从Android 13(API 33)开始,Android通知栏中新增了一项 &#x65B0;&#x7279;&#x6027;
用户可以选择在通知栏中通过” &#x524D;&#x53F0;&#x670D;&#x52A1;&#x7BA1;&#x7406;&#x5668; “,对” &#x6B63;&#x5728;&#x8FD0;&#x884C;&#x7684;&#x524D;&#x53F0;&#x670D;&#x52A1; “进行停止操作。

Android 13 新特性及适配指南

参考

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 新特性及适配指南

Original: https://www.cnblogs.com/xiaxveliang/p/16821788.html
Author: xiaxueliang
Title: Android 13 新特性及适配指南

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/800305/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Python(Flask)+Vue(ElementUI)+MySQL全栈日记【1】

    在Web技术课上被布置了服务端编程的作业。虽然以前一直都是只会写前端的,这下也试着全栈一次……! 安装所需要的所有东西本身就并非易事。下载了PyCharm(…

    Python 2023年8月13日
    071
  • 如何使用 LinkedHashMap 实现 LRU 缓存?

    本文已收录到AndroidFamily ,技术和职场问题,请关注公众号 [彭旭锐] 提问。 大家好,我是小彭。 在上一篇文章里,我们聊到了 HashMap 的实现原理和源码分析,在…

    Python 2023年10月13日
    065
  • django+vue项目跨域问题

    1.开发调式问题,路由指向(跨域问题)(1)前端vue,修改config目录下面的index.js 修改:proxyTable: {‘/’: {target…

    Python 2023年8月5日
    036
  • Python实用技术二:数据分析和可视化

    目录 一,多维数组库numpy 1,操作函数:​ 2,numpy数组元素增删 1)添加数组元素 2)numpy删除数组元素 3)在numpy数组中查找元素 4)numpy数组的数学…

    Python 2023年8月25日
    053
  • python数据清洗—实战案例(清洗csv文件)

    我也是最近才开始这方面的学习,这篇就当作学习的笔记,记录一下学习的过程 目录 * – 所以我们现在要解决的问题就是删除列名中的空格 – 接下来要解决的问题就…

    Python 2023年8月6日
    086
  • 你写过哪些实用的Python代码?

    Python这门语言很适合用来写些实用的小脚本,跑个自动化、爬虫、算法什么的,非常方便。 这也是很多人学习Python的乐趣所在,可能只需要花个礼拜入门语法,就能用第三方库去解决实…

    Python 2023年10月31日
    045
  • Neo4j 安装、使用教程

    文章目录 * – + 一、Neo4j 的安装与配置 + * 1、安装JDK * 2、安装Neo4j * 3、Neo4j环境变量配置 * 4、启动服务器 + 二、Neo4…

    Python 2023年11月5日
    060
  • Python使用pandas读取excel

    了解了Series和dataframe的基本数据结构和索引的相关概念之后,就可以练习基本的excel操作。pandas读取一个excel文件后会将其转化为DataFrame对象,每…

    Python 2023年8月16日
    053
  • Python3 数据结构

    Python 处理大数据集可以借助 Python 内置数据结构:列表、元组、字典 、 集合等,但是一般要和 pandas 和 Numpy 等库结合起来使用。 熟练掌握Python,…

    Python 2023年8月27日
    052
  • python使用pymodbus库进行modbus tcp通信

    使用pymodbus库进行modbus tcp通信 使用python解决工业通信问题是一个非常好的选择,python具有丰富的生态,可以轻松解决工业通信的各种问题。本篇主要介绍使用…

    Python 2023年8月1日
    0210
  • Ubuntu下配置nginx+uwsgi+django

    安装uwsgi 环境是ubuntu18.04+python3.8.8首先安装好anaconda环境,后面的包都用conda安装,能自动解决依赖问题。 conda换清华源 conda…

    Python 2023年8月5日
    059
  • Mybatis整合达梦数据库

    陈老老老板🦸 👨‍💻本文专栏:国产数据库-达梦数据库(主要讲一些达梦数据库相关的内容)👨‍💻本文简述:本文讲一下SpringBoot整合Mybatis与达梦数据库,就是简单,一定能…

    Python 2023年10月10日
    047
  • 【Linux】文件系统

    ​🌠 作者:@阿亮joy.🎆专栏:《学会Linux》🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录 * &#8211…

    Python 2023年11月7日
    067
  • python安装第三方库

    方法一:pip命令行直接安装 打开cmd命令窗口,通过命令 _pip install 包名_进行第三库安装,此方法简单快捷,示例安装keras库。 注意:安装成功会显示 Succe…

    Python 2023年9月25日
    046
  • Python技能树及CSDN MarkDown编辑器测评

    测评目录 python技能树测评 python技能树是什么 python技能树长什么样 如何学习python技能树 python技能树可能需要的改进 对python技能树的总结 C…

    Python 2023年11月3日
    049
  • Python中四个不常见的小技巧

    1. 引言 在编程界,每个人都希望自己可以写出世界上最好的代码,其实最好的代码往往需要具备最好的代码质量。勤能补拙,善于总结往往可以快速提升大家的编程技巧。 本文重点对日常中不常使…

    Python 2023年5月24日
    063
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球