Android 13新功能及适配工作详解
作者:BennuCTech 发布时间:2022-04-13 11:05:33
前言
目前Google已经发布了Android13的正式版,虽然国内的手机能用上Android13还有一段时间,不过开发者们可以通过模拟器来体验,那么我们来看看Android13都有哪些重要的改变,我们适配的话需要做哪些工作?
新功能和API
先来看看Android13带来来哪些新的改变,这里我挑了一些对我们比较重要的来说。
具体可以参考developer.android.google.cn/about/versi…
带主题的应用图标
让应用图标随着主题换色。
首先应用要提供自适应图标和单色应用图标,并通过清单中的 <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需要注意哪些事项。这里只列举一些比较常用的功能,全部内容可以参赛developer.android.google.cn/about/versi…
通知的运行时权限
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_IMAGES 和 READ_MEDIA_VIDEO 权限。
后台使用身体传感器的新权限
如果应用以 Android 13 为目标平台,并且在后台运行时需要访问身体传感器信息,那么除了现有的 BODY_SENSORS权限外,还需要声明新的 BODY_SENSORS_BACKGROUND权限。
来源:https://juejin.cn/post/7160862738007195684


猜你喜欢
- 本文实例为大家分享了C#实现多个计时器记录不同定时时间的具体代码,供大家参考,具体内容如下1.定义Timer类、定义委托//定义Timer类
- 使用HttpServletRequest可以防止盗链行为,什么是盗链行为,比如说在一个别的网站上超链接,指向我们的网页中的某个数据,这样从他
- 本文实例讲述了Android实现内存中数据保存到sdcard的方法。分享给大家供大家参考,具体如下:public static void w
- 在Controller层时,往往会需要校验或验证某些操作,而在每个Controller写重复代码,工作量比较大,这里在Springboot项
- 最近跳槽去新公司,接受的第一个任务是在 一个电商模块的搜索功能以及搜索历史记录的实现。需求和淘宝等电商的功能大体差不多,最上面一个搜索框,下
- #define只加一个参数 的解释<stdio.h> 里有:#ifndef __STDIO_H #define &n
- TestCar.javapublic class TestCar { public static voi
- 去年就已经学了这个技术了,一直没去写,现在抽个时间写了个俄罗斯方块游戏。只有简单的新游戏,暂停,继续,积分功能。简单的实现了俄罗斯的经典功能
- 引入线程是为了减少程序在并发执行时所付出的时空开销。属性:轻型实体。它不拥有系统资源,只是有一点必不可少的、能保证独立运行的资源。独立调度和
- 1 ArrayList在集合框架中,ArrayList是一个普通的类,实现了List接口,具体框架图如下:说明:ArrayList实现了Ra
- 首先来看看以下程序将会打印出什么:class Dog { public static void bark
- 本文实例讲述了Android编程实现小说阅读器滑动效果的方法。分享给大家供大家参考,具体如下:看过小说都知道小说阅读器翻页有好多种效果,比如
- 本文实例总结了Android开发之Button事件实现与监听方法。分享给大家供大家参考,具体如下:先来介绍Button事件实现的两种方法ma
- 环境:Spring5.3.12.RELEASE。Spring 3引入了一个core.onvert包,提供一个通用类型转换系统。系统定义了一个
- 本文实例讲述了android监听返回按钮事件的方法。分享给大家供大家参考。具体如下:用户在点击手机的返回按钮时,默认是推出当前的activt
- Java List 用法实例详解Java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中,下文对Java List用法做了详解
- Guava Cache:⾕歌开源缓存框架Guava Cache是在内存中缓存数据,相比较于数据库或redis存储,访问内存中的数据会更加高效
- DozerDozer是一种Java Bean到Java Bean的映射器,递归地将数据从一个对象复制到另一个对象,它是一个强大的,通用的,灵
- 本文实例为大家分享了C++实现希尔排序的具体代码,供大家参考,具体内容如下一、思路:希尔排序:又称缩小增量排序,是一种改进的插入排序算法,是
- 相关文章:Java使用POI导出Excel(一):单sheetJava使用POI导出Excel(二):多个sheet相信在大部分的web项目