requestLegacyExternalStorage

requestLegacyExternalStorage,第1张

工程 采用的sdk 为 29 , 第三方库 sdk为 28 , 测试机为android12


适配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

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/992255.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存