前几天收到了公司的邮件,要求下一期版本中升级targetSDK29,也就是适配Android10。
想着这周自己的手机也刚刚升级到Android10系统,趁着趁着兴奋就赶紧来研究一下AndroidQ吧!
从AndroidStudio中Tools > SDK Manager > SDK Platforms中选择Android Q SDK (Api Level 29) 下载并且安装即可。
首先在gradle.properties中开启支持Android 10的支持,示例如下:
android.useAndroidX=true
android.enableJetifier=true
android {
compileSdkVersion 29
buildToolsVersion 29.0.2
defaultConfig {
targetSdkVersion 29
}
...
}
使用AS工具:refactor -> Migrate to Android X
手动修改包名,参考如下映射关系
可以参考官网对应的转换关系:
https://developer.android.com/jetpack/androidx/migrate/artifact-mappings
隐私是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,保存成功自动添加到相册数据库,无需再发送广播告诉系统插入相册;
当SDK版本大于API 28时,且设备版本为Android P以上版本,解决方法在onCreate中加入如下代码,可获得焦点,如需弹出键盘可延迟下:
mEditText.post(() -> {
mEditText.requestFocus();
mEditText.setFocusable(true);
mEditText.setFocusableInTouchMode(true);
});
直接使用文件路径的,如QQ图片分享,都需要注意,这是不可行的,都只能通过MediaStore等API,拿到Uri来操作。
在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);
这个问题主要是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 等
}
Android Q 包含了名为“READ_CLIPBOARD_IN_BACKGROUND”的新权限。 顾名思义,新的权限将阻止随机的后台应用程序访问剪贴板内容。