Android 10 适配攻略

前几天收到了公司的邮件,要求下一期版本中升级targetSDK29,也就是适配Android10。

Android 10 适配攻略_第1张图片
想着这周自己的手机也刚刚升级到Android10系统,趁着趁着兴奋就赶紧来研究一下AndroidQ吧!

1.框架迁移步骤

从AndroidStudio中Tools > SDK Manager > SDK Platforms中选择Android Q SDK (Api Level 29) 下载并且安装即可。

2.更新Android工程配置

首先在gradle.properties中开启支持Android 10的支持,示例如下:

android.useAndroidX=true
android.enableJetifier=true
android {
     
   compileSdkVersion 29
   buildToolsVersion 29.0.2
 
   defaultConfig {
     
      targetSdkVersion 29
   }
   ...
}

3.迁移Support包至Android X

使用AS工具:refactor -> Migrate to Android X
手动修改包名,参考如下映射关系
可以参考官网对应的转换关系:
https://developer.android.com/jetpack/androidx/migrate/artifact-mappings

4.处理升级android Q带来的行为变更

1.Android Q中的媒体资源读写

隐私是Android 10的核心关注点,更严格的权限,并限制了数据应用程序的使用。针对媒体资源读写,有以下地方需要注意:

扫描系统相册、视频等,图片、视频选择器都是通过ContentResolver来提供;

//公有目录只能通过Content Uri+id的方式访问,以前的File路径全部无效,如果是Video,记得换成MediaStore.Videos
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
     
      path  = MediaStore.Images.Media
                       .EXTERNAL_CONTENT_URI
                       .buildUpon()
                       .appendPath(String.valueOf(id)).build().toString();
 }

判断公有目录文件是否存在,自Android Q开始公有目录File API都失效,不能直接通过new File(path).exists();判断公文件是否存在;
Copy或者Download文件到公有目录也需要注意;
保存图片相关,通过MediaStore保存,兼容AndroidQ,保存成功自动添加到相册数据库,无需再发送广播告诉系统插入相册;

2.EditText默认不获取焦点,不自动弹出键盘

当SDK版本大于API 28时,且设备版本为Android P以上版本,解决方法在onCreate中加入如下代码,可获得焦点,如需弹出键盘可延迟下:

mEditText.post(() -> {
     
       mEditText.requestFocus();
       mEditText.setFocusable(true);
       mEditText.setFocusableInTouchMode(true);
});
3.第三方分享图片等操作,都只能通过MediaStore等API

直接使用文件路径的,如QQ图片分享,都需要注意,这是不可行的,都只能通过MediaStore等API,拿到Uri来操作。

4.设备硬件信息读取限制

在Android10中, 系统不允许普通App请求android.permission.READ_PHONE_STATE权限, 故新版App需要取消该动态权限的申请。
当前获取设备唯一ID的方式为使用SSAID, 若获取为空的话则使用UUID.randomUUID().toString()获得一个随机ID并存储起来, 该ID保证唯一, 但App卸载重装之后就会改变。

SSAID的获取方式为:

String id = android.provider.Settings.Secure.getString(context.getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);
5.Region.Op相关异常

这个问题主要是SDK版本大于API 28上调用canvas出现的崩溃“Invalid Region.Op - only INTERSECT and DIFFERENCE are allowed“,当目标版本从Android P开始,Canvas.clipPath(@NonNull Path path, @NonNull Region.Op op) ; 已经被废弃,而且是包含异常风险的废弃API,只有 Region.Op.INTERSECT 和 Region.Op.DIFFERENCE 得到兼容,几乎所有的博客解决方案都是如下简单粗暴:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
     
    canvas.clipPath(path);
} else {
     
    canvas.clipPath(path, Region.Op.XOR);// REPLACE、UNION 等
}
6.限制程序访问剪贴板

Android Q 包含了名为“READ_CLIPBOARD_IN_BACKGROUND”的新权限。 顾名思义,新的权限将阻止随机的后台应用程序访问剪贴板内容。

你可能感兴趣的:(Android)