适配androidQ或者改低库sdk到28
关于分区存储,在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))
如有侵权请联系我删除
参考文献:
拖不得了,Android 11最全适配指南奉上 - 知乎
AAPT: error: attribute android:requestLegacyExternalStorage not found._城南一霸贾十七的博客-CSDN博客rr
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)