You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中如何通过Media Store API向用户选择的目录写入JSON文件

在用户选择的目录中创建并写入JSON文件(Android)

步骤1:处理目录选择结果并持久化权限

在onActivityResult中接收用户选择的目录URI,先持久化权限(保证应用重启后仍能访问该目录),再通过DocumentFile获取目录实例:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == REQUEST_CODE_FOLDER_PERMISSION && resultCode == Activity.RESULT_OK) {
        data?.data?.let { treeUri ->
            // 持久化目录访问权限
            contentResolver.takePersistableUriPermission(
                treeUri,
                Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
            )

            // 转换为可操作的DocumentFile实例
            val targetDir = DocumentFile.fromTreeUri(this, treeUri)
            targetDir?.let {
                // 调用写入方法,传入文件名和JSON内容
                writeJsonToDirectory(it, "backup_config.json", "{\"backupTime\":\"2024-05-20\",\"dataSize\":1024}")
            }
        }
    }
}

步骤2:创建JSON文件并写入内容

实现具体的文件创建与写入逻辑,利用ContentResolver操作文件流:

private fun writeJsonToDirectory(targetDir: DocumentFile, fileName: String, jsonContent: String) {
    // 检查目录下是否已存在同名文件,存在则直接覆盖
    var jsonFile = targetDir.findFile(fileName)
    // 不存在则创建新的JSON文件
    if (jsonFile == null) {
        jsonFile = targetDir.createFile("application/json", fileName)
    }

    jsonFile?.uri?.let { fileUri ->
        // 打开输出流并写入内容,use关键字自动关闭流
        contentResolver.openOutputStream(fileUri)?.use { outputStream ->
            outputStream.write(jsonContent.toByteArray(Charsets.UTF_8))
            Toast.makeText(this, "JSON文件写入成功", Toast.LENGTH_SHORT).show()
        } ?: run {
            Toast.makeText(this, "无法打开文件输出流", Toast.LENGTH_SHORT).show()
        }
    } ?: run {
        Toast.makeText(this, "创建JSON文件失败", Toast.LENGTH_SHORT).show()
    }
}

关键说明

  • 权限持久化:必须调用takePersistableUriPermission,否则应用重启后之前获取的目录访问权限会失效。
  • MIME类型:创建文件时指定application/json,符合JSON文件的标准类型,确保系统能正确识别。
  • 流安全:使用use关键字包裹输出流,自动完成资源释放,避免内存泄漏。
  • 兼容性:该方案支持Android 5.0(API 21)及以上版本,与ACTION_OPEN_DOCUMENT_TREE的最低适配版本一致。

内容的提问来源于stack exchange,提问作者svprdga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 21:45:38