-
每个应用向自己的私有目录读写文件,不需要读写权限。私有文件目录具体路径: storage/emulated/0/android/data/packageName/ ,获取方法: Context#getExternalFilesDir()
-
应用即使获取了读写权限,也无法访问其他应用的私有目录。
-
当应用需要获取媒体文件时,通过
MediaStore API
向公共存储目录DCIM、Music或者Movie获取。同样写媒体文件也是如此。并且读写自己的文件时不需要申请权限。 只有读其他应用的媒体文件时才会需要申请READ_EXTERNAL_STORAGE权限。
(更新:Android11为目标平台时,可以使用文件直接路径去访问媒体,这是在Android10上没有的,应用的性能会略有下降,还是推荐使用MediaStore )
-
当应用需要获取其他非媒体文件时,比如doc、pdf文件,需要使用
系统的文件选择器SAF
来进行访问。
-
所以WRITE_EXTERNAL_STORAGE权限,在未来的Android11版本里,会被废弃。 (写文件不需要权限,只能在私有目录和公共目录写文件)
三、分区存储适配
旧版存储位置迁移
除了应用的私有目录和公共目录,其他位置都称为
旧版存储位置
,我们需要将旧版存储位置的数据迁移到能兼容分区存储的位置。
-
如果以Android 11为目标平台的应用,需要在manifest清单中标记
preserveLegacyExternalStorage
为true,这样在Android11的机器上
覆盖安装
时,才能访问旧版存储位置,卸载重装会失效。
-
如果以Android10为目标平台,覆盖安装可以访问旧版存储,且将manifest清单中标记
requestLegacyExternalStorage
为true,在Android10机器上
重新安装
也能访问旧版存储位置。在Android11的机器上两种安装方式都会失效,需要加上preserveLegacyExternalStorage = true,且
覆盖安装
才能访问旧版存储位置。卸载重装会失效。
-
如果以Android 9及以下为目标平台时,就能正常的进行文件移动。将应用在外部存储器根目录的保存的数据中,如果能接受随应用的卸载而删除的文件,迁移至storage/emulated/0/android/data/packageName/目录下。需要和其他应用共享的媒体文件,迁移至媒体存储位置。
正确使用读写API
-
只在外部存储的应用私有目录下,用直接路径读写文件
-
访问或者共享媒体文件,使用MediaStore在公共目录下读写文件
-
访问或者共享非媒体文件,使用系统的文件选择器SAF在公共目录Download下读写文件
作者:xlq
链接:https://www.jianshu.com/p/87d4d4071255
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
This entry was posted in
计算机相关
on
by
xiapan
.
Post navigation
←
miniPCI-E 做PCB封装总结
QT 远程布置的方法 利用rsyns 复制二进制方式
→