更新记录
1.0.0(2026-09-22)
- 新增 U 盘和移动硬盘文件管理,可浏览文件和文件夹、读取内容、写入文本、创建文件夹、重命名和删除。
- 新增应用与 U 盘、移动硬盘之间的双向复制,可查看进度并在需要时取消。
- 新增目录授权记忆和存储连接状态查询;写入同名文件失败时保留原文件,避免误覆盖已有资料。
- 优化示例页面的打开体验、按钮布局和操作说明。
- 修复 Android 查询存储能力和选择目录时偶发失败的问题。
- 修复复制取消、释放授权和写入失败时可能留下未完成任务的问题。
- 修复部分平台无法正常返回“不支持”提示的问题。无需修改调用代码;Android 更新后需要重新制作并安装自定义基座或重新打包 App。
- 首版支持 Android 的 uni-app 和 uni-app x 项目,其他平台暂不支持。首次使用时,请在系统文件选择器中选择允许访问的目录。
平台兼容性
uni-app(5.24)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| - | - | × | × | - | - | √ | × | × |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| × | × | - | - | - | - | - | - | - | - | - | - |
uni-app x(5.24)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| × | × | √ | × | × | × |
lizhao-usb-storage
lizhao-usb-storage 让 Android 应用可以在用户选择授权后,直接浏览、读取和写入 U 盘、移动硬盘中的文件。它适合现场资料交换、离线导入导出和移动备份,可同时用于 uni-app 与 uni-app x。
功能特色
- 文件管理:浏览文件和文件夹,查看文件大小与修改时间,创建文件夹、重命名和删除。
- 文件读写:读取或保存文本及其他文件内容,满足资料导入、数据导出等需求。
- 双向复制:将应用中的文件复制到 U 盘或移动硬盘,也可将外置存储中的文件复制到应用。
- 进度与取消:查看复制进度,按需中途取消。
- 记住授权:再次打开应用时可恢复仍有效的目录授权,减少重复选择。
- 连接状态:查询系统识别到的存储设备,接收连接状态变化通知。
适合哪些场景
| 使用场景 | 推荐功能 | 可以完成什么 |
|---|---|---|
| 现场采集后导出 | copyToStorage |
把应用内生成的照片、表格、压缩包导出到 U 盘。 |
| 离线资料导入 | copyFromStorage、readFile |
从 U 盘读取资料或复制到应用内继续处理。 |
| 移动硬盘备份 | listEntries、copyToStorage |
浏览目录并把应用资料备份到移动硬盘。 |
| 文本配置交换 | writeTextFile、readTextFile |
保存和读取配置、日志、清单等文本。 |
| 文件整理 | createDirectory、renameEntry、deleteEntry |
创建文件夹、重命名文件、删除不需要的内容。 |
首次使用时,需要在系统文件选择器中选择允许访问的文件夹;插件只操作用户明确授权的目录。
下载与导入
- 在插件市场选择“使用 HBuilderX 导入插件”,导入到 uni-app 或 uni-app x 项目。
- 保留完整的
uni_modules/lizhao-usb-storage目录,不要修改插件目录名。 - 在页面脚本中从插件根目录导入:
import {
getCapabilities,
pickStorageRoot,
listEntries,
writeTextFile,
readTextFile
} from '@/uni_modules/lizhao-usb-storage'
完整示例位于插件目录的 example/ 下:
- uni-app:
example/uniapp/index.vue - uni-app x:
example/uniappx/index.uvue
5 分钟跑通
先完成“查询能力 → 选择目录 → 文件操作”这三个步骤,再按业务需要添加复制、进度和状态监听。
1. 导入插件并查询能力
import {
getCapabilities,
pickStorageRoot,
listEntries,
writeTextFile,
readTextFile
} from '@/uni_modules/lizhao-usb-storage'
getCapabilities({
success: (res) => {
console.log('USB 存储能力', res)
},
fail: (err) => {
console.error('查询能力失败', err.errCode, err.errMsg)
}
})
2. 让用户选择外置存储目录
let storageId = ''
pickStorageRoot({
title: '请选择 U 盘或移动硬盘目录',
success: (storage) => {
storageId = storage.storageId
console.log('已取得存储授权', storage.displayName)
},
fail: (err) => {
console.error('选择目录失败', err.errCode, err.errMsg)
}
})
用户取消选择会返回 9036005。目录授权失效、系统拒绝访问或存储设备断开时,请提示用户重新连接设备并选择可访问的文件夹。
3. 写入并读回文本
writeTextFile({
storageId,
path: '/lizhao-demo/hello.txt',
text: '你好,USB 存储!',
encoding: 'utf-8',
createParents: true,
success: () => {
readTextFile({
storageId,
path: '/lizhao-demo/hello.txt',
success: (res) => console.log('读回内容', res.text),
fail: (err) => console.error('读取失败', err.errCode, err.errMsg)
})
},
fail: (err) => console.error('写入失败', err.errCode, err.errMsg)
})
所有异步 API 均使用 success、fail、complete 回调。失败时不会调用 success;complete 最多调用一次。
接入方式选择
| 你的需求 | 推荐入口 | 阅读位置 |
|---|---|---|
| 先确认当前设备是否可用 | getCapabilities |
模块一:能力与授权 |
| 浏览和管理 U 盘文件 | listEntries、statEntry、createDirectory |
模块二:文件与目录 |
| 读取或保存文本、二进制文件 | readTextFile、writeTextFile、readFile、writeFile |
模块三:文件读写 |
| 导入导出大文件 | copyFromStorage、copyToStorage |
模块四:双向复制 |
| 监听 U 盘插拔和释放资源 | onStorageEvent、releaseResources |
模块五:连接状态 |
模块介绍
模块一:能力与授权
getCapabilities 只查询当前平台是否支持;pickStorageRoot 打开系统文件选择器,让使用者选择 U 盘或移动硬盘中的目录。选择成功后保存返回的 storageId,后续所有文件操作都使用它。
模块二:文件与目录
使用 listEntries 浏览目录,使用 statEntry 查看文件信息,使用 createDirectory、renameEntry 和 deleteEntry 完成整理。传入的路径只能是已授权目录内的相对路径,根目录不能删除。
模块三:文件读写
文本文件优先使用 readTextFile 和 writeTextFile;小型二进制文件使用 readFile 和 writeFile。写入同名文件时默认失败并保留原文件,避免误覆盖已有资料。
模块四:双向复制、进度与取消
copyToStorage 把应用内文件复制到 U 盘,copyFromStorage 把 U 盘文件复制到应用目录。复制开始会通过 onStart 返回 taskId,进度通过 onProgress 返回;用户点击取消时调用 cancelTask。
模块五:连接状态与资源释放
listStorages 可恢复仍有效的目录授权,listMountedVolumes 可查看系统识别到的存储设备;onStorageEvent 用于接收插拔变化。页面销毁或不再使用插件时调用 releaseResources。
常用参数
| 参数 | 类型 | 说明 |
|---|---|---|
storageId |
string |
pickStorageRoot 或 listStorages 返回的目录标识。 |
path |
string |
所选目录内的文件或文件夹路径;空字符串或 / 表示所选目录。 |
recursive |
boolean |
默认 false。创建多层文件夹或删除非空文件夹时传 true;listEntries 只列出当前层,不支持传 true。 |
createParents |
boolean |
父目录不存在时是否按路径创建,默认 false。 |
overwrite |
boolean |
是否请求覆盖同名文件,默认 false。向外置存储写入时请保留默认值;同名文件会报错,原文件不会被覆盖。 |
maxBytes |
number |
readFile 允许读取的最大字节数;超过限制返回读取失败,建议使用复制 API。 |
encoding |
string |
文本编码,首版建议使用 utf-8。 |
文件路径必须位于用户已选择并授权的目录内。不要传入完整系统地址、盘符路径、包含 .. 的越界路径或空文件名;违规返回 9036017。
文件与目录 API
| API | 用途 | 关键返回 |
|---|---|---|
listStorages |
恢复已保存且仍有效的目录授权 | StorageHandle[] |
listMountedVolumes |
查看系统识别到的存储设备及状态 | MountedVolume[] |
listEntries |
列出当前目录条目 | StorageEntry[] |
statEntry |
查询文件或目录元数据 | StorageEntry |
readFile |
读取小型二进制文件 | { data: ArrayBuffer, size } |
readTextFile |
按编码读取文本 | { text, size } |
writeFile |
写入 ArrayBuffer |
{ ok: true } |
writeTextFile |
写入文本 | { ok: true } |
createDirectory |
创建目录 | StorageEntry |
deleteEntry |
删除条目;根目录禁止删除 | { ok: true } |
renameEntry |
在同一父目录内重命名 | StorageEntry |
二进制 readFile 面向小文件并受 maxBytes 限制。大文件请使用 copyFromStorage,避免把完整内容一次性放入 JavaScript 内存。
文件复制、进度与取消
复制开始后先触发 onStart,立即提供可取消的 taskId;随后通过 onProgress 报告进度,最终由 success 或 fail 结束。
let taskId = ''
copyToStorage({
sourcePath: `${uni.env.USER_DATA_PATH}/export.zip`,
storageId,
targetPath: '/backup/export.zip',
createParents: true,
onStart: (res) => {
taskId = res.taskId
},
: (progress) => {
console.log(progress.taskId, progress.completedBytes, progress.totalBytes, progress.state)
},
success: () => console.log('复制完成'),
fail: (err) => console.error('复制失败', err.errCode, err.errMsg)
})
// 用户点击取消按钮时调用
if (taskId) {
cancelTask({ taskId })
}
copyFromStorage 用于从外置存储复制到应用可写的本地路径。每个 storageId 同时只允许一个活动写入任务;取消时会停止复制,并尝试清理本次新建且未完成的目标文件。对已完成、未知或已取消的 taskId 请求取消时,会返回明确错误。
覆盖策略
向外置存储写入或复制文件时,请使用默认的 overwrite: false。发现同名文件会返回错误并保留原文件,可更换目标文件名后重试。当前不支持覆盖外置存储中的文件,传入 overwrite: true 也会返回错误。
可用功能与连接状态
getCapabilities仅查询平台能力,不会自动申请权限。pickStorageRoot打开系统文件选择器,取得并保存用户选择的目录授权。checkAllFilesAccessPermission与openAllFilesAccessSettings用于查询或打开 Android “所有文件访问”设置;使用本插件读写已授权目录不需要开启此项。UsbStorageCapabilities.usbPermission不能作为文件可读写的判断依据,文件访问以所选目录的授权结果为准。onStorageEvent/offStorageEvent用于接收或停止接收存储连接变化通知。收到通知后请重新调用listStorages检查目录是否仍可访问,必要时重新选择目录。releaseStorage撤销指定目录的授权;releaseResources取消任务、停止接收通知并清理当前使用的资源。
支持平台
| 运行环境 | 支持情况 | 行为 |
|---|---|---|
| uni-app Android App | 支持 | Android 5.0 及以上;使用前在系统文件选择器中选择可访问目录。 |
| uni-app x Android App | 支持 | 文件操作与 uni-app 相同;系统版本还需满足项目要求。 |
| iOS App | 不支持 | 所有真实 USB 存储 API 返回 9036001。 |
| HarmonyOS App | 不支持 | 返回 9036001,不返回伪造的空成功结果。 |
| Web / 微信、支付宝等小程序 | 不支持 | 返回 9036001。 |
插件只能访问系统文件选择器中显示且已获授权的目录。能否识别 U 盘或移动硬盘取决于设备系统、磁盘格式和供电情况;部分设备只能选择盘内文件夹。插件不提供磁盘格式化或分区功能。
错误码
| 错误码 | 含义 | 建议 |
|---|---|---|
9036001 |
当前平台不支持 USB 存储 | 仅在 Android App 使用。 |
9036002 |
参数不合法 | 检查必填字段、编码和回调。 |
9036003 |
Android 上下文不可用 | 等待 App 页面/运行时就绪后重试。 |
9036004 |
系统文件选择器不可用或目录无法访问 | 更换系统文件选择器中的目录。 |
9036005 |
用户取消目录选择 | 重新提示用户选择。 |
9036006 |
目录授权未保存或已失效 | 重新选择目录。 |
9036007 |
存储目录标识不存在 | 使用最新 storageId。 |
9036008 |
存储尚未准备好 | 先选择目录或恢复已保存的授权。 |
9036009 |
文件或目录不存在 | 检查路径及介质连接状态。 |
9036010 |
文件/目录类型不匹配 | 确认 API 与条目类型一致。 |
9036011 |
读取失败 | 检查权限、大小限制和介质状态。 |
9036012 |
写入失败 | 检查只读状态、父目录和同名文件。 |
9036013 |
复制失败 | 检查源/目标路径和可用空间。 |
9036014 |
操作已取消 | 根据业务决定是否重新复制。 |
9036015 |
介质只读或没有写权限 | 更换可写目录或介质。 |
9036016 |
设备已断开或介质已卸载 | 重新连接后重新授权。 |
9036017 |
路径越界、根目录保护或操作不安全 | 使用授权树内的相对路径。 |
9036018 |
其他系统错误 | 保留 data 脱敏信息并记录系统版本。 |
注意事项
- 首次接入或升级插件后,请重新制作并安装 Android 自定义基座或重新打包 App。
- 移动硬盘可能需要独立供电。设备已连接但文件选择器看不到目录时,先检查 OTG 转接、供电和系统文件管理器。
- 即使设备已经连接,首次读写前仍需在系统文件选择器中选择允许访问的文件夹。
- 存储设备断开或目录权限变化后,原目录可能无法访问;请重新连接并选择目录。
许可证
本插件遵循仓库许可证。

收藏人数:
购买普通授权版(
试用
赞赏(0)
下载 6486
赞赏 5
下载 12630481
赞赏 1950
赞赏
京公网安备:11010802035340号