Android 13(T) 适配

开发者 2024-9-8 21:34:39 103 0 来自 中国
近来在做Android13(T) 的Target适配,整理了适配过程中碰到的题目 分以下三部分影响全部应用的变更(包罗target33), 只影响TargetSdkVersion = 33的变更 ,其他更改(新增大概改善的功能).
1.影响全部应用的变更

1.1 必须要适配此项

1.1.1 关照的运行时权限

Android 13 中引入了一种新的运行时关照权限:POST_NOTIFICATIONS。 如果用户在搭载 Android 13 的装备上安装您的应用,应用的关照默认处于关闭状态。在您哀求新的权限且用户向您的应用授予该权限之前,您的应用都将无法发送关照。
申请弹框时选择项目
1)选择“允许”,然后应用步伐可以通过任何渠道发送关照,并发布与前台服务干系的关照。
2)选择“不允许”,则应用步伐无法通过任何渠道发送关照,只有少数特定规则除外。
3)不去选择,则应用步伐只能在系统有临时授权的情况下发送关照。
1)以 Android 13 为目的平台
对于新安装的应用: 应用步伐须要在Manifest中声明 android.permission.POST_NOTIFICATION 权限。此权限的级别为“dangerous”,因此应用步伐须要向用户表现运行时提示才气被授予权限。未被授予权限的步伐包的关照将被系统自动删除。
现有应用更新(系统自动升级到Android13): 系统临时授予应用发送关照的权限连续到初次启动Activity为止。
2)如果您的应用以 12L(API 级别 32)或更低版本为目的平台
对于新安装的应用: 系统会在您创建第一个关照渠道时表现权限对话框。这通常是在应用启动时。
现有应用更新(系统自动升级到Android13): 系统临时授予应用发送关照的权限,直到用户在关照权限运行时对话框中明白选择一个选项。也就是说如果用户在未做出选择的情况下关闭了权限提示,系统会生存应用的临时授权。
得到临时授权的资格要求: 应用必须已具有关照渠道,而且用户未在搭载 12L 或更低版本的装备上明白停用应用的关照。如果用户在搭载 12L 或更低版本的装备上停用了应用的关照,当装备升级到 Android 13 或更高版本后,该停用会继承有效。所以在13的呆板上不管是target是13还是13以下 对用户而言关闭关照权限的大概性非常大全部须要做些业务性的引导逻辑,引导用户去开启关照权限
适配方式:
1.注册权限<manifest ...>    <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>    <application ...>        ...    </application></manifest>2. 代码申请public static final String POST_NOTIFICATIONS="android.permission.POST_NOTIFICATIONS";public static void requestNotificationPermission(Activity activity) {      if (Build.VERSION.SDK_INT >= 33) {        if (ActivityCompat.checkSelfPermission(activity, POST_NOTIFICATIONS) == PackageManager.PERMISSION_DENIED) {            if (!ActivityCompat.shouldShowRequestPermissionRationale( activity, POST_NOTIFICATIONS)) {              enableNotification(activity);              }else{                ActivityCompat.requestPermissions( activity,new String[]{POST_NOTIFICATIONS},100);            }        }    } else {        boolean enabled = NotificationManagerCompat.from(activity).areNotificationsEnabled();        if (!enabled) {            enableNotification(activity);        }    }}public static void enableNotification(Context context) {    try {        Intent intent = new Intent();        intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS);        intent.putExtra(Settings.EXTRA_APP_PACKAGE,context. getPackageName());        intent.putExtra(Settings.EXTRA_CHANNEL_ID, context.getApplicationInfo().uid);        intent.putExtra("app_package", context.getPackageName());        intent.putExtra("app_uid", context.getApplicationInfo().uid);        context.  startActivity(intent);    } catch (Exception e) {        e.printStackTrace();        Intent intent = new Intent();        intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);        Uri uri = Uri.fromParts("package",context. getPackageName(), null);        intent.setData(uri);        context. startActivity(intent);    }}1.2 如果有涉及以下需求,可以使用新的api实现

1.2.1. 语言偏好设置

之前是在设置中同一全局修改系统语言, 如今可以针对单个应用设置语言偏好(中文/英文...),请参考变更记载 其他关于语言的变更有针对性特定国家语言(日语文本换行/非拉丁字母行高/语种输入文本转换api)的优化具体可以参考官方文档
非拉丁语行高 ,日语换行 ,差别语种输入文本转换
1.2.2. 自顺应主题图标

