新闻

Android 10+下文件操作的终极指南

日期: 来源:铲子手游网

Android 10+下文件操作的终极指南

引言

Android 10引入了作用域存储(Scoped Storage),彻底改变了应用程序访问设备存储的方式。这个变化旨在提高用户隐私保护,但同时也为开发者带来了新的挑战。本文旨在深入探讨Android 10+的文件操作,涵盖内外部存储的区别、DocumentFile的使用、公共目录和自定义目录的限制,以及如何在这些目录下读写不同类型的文件。

一、内部存储 vs 外部存储

在深入探讨之前,首先要理解内部存储和外部存储的区别。

内部存储(Internal Storage):这是应用专有的存储空间,无需任何权限即可访问。文件保存在这里,其他应用或用户无法访问。外部存储(External Storage):指设备的存储空间,包括内置的SD卡和物理SD卡。在作用域存储中,对这部分存储空间的访问受到限制。二、DocumentFile:作用域存储中的重要工具

在作用域存储中,DocumentFile类提供了一种方式来访问、创建、删除文件和目录。特别是在用户授予特定目录的访问权限后。

使用DocumentFile

以下是如何使用DocumentFile来创建和读取文件的示例:

创建文件:

Uri treeUri = ...; // 从文件选择器获得的Uri

DocumentFile pickedDir = DocumentFile.fromTreeUri(context, treeUri);

DocumentFile newFile = pickedDir.createFile("text/plain", "my-document");

读取文件:

Uri fileUri = ...; // 文件的Uri

DocumentFile documentFile = DocumentFile.fromSingleUri(context, fileUri);

InputStream inputStream = getContentResolver().openInputStream(fileUri);

// 读取inputStream...

三、公共目录和自定义目录的限制

在Android 10+中,对于SD卡的公共目录(如Download、Music、Documents)和自定义目录(如CustomDir)的访问受到了新的限制。

访问公共目录下载和文档(Download & Documents):可以通过MediaStore.Downloads和MediaStore.Files来访问这些目录。音乐、图片、视频(Music, Pictures, Videos):可以通过对应的MediaStore类(如MediaStore.Audio)来访问。自定义目录对于非媒体文件的自定义目录,通常需要用户通过文件选择器授予权限,然后可以使用DocumentFile进行操作。四、读写不同类型文件的实战演练

下面是在不同场景下操作文件的详细指南:

1. 在Downloads目录下操作文件

写入文件:

ContentValues values = new ContentValues();

values.put(MediaStore.Downloads.DISPLAY_NAME, "example.txt");

values.put(MediaStore.Downloads.MIME_TYPE, "text/plain");

values.put(MediaStore.Downloads.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS);

Uri uri = getContentResolver().insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI, values);

2. 在Music目录下操作音乐文件

查询音乐文件:

Uri collection = MediaStore.Audio.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);

// 省略查询逻辑代码...

3. 在自定义目录(如CustomDir)下操作文件

创建自定义目录:

Uri treeUri = ...; // 文件选择器获取的Uri

DocumentFile pickedDir = DocumentFile.fromTreeUri(context, treeUri);

DocumentFile newDir = pickedDir.createDirectory("CustomDir");

// 在新目录中创建文件 DocumentFile newFile = newDir.createFile("text/plain", "example.txt");

五、注意事项和常见错误

在适应Android 10+的文件操作时,有几个关键点需要注意:

权限请求:虽然作用域存储减少了对存储权限的需求,但在某些情况下仍需请求READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE权限。

文件URI的保存:当用户通过文件选择器授权访问某个文件或目录后,可以保存返回的URI以便后续使用。但请注意,重启设备后这些授权可能会失效。

文件类型和MIME类型:在使用MediaStore或DocumentFile创建文件时,正确的MIME类型非常重要,它决定了文件如何被处理和识别。

缓存文件处理:对于临时文件,考虑使用内部存储的缓存目录。这些文件不需要用户授权即可操作,并且系统可能在存储空间不足时自动删除它们。

测试不同的设备和版本:由于不同品牌和型号的设备可能对作用域存储的实现有细微差异,所以在多种设备和Android版本上测试您的应用至关重要。

六、进阶实践:操作SD卡上的文件

处理外置SD卡上的文件时,作用域存储的限制更加显著。以下是一些关键点:

访问权限:对于外置SD卡上的文件,您通常需要通过存储访问框架(Storage Access Framework,SAF)来获取访问权限。使用DocumentFile:一旦获得了对SD卡某个目录的访问权限,您可以使用DocumentFile来操作那个目录下的文件。

示例代码:在外置SD卡创建文件

Uri sdCardUri = ...; // 从SAF获取的Uri

DocumentFile sdCardDir = DocumentFile.fromTreeUri(context, sdCardUri);

DocumentFile newFile = sdCardDir.createFile("text/plain", "myTextFile.txt");

七、备份与恢复

在应用中实现数据备份和恢复时,作用域存储也带来了新的挑战和机会。

云备份:考虑使用云服务来备份用户数据,这不受本地存储限制。使用Auto Backup:对于应用内部存储的数据,可以使用Android的Auto Backup功能来自动备份。八、综合示例:复杂文件操作

让我们通过一个更复杂的示例来展示在Android 10+中如何操作文件:

Uri collection;

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {

collection = MediaStore.Downloads.getContentUri(MediaStore.VOLUME_EXTERNAL);

} else {

collection = MediaStore.Downloads.EXTERNAL_CONTENT_URI;

}

ContentValues values = new ContentValues();

values.put(MediaStore.Downloads.DISPLAY_NAME, "example.txt");

values.put(MediaStore.Downloads.MIME_TYPE, "text/plain");

values.put(MediaStore.Downloads.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS);

Uri fileUri = getContentResolver().insert(collection, values);

try (OutputStream outputStream = getContentResolver().openOutputStream(fileUri)) {

outputStream.write("Example Text".getBytes(StandardCharsets.UTF_8));

} catch (IOException e) {

e.printStackTrace();

}

九、结语:迈向未来的文件管理

Android的作用域存储是向前迈出的一大步,它为用户隐私和数据安全提供了更强的保护。对于开发者来说,虽然需要适应新的存储模型和API,但这也是提升应用质量、增强用户信任的绝佳机会。通过本文的指南,希望您能够掌握在Android 10+上进行文件操作的所有关键技巧,为用户打造安全、高效且友好的应用体验。

相关资讯

游戏排行

最新手机游戏

最新资讯