Android USB OTG存储导出应用数据及目录多文件写入方法咨询
你的需求完全可实现,不需要自定义USB通信,用系统自带的存储访问框架(SAF)即可满足,你当前实现单文件写入用的就是SAF的能力。
你提到的USB主机模式自定义通信虽然也能做到,但需要自行处理USB设备枚举、存储文件系统解析等底层逻辑,开发成本高、兼容性问题多,没有特殊要求的话完全没必要走这个方案。
向USB目录批量写入多文件实现方案
核心逻辑是调用ACTION_OPEN_DOCUMENT_TREE让用户授权你访问USB存储下的指定目录,拿到目录Uri后通过DocumentFile类操作即可批量创建、写入文件,示例代码如下:
1. 注册目录选择启动器
// 注册目录选择启动器 private val dirRequestLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == Activity.RESULT_OK) { result.data?.data?.let { dirUri -> // 持久化权限,避免下次进入应用需要重新授权 contentResolver.takePersistableUriPermission( dirUri, Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION ) // 批量写入多个文件 writeMultipleFilesToDir(dirUri, mapOf( "file1.txt" to "第一个文件内容", "file2.txt" to "第二个文件内容", "file3.txt" to "第三个文件内容" )) } } }
2. 触发用户选择目标USB目录
private fun selectTargetDir() { val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) // 可选:添加标记让用户选择界面默认展示外部存储入口 intent.putExtra("android.provider.extra.INITIAL_URI", MediaStore.Files.getContentUri("external")) dirRequestLauncher.launch(intent) }
3. 批量写入文件逻辑
private fun writeMultipleFilesToDir(dirUri: Uri, fileContentMap: Map<String, String>) { val dirDocument = DocumentFile.fromTreeUri(this, dirUri) ?: return // 提前检查目录写入权限 if (!dirDocument.canWrite()) return fileContentMap.forEach { (fileName, content) -> // 创建对应文件,可根据需求修改MIME类型 val fileDocument = dirDocument.createFile("text/plain", fileName) fileDocument?.uri?.let { fileUri -> // 直接复用你已实现的单文件写入方法即可 writeInFile(fileUri, content) } } }
注意事项
- Android 11及以上版本对SAF访问USB存储没有额外限制,只要用户完成目录授权即可正常读写
- 大文件写入建议放在子线程执行,避免阻塞主线程导致ANR
- 如果需要后台自动导出,只要提前拿到持久化的目录Uri,不需要用户每次手动选择
内容的提问来源于stack exchange,提问作者M. Liver
相关产品推荐
相关产品推荐

