Android应用:已实现文件夹选择,求文件保存实现方案
如何通过ACTION_OPEN_DOCUMENT_TREE获取的Uri保存文件到指定文件夹
你已经通过ACTION_OPEN_DOCUMENT_TREE拿到了目标文件夹的Uri,接下来可以借助DocumentFile类和ContentResolver完成文件保存,具体步骤和代码如下:
核心实现步骤
- 基于选中的文件夹Uri创建
DocumentFile实例,用于操作目标目录 - 在目标目录下创建(或覆盖)要保存的文件
- 通过
ContentResolver向文件写入内容
完整代码示例
1. 给保存按钮添加点击监听
saveButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (uri == null) { Toast.makeText(getApplicationContext(), "请先选择保存文件夹", Toast.LENGTH_SHORT).show(); return; } // 替换成你的文件名和要保存的内容 saveFileToTargetFolder(uri, "demo.txt", "这是测试保存的内容"); } });
2. 实现文件保存方法
private void saveFileToTargetFolder(Uri folderUri, String fileName, String fileContent) { // 初始化目标文件夹的DocumentFile DocumentFile targetFolder = DocumentFile.fromTreeUri(this, folderUri); if (targetFolder == null || !targetFolder.exists() || !targetFolder.isDirectory()) { Toast.makeText(this, "选中的文件夹无效", Toast.LENGTH_SHORT).show(); return; } // 处理已存在的文件:删除后重新创建(或者直接写入覆盖) DocumentFile targetFile = targetFolder.findFile(fileName); if (targetFile != null) { targetFile.delete(); } // 创建新文件:第一个参数是MIME类型,根据你的文件类型调整 targetFile = targetFolder.createFile("text/plain", fileName); if (targetFile == null) { Toast.makeText(this, "创建文件失败", Toast.LENGTH_SHORT).show(); return; } // 写入文件内容 try (OutputStream outputStream = getContentResolver().openOutputStream(targetFile.getUri())) { if (outputStream != null) { outputStream.write(fileContent.getBytes()); Toast.makeText(this, "文件保存成功", Toast.LENGTH_SHORT).show(); } } catch (IOException e) { e.printStackTrace(); Toast.makeText(this, "保存失败:" + e.getMessage(), Toast.LENGTH_SHORT).show(); } }
关键注意事项
- MIME类型适配:
createFile方法的第一个参数是文件的MIME类型,比如保存图片用"image/jpeg",保存JSON用"application/json",需根据你的文件类型调整。 - 持久化权限:如果希望App重启后仍能访问该文件夹,可在获取Uri后添加以下代码:
getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); - 异常处理:实际开发中需根据业务场景完善异常捕获逻辑,给用户更友好的错误提示。
内容的提问来源于stack exchange,提问作者EniteOclu
相关产品推荐
相关产品推荐

