开发者

Android 13新功能及适配工作详解

开发者 https://www.devze.com 2023-03-29 10:19 出处:网络 作者: BennuCTech
目录前言新功能和API带主题的应用图标剪贴板预览提高了启动画面效率广播接收照片选择器附近WIFI设备新权限精确闹钟权限适配android13通知的运行时权限剪切板脱敏附近WIFI设http://www.devze.com备新权限细化媒体权限
目录
  • 前言
  • 新功能和API
    • 带主题的应用图标
    • 剪贴板预览
    • 提高了启动画面效率
    • 广播接收
    • 照片选择器
    • 附近WIFI设备新权限
    • 精确闹钟权限
  • 适配android13
    • 通知的运行时权限
    • 剪切板脱敏
    • 附近WIFI设http://www.devze.com备新权限
    • 细化媒体权限
    • 后台使用身体传感器的新权限
  • 总结

    前言

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

    新功能和API

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

    具体可以参考developer.android.google.cn/about/versi…

    带主题的应用图标

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

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

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

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

    剪贴板预览

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

    Android 13新功能及适配工作详解

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

    提高了启动画面效率

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

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

    广播接收

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

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

    context.registerReceiver(sharedBroadcastReceiver, intentFilter,
        RECEIVER_EXPORTED)
    context.registerReceiver(privateBroadcastReceiver, intentFilter,
        RECEIVER_NOT_EXPORT开发者_JS培训ED)
    

    注意:如果启用了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提供来剪切板预览功能,但是如果复制的是敏感内容js的话,可以在调用 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)
        }
    }
    

    添加标志后的效果如下

    Android 13新功能及适配工作详解

    附近WIFI设备新权限

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

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

    <manifest ...>
         <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES"
              python           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权限。

    总结

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

    更多关于Android 13新功能适配的资料请关注我们其它相关文章!

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号