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
相关产品推荐
相关产品推荐