应用图标可以跟随用户设置的主题壁纸动态调解表现样式 请参考使用方式变更记载
1.png 1.2.3.可降级权限(打消特定的运行时权限或权限组

从 Android 13 开始,应用可以撤消先前由系统或用户授予的运行时权限。此 API 可以资助应用掩护用户的隐私。
如需撤消特定运行时权限,请将该权限的名称传入 revokeOwnPermissionOnKill()。如需同时撤消一组运行时权限,请将这组权限的名称传入 revokeOwnPermissionsOnKill()。撤消是异步发生的,会停止与应用的 UID 干系联的全部进程。
系统只有在安全的情况下才会触发撤消使用。具体而言,当有应用组件仍在前台运行,大概有另一个应用正在访问您应用的组件(如 content provider)时,不会发生撤消。如果您想立即撤消权限,可以调用 exit()。但是,对 exit() 举行此类调用大概会导致当前正在访问您应用的其他应用出现未界说的举动或瓦解。
1.2.4.照片选择器

没有特别需求可以用官方的照片选择器 参考文档
1.2.5 剪贴板擦除

剪贴板的内容会在60min之后打扫,从剪贴板那数据的使用要留意
2.TargetSdkVersion = 33的变更

2.1.必须要适配

2.1.1.关照权限见上述 关照适配部分

2.1.2.读取媒体文件权限适配

对于目的版本为Android 13,细化READ_EXTERNAL_STORAGE权限,使用READ_MEDIA_IMAGE、READ_MEDIA_VIDEO、READ_MEDIA_AUDIO更换READ_EXTERNAL_STORAGE; 如果traget=33 没有适配会出现非常
Type of mediaPermission to requestImages and photosREAD_MEDIA_IMAGESVideosREAD_MEDIA_VIDEOAudio filesREAD_MEDIA_AUDIO适配方式
<manifest ...>    <!-- Required only if your app targets Android 13. -->    <!-- Declare one or more the following permissions only if your app needs    to access data that's protected by them. -->    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />    <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />    <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />    <!-- Required to maintain app compatibility. -->    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"                     android:maxSdkVersion="32" />    <application ...>        ...    </application></manifest>代码中分版本去判断哀求哪个权限
32及以下版本ActivityCompat.requestPermissions( activity,new String[]{"android.permission.READ_EXTERNAL_STORAGE"},100);33及以上版本ActivityCompat.requestPermissions( activity,new String[]{"android.permission.READ_MEDIA_IMAGES"},100);ActivityCompat.requestPermissions( activity,new String[]{"android.permission.READ_MEDIA_AUDIO"},100);ActivityCompat.requestPermissions( activity,new String[]{"android.permission.READ_MEDIA_VIDEO"},100);2.1.3 在背景使用身体传感器须要新的权限

Android 13 中引入了“在使用时”访问身体传感器(比方心率、体暖和血氧饱和度)的概念。此访问模式与 Android 10(API 级别 29)系统为位置信息引入的模式非常相似。
如果您的应用以 Android 13 为目的平台,而且在背景运行时须要访问身体传感器信息,那么除了现有的 BODY_SENSORS 权限外,您还必须声明新的 BODY_SENSORS_BACKGROUND 权限。
2.1.4. 动态注册的广播须要说明 Export举动

从 Android 12 开始 系统要求在注册清单中带有 intent-filter标签的组件必须用export指明是否可导出(如果的当前Activity Service Provider reciver 不须要让其他应用调用 要设置成false, 比方:我们的启动页面就须要指明export='true'来让launch 启动.)
要实现此安全增强步伐,请实行以下使用:

  • 启用 DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED 兼容性框架更改。
  • 在应用的每个广播汲取器中,明白指明其他应用是否可以向其发送广播,如以下代码段所示:
// This broadcast receiver should be able to receive broadcasts from other apps.// This option causes the same behavior as setting the broadcast receiver's// "exported" attribute to true in your app's manifest.context.registerReceiver(sharedBroadcastReceiver, intentFilter,    RECEIVER_EXPORTED);// For app safety reasons, this private broadcast receiver should **NOT**// be able to receive broadcasts from other apps.context.registerReceiver(privateBroadcastReceiver, intentFilter,    RECEIVER_NOT_EXPORTED);留意:如果启用了 DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED 兼容性框架更改,则必须为每个广播汲取器指定 RECEIVER_EXPORTED 或 RECEIVER_NOT_EXPORTED。否则,当您实验注册广播汲取器时,系统会抛出 SecurityException。
适配方式可以全局修改 注册的地方加上exported flag 三方sdk中的注册依靠于各SDK平台的适配,我们可以在 Applocation 和 BaseActivity中 复写registerReceiver在复写方法里判断有没有添加RECEIVER_EXPORTED 或 RECEIVER_NOT_EXPORTED,如果没有先手动添加ECEIVER_EXPORTED。
boolean flagExported = (flags & Context.RECEIVER_EXPORTED) != 0; boolean flagNotExported = (flags & Context.RECEIVER_NOT_EXPORTED) != 0;if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && !flagExported && !flagNotExported) {    try {        intent = super.registerReceiver(receiver, filter, flags|Context.RECEIVER_EXPORTED);    } catch (Exception ex) {        e.printStackTrace();    }}2.1.5 附近的WIFI装备权限

