Android13 新特性和开发适配须知

Android 13带来了诸多新功能,如带主题的应用图标、剪贴板预览、启动画面效率提升、照片选择器等。适配工作包括:通知的运行时权限、剪贴板敏感内容处理、附近WIFI设备新权限、媒体权限细化等。开发者需关注这些变化以确保应用兼容性和用户隐私安全。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

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

新功能和 API

先来看看 Android 13 带来了哪些新的改变,这里我挑了一些对我们比较重要的来说。具体可以参考: https://developer.android.google.cn/about/versions/13/features

带主题的应用图标

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

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

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

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

剪贴板预览

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

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

提高了启动画面效率

Android 12 引入了 Splash Screen API,可以帮助开发者更好的开发启动页面,果不其然 Android 13 就进行了完善,包括下面两项改动:

  • 系统会直接从 AnimatedVectorDrawable 推断动画时长。在 Android 13 之前,必须直接设置 windowSplashScreenAnimationDuration;

  • 使用新的 windowSplashScreenBehavior 属性可以更好地控制应用是否始终在 Android 13 及更高版本中的启动画面上显示该图标。

广播接收

在以前任何应用都可以向动态注册的接收器发送不受保护的广播,除非该接收器受签名权限的保护。Android 13 允许用户指定是否接受外部应用的广播,前提是启用了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。

照片选择器

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

使用照片选择器需要 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 设备新权限

Android 13 之前针对 WIFI 的权限是 ACCESS_FINE_LOCATION,即使我们不想定位只想查询一下附近的 WIFI。Android 13 提供了一个新的运行时权限 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 权限。

精确闹钟权限

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

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

适配 Android 13

下面来看看适配 Android 13 需要注意哪些事项。这里只列举一些比较常用的功能,全部内容可以参考:

https://developer.android.google.cn/about/versions/13/behavior-changes-all

通知的运行时权限

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

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

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

剪切板脱敏

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

代码如下:

// When your app targets API level 33 or higherclipData.apply {    description.extras = PersistableBundle().apply {        putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true)    }}
// If your app targets a lower API levelclipData.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 只在 Android 13 上,所以我们还要保留 ACCESS_FINE_LOCATION 以应对 Android 12 及以下设备,不过可以为其设置最高 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 权限。

总结

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

https://developer.android.google.cn/about/versions/13

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值