引言
Andid 10引入了作用域存储(Scoped Storage),改变了应用程序访问设备存储的方式。这个变化旨在用户隐私保护,但同时也为带来了新的。本文旨在深入探讨Andid 10+的文件操作,涵盖内外部存储的区别、DocumentFile的使用、公共目录和自定义目录的限制,以及如何在这些目录下读写不同类型的文件。
一、内部存储 vs 外部存储
在深入探讨之前,首先要理解内部存储和外部存储的区别。
- 内部存储(Internal Storage):这是应用专有的存储空间,无需权限即可访问。文件保存在这里,应用或用户无法访问。外部存储(External Storage):指设备的存储空间,包括内置的SD卡和物理SD卡。在作用域存储中,对这部分存储空间的访问受到限制。
二、DocumentFile:作用域存储中的重要工具
在作用域存储中,DocumentFile类提供了一种方式来访问、创建、删除文件和目录,特别是在用户授予特定目录的访问权限后。
使用DocumentFile
以下是如何使用DocumentFile来创建和读取文件的示例:
创建文件:
U treeU = 从文件选择器获得的U
DocumentFile pickedDir = (context, treeU);
DocumentFile newFile = (“text/plain”, “my-document”);
读取文件:
U fileU = 文件的U
DocumentFile documentFile = (context, fileU);
InputStream inputStream = getContentResolver.openInputStream(fileU);
// 读取
三、公共目录和自定义目录的限制
在Andid 10+中,对于SD卡的公共目录(如Download、Music、Documents)和自定义目录(如CustomDir)的访问受到了新的限制。
访问公共目录
- 和文档(Download & Documents):可以通过和来访问这些目录。音乐、片、(Music, Pictes, Videos):可以通过对应的Store类(如)来访问。
自定义目录
- 对于非媒体文件的自定义目录,通常需要用户通过文件选择器授予权限,然后可以使用DocumentFile进行操作。
四、读写不同类型文件的实战演练
下面是在不同场景下操件的详细指南:
1. 在Downloads目录下操件
写入文件:
ContentValues values = new ContentValues;
(, “text/plain”);
U i = getContentResolver.(, values);
2. 在Music目录下操作音乐文件
查询音乐文件:
U collection = ;
// 省略查询逻辑代码
3. 在自定义目录(如CustomDir)下操件
创建自定义目录:
U treeU = 文件选择器获取的U
DocumentFile pickedDir = (context, treeU);
DocumentFile newDir = (“CustomDir”);
// 在新目录中创建文件 DocumentFile newFile = (“text/plain”, “”);
五、注意事项和常见错误
在适应Andid 10+的文件操作时,有几个关键点需要注意:
权限请求:虽然作用域存储减少了对存储权限的需求,但在某些情况下仍需请求READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE权限。
文件I的保存:当用户通过文件选择器授权访问某个文件或目录后,可以保存返回的I以便后续使用。但请注意,重启设备后这些授权可能会失效。
文件类型和MIME类型:在使用Store或DocumentFile创建文件时,正确的MIME类型非常重要,它决定了文件如何被处理和识别。
缓存文件处理:对于临时文件,考虑使用内部存储的缓存目录。这些文件不需要用户授权即可操作,并且可能在存储空间不足时自动删除它们。
不同的设备和版本:由于不同品和型的设备可能对作用域存储的实现有细微差异,所以在多种设备和Andid版本上您的应用至关重要。
六、进阶实践:操作SD卡上的文件
处理外置SD卡上的文件时,作用域存储的限制更加显著。以下是一些关键点:
- 访问权限:对于外置SD卡上的文件,您通常需要通过存储访问框架(Storage Access Framework,SAF)来获取访问权限。使用DocumentFile:一旦获得了对SD卡某个目录的访问权限,您可以使用DocumentFile来操作那个目录下的文件。
示例代码:在外置SD卡创建文件
U sdCardU = 从SAF获取的U
DocumentFile sdCardDir = (context, sdCardU);
DocumentFile newFile = (“text/plain”, “”);
七、备份与恢复
在应用中实现数据备份和恢复时,作用域存储也带来了新的和机会。
- 云备份:考虑使用云服务来备份用户数据,这不受本地存储限制。使用Auto Backup:对于应用内部存储的数据,可以使用Andid的Auto Backup能来自动备份。
八、综合示例:复杂文件操作
让我们通过一个更复杂的示例来展示在Andid 10+中如何操件:
U collection;
if (>= ) {
collection = ;
} else {
collection =
ContentValues values = new ContentValues;
(, “text/plain”);
U fileU = getContentResolver.(collection, values);
try (OutputStream outputStream = getContentResolver.openOutputStream(fileU)) {
outputStream.wte(“Example Text”.getBytes);
} catch (IOException e) {
九、结语:迈向未来的文件
Andid的作用域存储是向前迈出的一大步,它为用户隐私和数据提供了更强的保护。对于来说,虽然需要适应新的存储模型和API,但这也是应用质量、增强用户信任的机会。通过本文的指南,希望您能够掌握在Andid 10+上进行文件操作的所有关键技巧,为用户打造、且好的应用体验。