由于可以通过跟踪附近的Wi-Fi AP和蓝牙装备来推断装备的位置,谷歌决定克制应用步伐访问蓝牙或Wi-Fi扫描结果,除非这类应用须要声明 ACCESS_FINE_LOCATION 权限。
在Android 13中,Google将Wi-Fi扫描与位置分离。Android 13 为管理装备与四周 Wi-Fi 热门连接的应用添加 NEARBY_WIFI_DEVICES运行时权限 (属于 NEARBY_DEVICES 权限组)。调用许多常用 Wi-Fi API 的应用都会须要这个权限,从而在不须要ACCESS_FINE_LOCATION权限 的情况下,更轻松地分析应用为何访问附近的 Wi-Fi 装备。此前,对于仅须要连接 Wi-Fi 装备,但现实上并不须要相识装备位置的应用来说,以 Android 13 为目的平台的应用如今可以通过 “neverForLocation” 属性来美满申请 NEARBY_WIFI_DEVICES 权限,这将有助于促进应用计划的隐私性和友爱性,同时淘汰开辟者们面临的阻碍。
以 Android 13 为目的平台的应用步伐,访问附近的 WI-FI 装备。除特例API须要申请ACCESS_FINE_LOCATION外,其他须要申请android.permission.NEARBY_WIFI_DEVICES运行时权限; 对于用户来说,如果应用没有适配且对调用API没有掩护。会出现应用报错或功能非常等征象;
1、开辟须要区分差别api对应的权限;
须要新权限(NEARBY_WIFI_DEVICES)的 API:
1)WifiManager:startLocalOnlyHotspot()
2)WifiAwareManager:attach()
3)WifiAwareSession:publish()、subscribe()
4)WifiP2pManager:addLocalService()、connect()、createGroup()、discoverPeers()、discoverServices()、requestDeviceInfo()、requestGroupInfo()、requestPeers()
5)WifiRttManager:startRanging()
仍须要位置信息权限(ACCESS_FINE_LOCATION )的API:
1)WifiManager:getScanResults()、startScan()
2、由于 NEARBY_WIFI_DEVICES 权限仅实用于 Android 13 或更高版本,应生存对 ACCESS_FINE_LOCATION 的全部声明,以便在您的应用中提供向下兼容性。如果您的应用不会使用 Wi-Fi API 推导物理位置信息,就可以将此权限的最高 SDK 版本设为 32:
<manifest ...>    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"                     android:maxSdkVersion="32" />    <application ...>        ...    </application></manifest>3、以 Android 13 为目的平台时,如果应用不会通过 Wi-Fi API 推导物理位置,请在清单文件中将 usesPermissionFlags 属性设为 neverForLocation。
<manifest ...>    <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES"                     android:usesPermissionFlags="neverForLocation" />    <application ...>        ...    </application></manifest>3. 新增/改善功能

3.1. open JDk 11 更新

Android 13 开始革新 Android 的焦点库,以与 OpenJDK 11 LTS 版本保持同等,并增加了得当应用清静台开辟者的库更新和 Java 11 语言支持,使用jdk中的一些新的方法 参考文档
3.2. 自界说快捷图款

雷同于在桌面下拉菜单中的 蓝牙/WIFI/手电筒等快捷按钮, 这个功能7.0 就提供了本次修改是可以将自界说的快捷图块直接表如今默认栏里不须要手动去添加.参考文档
3.3 TextView 的断字性能优化

断字让分行的文本更易于阅读,而且有助于使界面更具自顺应性。在 Android 13 中,我们将断字性能优化了多达 200%,因此您如今可以在 TextView 中启用断字功能,这险些不影响渲染性能。如需启用更快断字功能,请在 setHyphenationFrequency() 中使用新的 fullFast 或 normalFast 频率。
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-23 19:52, Processed in 0.188589 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表