达美小生活

有用的内容创作

如何开启外置sd卡权限设置(需要访问手机sd卡权限)

引言

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+上进行文件操作的所有关键技巧,为用户打造、且好的应用体验。