📅  最后修改于: 2023-12-03 14:59:16.074000             🧑  作者: Mango
在 Android 中,数据存储是一个非常重要的话题。范围存储是一种在 Android 10(API 级别 29)和更高版本中引入的新型存储解决方案,它允许应用程序通过框架 API 访问指定范围内的文件和目录,而不需要访问设备存储权限。
使用范围存储可以带来以下好处:
范围存储有两种访问模式:基于读取的和基于 URI 的。以下是如何使用每种模式:
基于读的模式将文件的读取限制在应用程序的应用特定目录中。以下是如何使用此模式在应用程序中创建和访问文件:
val fileContents = "Hello world!"
val filename = "hello_world.txt"
val outputStream: OutputStream? = contentResolver.openOutputStream(createFile(Uri.parse("content://com.your.package.name.documents/" + filename), "text/plain"))
outputStream?.write(fileContents.toByteArray())
outputStream?.close()
以上代码使用了 contentResolver 的 openOutputStream 方法在应用程序的应用特定目录中创建一个文本文件,并向其写入了字符串 "Hello world!"。
从 Android 11 开始,如果需要访问公共存储空间中的文件,则应在清单文件中声明 ACTION_OPEN_DOCUMENT_TREE 权限。
基于 URI 的模式使应用程序能够访问特定 URI 范围中的文件和目录。以下是如何使用此模式在应用程序中创建和访问文件:
val fileContents = "Hello world!"
val filename = "hello_world.txt"
val documentFile = DocumentFile.fromSingleUri(context, createFile(Uri.parse("content://com.android.externalstorage.documents/tree/primary%3AMyFolder"), filename))
val outputStream = context.contentResolver?.openOutputStream(documentFile?.uri!!)
val outputStreamWriter = OutputStreamWriter(outputStream!!)
outputStreamWriter.write(fileContents)
outputStreamWriter.close()
以上代码使用了 DocumentFile 的 fromSingleUri 方法创建了一个指向设备主目录下名为 “MyFolder” 的文件夹的 URI,然后使用内容提供者从此 URI 中打开一个输出流,在其中写入了字符串 "Hello world!"。
请注意,在创建文件时需要在文件名中添加适当的文件扩展名,以便 Android 框架知道要将其识别为哪种 MIME 类型。
范围存储是一种安全的存储解决方案,可以帮助应用程序管理和访问其数据。通过采用范围存储,应用程序可以减少对存储权限的需求,并向用户提供更好的控制文件和目录访问权限的方式。以上便是 Android 中的范围存储的相关介绍,希望对您有所帮助。