前言

目前Google已经发布了Android13的正式版,虽然国内的手机能用上Android13还有一段时间,不过开发者们可以通过模拟器来体验,那么我们来看看Android13都有哪些重要的改变,我们适配的话需要做哪些工作?

新功能和API

先来看看Android13带来来哪些新的改变,这里我挑了一些对我们比较重要的来说。

具体可以参考https://developer.android.google.cn/about/versions/13/features

带主题的应用图标

让应用图标随着主题换色。

首先应用要提供自适应图标和单色应用图标,并通过清单中的 <adaptive-icon> 元素指向该单色应用图标。

然后需要用户在系统设置中启用带主题的应用图标

这样系统会根据壁纸和主题来确定色调颜色,然后该颜色将应用于单色应用图标。

剪贴板预览

从 Android 13 开始,将内容添加到剪贴板时,我们可以预览复制的内容。如下

Android13也加入了对剪贴板敏感内容的脱敏处理,后面会详细说。

提高了启动画面效率

Android12引入了Splash Screen API,可以帮助开发者更好的开发启动页面,我之前也专门用一篇文章介绍过,不过有些地方还需要改进。果不然Android13就进行了完善,包括下面两项改动;

  • 系统会直接从 AnimatedVectorDrawable 推断动画时长。在 Android 13 之前,必须直接设置 windowSplashScreenAnimationDuration
  • 使用新的 windowSplashScreenBehavior 属性可以更好地控制应用是否始终在 Android 13 及更高版本中的启动画面上显示该图标。

广播接收

在以前任何应用都可以向动态注册的接收器发送不受保护的广播,除非该接收器受签名权限的保护。Android13允许用户指定是否接受外部应用的广播,前提是启用了DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED 兼容性框架(默认是关闭的)

在注册广播的时候设置一个Flag,如下:

context.registerReceiver(sharedBroadcastReceiver, intentFilter,RECEIVER_EXPORTED)context.registerReceiver(privateBroadcastReceiver, intentFilter,RECEIVER_NOT_EXPORTED)

注意:如果启用了DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED,在注册广播的时候就必须设置RECEIVER_EXPORTED或RECEIVER_NOT_EXPORTED。

照片选择器

Android13提供了照片选择器,这样无需向应用授予整个媒体库的访问权限。

使用照片选择器需要 1.6.0-alpha05 或更高版本的 androidx.activity 库,主要api:

  • PickVisualMedia,用于选择单张图片或单个视频。
  • PickMultipleVisualMedia,用于选择多张图片或多个视频。

示例代码如下:

val pickMedia = registerForActivityResult(PickVisualMedia()) { uri ->if (uri != null) {Log.d("PhotoPicker", "Selected URI: $uri")} else {Log.d("PhotoPicker", "No media selected")}
}pickMedia.launch(PickVisualMediaRequest(PickVisualMedia.ImageAndVideo))pickMedia.launch(PickVisualMediaRequest(PickVisualMedia.ImageOnly))pickMedia.launch(PickVisualMediaRequest(PickVisualMedia.VideoOnly))val mimeType = "image/gif"
pickMedia.launch(PickVisualMediaRequest(PickVisualMedia.SingleMimeType(mimeType)))

附近WIFI设备新权限

Android13之前针对WIFI的权限是ACCESS_FINE_LOCATION,即使我们不想定位只想查询一下附近的wifi。Android13提供了一个新的运行时权限NEARBY_WIFI_DEVICES来专门针对这种情况,这个权限影响的API如下:

  • WifiManager

    • startLocalOnlyHotspot()
  • WifiAwareManager

    • attach()
  • WifiAwareSession

    • publish()
    • subscribe()
  • WifiP2pManager

    • addLocalService()
    • connect()
    • createGroup()
    • discoverPeers()
    • discoverServices()
    • requestDeviceInfo()
    • requestGroupInfo()
    • requestPeers()
  • WifiRttManager

    • startRanging()

使用以上Api需要申请NEARBY_WIFI_DEVICES权限。

精确闹钟权限

Android13提供了一个新的闹钟权限USE_EXACT_ALARM,它类似于SCHEDULE_EXACT_ALARM不过是自动授权的,不需要用户手动授权。

