uni-app app端无法调出系统文件管理器,android需用action_get_content配合category_openable和mime类型设置,并解析content://uri;ios须配置nsdocumentpickerusagedescription后调uidocumentpickerviewcontroller;读取必须用uni.getfilesystemmanager().readfile或plus.io,禁用uni.readfile。

uni-app 在 App 端根本调不出系统级“文件管理器”界面(比如 Android 的“文件”App 或 iOS 的“文件”App),uni.chooseFile 和 uni.chooseMessageFile 默认只打开相册/相机 —— 这是绝大多数人卡住的第一步。
Android 端用 ACTION_GET_CONTENT 启动系统文件选择浮层
不是“打开文件管理器”,而是唤起系统级文件选择器(类似 Chrome 里点击 input file 弹出的界面)。关键不是 Intent 动作,而是返回路径能否真正读取:
-
Intent.ACTION_GET_CONTENT是最稳妥的选择,兼容 Android 4.0+,比ACTION_OPEN_DOCUMENT更少权限限制 - 必须加
intent.addCategory(Intent.CATEGORY_OPENABLE),否则华为 EMUI、小米 MIUI 等 ROM 可能不显示任何文件项 -
intent.setType("application/pdf")比"*/*"更可靠;用".pdf"会白屏,MIME 类型写错直接失败 - 返回的是
content://URI,不是文件路径;HBuilderX 3.9.12+ 可用plus.android.resolveNativeUri(uri)解析,旧版本需手动查ContentResolver的_data字段(KitKat+ 有兼容性坑) - Android 10+ 必须在
manifest.json中开启requestLegacyExternalStorage,否则解析结果为空
iOS 端只能用 UIDocumentPickerViewController
iOS 没有全局文件管理器可“打开”,UIDocumentPickerViewController 是唯一合规方式,它弹出一个系统浮层,让用户从“iCloud Drive”或“On My iPhone”里选文件:
- 必须在
manifest.json → iOS → 权限配置中添加NSDocumentPickerUsageDescription字符串(仅此一项有效,NSPhotoLibraryUsageDescription完全不管用) - 首次调用会弹系统权限框;若未配描述字段,调用静默失败,控制台无报错、无回调
- 返回的是
file://临时路径,可直接传给uni.getFileSystemManager().readFile,但 iOS 14+ 对 iCloud 同步中未完成下载的文件可能返回null,需判空 - 不支持 MIME 类型过滤(如只让选 PDF),只能靠前端对
res.type或后缀做二次校验
拿到路径后千万别用 uni.readFile
uni.readFile 只认 tempFilePath(来自 uni.uploadFile 或 uni.downloadFile),对原生返回的真实路径(如 /data/user/0/... 或 file://...)会报 no permission 或读出空内容:
- App 端应统一用
uni.getFileSystemManager().readFile,它支持原生路径,且无需额外权限声明 - 更底层、更稳定的方式是
plus.io.resolveLocalFileSystemURL+FileReader,尤其适合读二进制内容(如上传前转 base64) - 注意:
uni.getFileSystemManager在 App 端实际不可用(返回空对象),这是 runtime 限制,别浪费时间调试它
鸿蒙端要用 UTS 插件 ebook-files-harmony
鸿蒙 App 不支持 uni.chooseFile 或 plus.android,必须用 UTS 原生插件;ebook-files-harmony 是免费方案,但仅限鸿蒙:
- 必须用 HBuilderX ≥3.1.0 制作「自定义调试基座」并勾选鸿蒙,普通基座无法触发 UTS 能力
-
selectFiles({ extensions: ['pdf', 'docx'], copyToCache: true })中copyToCache: true很关键——false 返回的临时 URI 应用重启后失效 - 鸿蒙不支持
mimeTypes过滤,extensions数组才是唯一生效的过滤方式 - Android/iOS 需搭配付费插件
ebook-select-files才能三端 API 统一,否则得写三套逻辑
最容易被忽略的是:所有平台返回的都不是“即用型路径”,URI 解析、临时路径生命周期、读取 API 选型这三环只要断一环,文件就读不出来。别假设路径能直接传给 uni.uploadFile,先验证 uni.getFileSystemManager().readFile 是否真能读出字节长度。











