【问题标题】:How to write a JSON file to a specific location using the Media Store API in Android如何在 Android 中使用 Media Store API 将 JSON 文件写入特定位置
【发布时间】:2023-01-23 01:28:36
【问题描述】:

在 Android 上调用了一个目录选择器:

val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
intent.addFlags(
     Intent.FLAG_GRANT_READ_URI_PERMISSION
             or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
             or Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
             or Intent.FLAG_GRANT_PREFIX_URI_PERMISSION
)

activity?.startActivityForResult(intent, REQUEST_CODE_FOLDER_PERMISSION)

并在onActivityResult() 中获得了所述路由的 URI,作为表单的 URI(例如,在选择名为备份在外部存储的根目录中):

content://com.android.externalstorage.documents/tree/primary:backup

此时,您如何将文件写入该位置?在研究了关于如何使用 Media Store API 编写文件的各种答案后,我看到的所有示例都使用常量来引用现有的媒体目录,但就我而言,我想创建一个新文档(这是一个 JSON 文件)在用户选择的目录中。

【问题讨论】:

  • “你如何将文件写入该位置?” -- 使用DocumentFile.fromTreeUri() 包装Uri。在 DocumentFile 上使用 ``createFile()` 来创建代表该文件的 DocumentFile。在文件的 DocumentFile 上使用 getUri() 以获得指向您要创建的文件的 Uri。在ContentResolver 上致电openOutputStream(),提供Uri,以获得该位置的OutputStream。然后,将您的内容写入该 OutputStreamflush()close() 流,您应该完成了。

标签: android mediastore


【解决方案1】:

如果您使用 ACTION_OPEN_DOCUMENT_TREE 获取 uri 来获取文件夹权限,则不会使用 MediaStore 来保存文件。

只需继续使用存储访问框架并实施 DocumentFile.createFile()。

学习 SAF 的非常基本的练习。

如果你想使用 MediaStore 来保存文件,那么你不需要用户先选择一个文件夹。

【讨论】:

    【解决方案2】:

    感谢@CommonsWare 为我指明了正确的方向:

    var outputStream: OutputStream? = null
    
    try {
        val uri = Uri.parse(path)
        val document = DocumentFile.fromTreeUri(context, uri)
        val file = document?.createFile(mimeType, filename)
            ?: throw Exception("Created file is null, cannot continue")
        val fileUri = file.uri
    
        val contentResolver = context.contentResolver
        outputStream = contentResolver.openOutputStream(fileUri)
    
        val bytes = content.toByteArray()
        outputStream?.write(bytes)
        outputStream?.flush()
    
    } catch (e: Exception) {
        // Handle error
    } finally {
        outputStream?.close()
    }
    

    【讨论】:

      猜你喜欢
      • 2020-04-07
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      • 2013-12-06
      • 2017-11-09
      • 2011-08-12
      • 2015-12-25
      • 1970-01-01
      相关资源
      最近更新 更多