📜  Android 中的范围存储(1)

📅  最后修改于: 2023-12-03 14:59:16.074000             🧑  作者: Mango

Android 中的范围存储

在 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 的模式使应用程序能够访问特定 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 中的范围存储的相关介绍,希望对您有所帮助。