https://zhuanlan.zhihu.com/p/275758740
https://www.jianshu.com/p/3f57e7464184
# Android 11+ 文件读写权限之沙盒机制详解
[](https://www.jianshu.com/u/874debdf1c26)
[Kael_Zhang的安卓笔记](https://www.jianshu.com/u/874debdf1c26)关注 IP属地: 广东
0.284<time datetime="2022-08-25T23:05:08.000Z" style="box-sizing: border-box; margin-right: 10px;">2022.08.26 07:05:08</time>字数 415阅读 1,188
<article class="_2rhmJa" style="box-sizing: border-box; display: block; font-weight: 400; line-height: 1.8; margin-bottom: 20px; word-break: break-word; position: relative; color: rgb(64, 64, 64); font-family: -apple-system, BlinkMacSystemFont, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">
# 引言
`Android 11 (api 30)`强制引入&执行应用`沙盒机制`,获取文件读写权限并不能直接读写相册等公共目录,适配该版本时此问题的适配是无法避免的,这是android的一项新的安全机制,保证用户不受恶意应用的侵害,隔离应用间的数据&私有目录&公共目录,应用间不能直接互相访问数据,不过这也带来了一些适配问题,比如拍照应用如何保存图片到公共相册等问题,本文旨在介绍此问题
# 如何读写文件
* targetSdk < 29 (目标版本 < `Android 10`)
获取以下权限即可访问公共目录
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
* targetSdk = 29 (目标版本 = `Android 10`)
获取以下权限不能访问公共目录
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
同时添加以下参数可以访问公共目录
android:requestLegacyExternalStorage="true"
* targetSdk >= 29 (目标版本 >= `Android 10`)
获取以下权限不可以读写公共目录
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
同时使用SAF(存储访问框架)、多媒体框架读写公共目录
* targetSdk >= 29 (目标版本 >= `Android 10`)
获取以下权限可以公共目录(不建议)
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
# 注意事项
app编译时`targetSdk`是关键参数,`targetSdk = 29` 的app,即便安装到`Android 11`的机器上,也是按照`api 29`的权限规则运行的,不过此沙盒机制,还是需要尽快适配的,各大应用商店的上架标准很快就会要求 `targetSdk >= 31`,以强制要求适配新版本android,保证用户体验
</article>
网友评论