引言
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,保证用户体验
网友评论