Google对这个权限的要求是必须是闹钟、计时器或提供活动通知的日历应用才可以使用,GooglePlay会对使用这个权限的应用进行审核。不过目前国内还没有限制,后续各大应用市场应该也会跟进限制。

适配Android13

下面来看看适配Android13需要注意哪些事项。这里只列举一些比较常用的功能,全部内容可以参赛https://developer.android.google.cn/about/versions/13/behavior-changes-all

通知的运行时权限

Android 13(API 级别 33)引入了运行时通知权限POST_NOTIFICATIONS,如果应用以 Android 13 为目标平台,当需要发送通知的时候就需要动态请求该权限,否则无法发出通知。

注意:媒体相关的通知不受这个权限的影响,依然可以正常进行通知;前台服务的通知则受本权限影响。

可以通过NotificationManager的areNotificationsEnabled()来检查应用是否可以发送通知。

剪切板脱敏

上面我们提到Android13提供来剪切板预览功能,但是如果复制的是敏感内容的话,可以在调用 ClipboardManager#setPrimaryClip() 之前向 ClipData 的 ClipDescription 添加一个标志,这样预览的时候就看不到敏感内容了

代码如下:

// When your app targets API level 33 or higher
clipData.apply {description.extras = PersistableBundle().apply {putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true)}
}// If your app targets a lower API level
clipData.apply {description.extras = PersistableBundle().apply {putBoolean("android.content.extra.IS_SENSITIVE", true)}
}

添加标志后的效果如下

附近WIFI设备新权限

上面提到了,针对附近WIFI设备提供了一个新的运行时权限NEARBY_WIFI_DEVICES

如果应用不会使用WIFI相关API进行定位,那么可以将 android:usesPermissionFlags 属性设置为 neverForLocation

<manifest ...><uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES"android:usesPermissionFlags="neverForLocation" /> <application ...>...</application>
</manifest>

因为NEARBY_WIFI_DEVICES只在Android13上,所以我们还要保留ACCESS_FINE_LOCATION以应对Android12及以下设备,不过可以为其设置最高sdk版本,如下:

<manifest ...><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"android:maxSdkVersion="32" /> <application ...>...</application>
</manifest>

细化媒体权限

如果应用以 Android 13 为目标平台,那么如果要访问媒体文件时就不能像之前那样请求READ_EXTERNAL_STORAGE权限,Android 13提供了更加细化的权限,必须请求以下权限来代替:

媒体类型 请求权限
图片和照片 READ_MEDIA_IMAGES
视频 READ_MEDIA_VIDEO
音频文件 READ_MEDIA_AUDIO

这样可以更加保护用户的隐私。

如果同时请求 READ_MEDIA_IMAGES 权限和 READ_MEDIA_VIDEO 权限,只会显示一个系统权限对话框。

注意:如果您的应用只需要访问图片、照片和视频,请考虑使用 照片选择器,而不是声明 READ_MEDIA_IMAGESREAD_MEDIA_VIDEO 权限。

后台使用身体传感器的新权限

如果应用以 Android 13 为目标平台,并且在后台运行时需要访问身体传感器信息,那么除了现有的 BODY_SENSORS权限外,还需要声明新的 BODY_SENSORS_BACKGROUND权限。

总结

以上就是Android 13版本中对开发者来说比较关心的新功能和适配方案,如果想了解更全面的信息,可以参考官方https://developer.android.google.cn/about/versions/13

