前几天收到了公司的邮件,要求下一期版本中升级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=trueandroid.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.Videosif(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”的新权限。 顾名思义,新的权限将阻止随机的后台应用程序访问剪贴板内容。

更多相关文章

  1. android版本的较大变动和新版本适配
  2. ionic3 图片选取imagepicker以及camera汉化
  3. android/linux权限简单理解
  4. Android 6.0以上的权限申请的问题
  5. Android 各个版本适配及新功能
  6. Android修改图片颜色-转成灰度图

随机推荐

  1. Android:Gravity控制格式
  2. 关于progressbar进度条的显示风格及一些
  3. 源码解析Android中AsyncTask的工作原理
  4. 【Android开发】背景选择器selector用法
  5. 阅读手札:《:第一行代码》(第一章)
  6. 基于Android FrameLayout的使用详解
  7. 使用ProgressBar实现加载进度条
  8. Android的安全体系
  9. Android 软键盘
  10. Android Display System --- Surface Fli