爱笑的姑娘|拖不得了,Android11真的要来了,最全适配实践指南奉上

作者:积木zz
前言
最近看到一条新闻 , android 11(version 30 , Andorid R)最终Beta版 如期发布 , 看到这个新闻我知道我不能再拖了 , 再不好好准备好迎接Android11的到来 , 到时候迎接我的就是客户的指责 , 甚至老板的一封休书了。
今天就和大家一起看看Android11到底改了些什么 , 以及最重要的 , 我们需要怎么适配?targetversion不改到30 , 是不是就不用适配了呢?
以下我分为两部分讲述 , 分别是

  • 以Adnroid11 为目标版本的应用(targetSdkVersion>=30才有影响)?
  • 所有应用在Android11设备上适配改动(无论targetSdkVersion是多少 , 只要在Android11设备上运行的应用都有影响)
为什么先说targetSdkVersion>=30的模块呢?因为一般来说为了Google为了让我们更长时间适应新的内容以及保障线上应用的稳定 , 都会把改动大的 , 需要花时间适配的内容放到新的targetSdkVersion对应的应用上 , 如果你暂时没有适配targetSdkVersion30的需求 , 也可以看看第二模块 , 看看是否有涉及你的应用相关内容 。 GOGOGO!
Tips:此适配文章会不间断更新 , 根据Android11发布进度调整 , 欢迎点赞关注 。 (打?的格外注意哦)
适配targetSdkVersion30此模块的修改内容只针对targetSdkVersion 30或者以上才生效 。
分区存储强制执行?对外部存储目录的访问仅限于应用专属目录 , 以及应用已创建的特定类型的媒体 。
关于分区存储 , 在Android10就已经推行了 , 简单的说 , 就是应用对于文件的读写只能在沙盒环境 , 也就是属于自己应用的目录里面读写 。 其他媒体文件可以通过MediaStore进行访问 。
但是在android10的时候 , Google还是为开发者考虑 , 留了一手 。 在targetSdkVersion = 29应用中 , 设置android:requestLegacyExternalStorage="true" , 就可以不启动分区存储 , 让以前的文件读取正常使用 。 但是targetSdkVersion = 30中不行了 , 强制开启分区存储 。当然 , 作为人性化的android , 还是为开发者留了一小手 , 如果是覆盖安装呢 , 可以增加android:preserveLegacyExternalStorage="true" , 暂时关闭分区存储 , 好让开发者完成数据迁移的工作 。 为什么是暂时呢?因为只要卸载重装 , 就会失效了 。 以下是关于分区存储会遇到的所有情况 , 给大家罗列出来了 , 先上代码:
fun saveFile() {if (checkPermission()) {//getExternalStoragePublicDirectory被弃用 , 分区存储开启后就不允许访问了val filePath = Environment.getExternalStoragePublicDirectory("").toString() + "/test3.txt"val fw = FileWriter(filePath)fw.write("hello world")fw.close()showToast("文件写入成功")}}分情况运行:
1) targetSdkVersion = 28 , 运行后正常读写 。
2) targetSdkVersion = 29 , 不删除应用 , targetSdkVersion 由28修改到29 , 覆盖安装 , 运行后正常读写 。
3) targetSdkVersion = 29 , 删除应用 , 重新运行 , 读写报错 , 程序崩溃(open failed: EACCES (Permission denied))
4) targetSdkVersion = 29 , 添加android:requestLegacyExternalStorage="true"(不启用分区存储) , 读写正常不报错
5) targetSdkVersion = 30 , 不删除应用 , targetSdkVersion 由29修改到30 , 读写报错 , 程序崩溃(open failed: EACCES (Permission denied))
6) targetSdkVersion = 30 , 不删除应用 , targetSdkVersion 由29修改到30 , 增加android:preserveLegacyExternalStorage="true" , 读写正常不报错
7) targetSdkVersion = 30 , 删除应用 , 重新运行 , 读写报错 , 程序崩溃(open failed: EACCES (Permission denied))