Android 13带来了哪些新功能?需要哪些适配工作?相关推荐

  1. 你好,了解一下Java 14带来的一系列新功能

    Java 14带来的一系列新功能 Java 14包含比前两个发行版更多的新功能-其中大多数旨在简化编码. 劳尔·加布里埃尔·乌尔玛(Raoul-Gabriel Urma) 下载本文的PDF Java ...

  2. IDEA 2020.2 稳定版发布,带来了不少新功能...

    IntelliJ IDEA 2020.2 稳定版已发布,此版本带来了不少新功能,包括支持在 IDE 中审查和合并 GitHub PR.新增加的 Inspections 小组件(Inspections ...

  3. easyui treegrid 获取新添加行inserted_IDEA 2020.2 稳定版发布,带来了不少新功能...

    点击上方 "zhisheng"关注, 星标或置顶一起成长 Flink 从入门到精通 系列文章 IntelliJ IDEA 2020.2 稳定版已发布,此版本带来了不少新功能,包括支 ...

  4. 高通Android 13默认切换免提功能

    1.测试部反馈 由于平板本身没有听筒功能 因此考虑工厂直接切换到免提功能 2.修改路径 frameworks/av/services/audiopolicy/enginedefault/src/Eng ...

  5. 苹果发布 iOS14.3 正式版,带来多个新功能,可惜......

    今日凌晨,苹果发布了 iOS14.3 正式版,版本号和上周发布的iOS14.3RC2一样,如果你之前升级了 iOS14.3RC2 的话就不会收到今天的系统推送 本次更新带来了大量新功能,也修复了不少问 ...

  6. Android O 和 iOS 11 新功能对比

    Apple 和 Google 都在推出 iOS 和 Android 的下一版本.Google 在上周推出了 Android Oreo (8.0 版本),Apple 将在九月份推出 iPhone 8 后 ...

  7. Android Q(10.0)版本新特性以及兼容性适配

    北京时间2019年3月14日Google正式对外发布Android Q Beta 1及预览版SDK,这意味着安卓开发者们又即将迎来一年一度的新版本适配工作了.Android Q 为开发者们带来了许多新 ...

  8. Android 8.0 正式发布,Google 带来了哪些新功能?

    文/屠敏 2017 年 8 月 21 日,随着日全食的到来,此前一直猜测是 OREO(奥利奥)还是 Orellete(加泰罗尼亚的点心)的 Android 8.0 最终拉开帷幕,Google 正式采取 ...

  9. 微信小程序 界面禁止下拉 左右滑动_微信 iOS 版更新,带来了这些新功能

    果粉俱乐部 让科技更好的服务生活 点击上方「蓝字」加入我们 iOS 13 正式版系统即将到来,第三方应用已经开始陆续更新适配,微信在 9 月 17 号也推出了新的 iOS 版 7.0.7 版本更新. ...

最新文章

  1. Flutter开发之《新锐专家之路:混合开发篇》笔记(55)
  2. 复习java基础第二天(异常处理)
  3. pass4side IBM 000-M15
  4. Java 中日期的几种常见操作 —— 取值、转换、加减、比较
  5. 数据中心行业在能源转型中将发挥重要作用
  6. Docker与Kubernetes,是敌是友?
  7. centos Crontab
  8. 利用geogle中memory工具分析js占用内存
  9. 插入节点insertBefore()
  10. 《SpringMVC从入门到放肆》一、概述
  11. Qt工作笔记-使用SQL中的LIMIT进行数据分页
  12. spring mvc controller json数据
  13. 表单组件中state依赖props
  14. matlab2015统计工具箱,matlab统计工具箱函数汇集
  15. python之MRO和垃圾回收机制
  16. visio2013找到密钥以后但是未激活状态
  17. 计算机二级vfp教程云盘,全国计算机等级考试二级VFP教程.doc
  18. 公用计算机打不开扫雷,win7系统“扫雷”游戏无法打开问题的处理方法
  19. C语言-流程控制-输出华氏-摄氏温度转换表
  20. pyqt 取鼠标处文字_侧裙可拆按键随心装,黑爵GTi模块化游戏鼠标评测

热门文章

  1. html 换行字体,div字体换行
  2. 分别采用递归和非递归方式编写两个函数,求一棵二叉树中叶子节点个数
  3. 海康威视T30智能插座换到另外一个WIFI环境下,不能连接WIFI热点的问题
  4. 网闸是单独部署还是双机部署_鼎信通达UC8000系列IPPBX双机热备解决方案
  5. 灌溉控制器 节水灌溉自动控制器
  6. Tomcat的配置与讲解(含Java环境配置,tomcat配置,tomcat讲解)
  7. 思维导图工具有哪些?快来看看这些工具
  8. html计算斐波那契数列,使用HTML5 Web Worker计算斐波那契数列
  9. pycharm运行小游戏
  10. python自动化测试之Appium自动化测试环境搭建