Ionic 4应用中cordova-plugin-mfilechose在Android 10无法显示文件
解决cordova-plugin-mfilechooser在Android 10无法显示文件的问题
这个问题我之前帮好几个Ionic开发者调试过,核心原因是Android 10引入的Scoped Storage(分区存储)机制,和旧版cordova-plugin-mfilechooser的文件访问逻辑不兼容导致的。下面给你几个可行的解决思路:
1. 先尝试升级插件并配置兼容开关
很多旧版本的cordova-plugin-mfilechooser没有适配Android 10的存储规则,先做这两步快速验证:
- 首先升级插件到最新版本:
ionic cordova plugin update cordova-plugin-mfilechooser - 然后在项目的
config.xml中添加Android 10的兼容配置,让应用暂时使用旧版存储模型:
配置完成后重新编译Android项目,这个方法能快速解决大部分Android 10的适配问题,但注意Android 11及以上这个配置会失效,适合临时过渡。<platform name="android"> <!-- 开启旧版存储兼容(Android 10专属) --> <edit-config file="AndroidManifest.xml" mode="merge" target="/manifest/application"> <application android:requestLegacyExternalStorage="true" /> </edit-config> <!-- 确保添加读存储权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> </platform>
2. 替换为更适配的插件(推荐长期方案)
如果升级插件后还是不行,建议换用维护更活跃、适配最新Android版本的插件组合:cordova-plugin-document-picker + @ionic-native/document-picker,这是Ionic官方推荐的文件选择方案之一。
安装步骤:
# 安装cordova插件 ionic cordova plugin add cordova-plugin-document-picker # 安装Ionic Native包装器 npm install @ionic-native/document-picker/ngx
使用示例(Ionic 4+ 风格):
先在你的页面模块中导入DocumentPicker:
import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { DocumentPicker } from '@ionic-native/document-picker/ngx'; @NgModule({ imports: [CommonModule], providers: [DocumentPicker] // 添加到providers }) export class YourPageModule { }
然后在页面组件中使用:
import { Component } from '@angular/core'; import { DocumentPicker } from '@ionic-native/document-picker/ngx'; @Component({ selector: 'app-your-page', templateUrl: './your-page.page.html', styleUrls: ['./your-page.page.scss'], }) export class YourPagePage { constructor(private documentPicker: DocumentPicker) { } openFileChooser() { // 指定要选择的文件类型,对应doc、xls、ppt this.documentPicker.pick({ type: [ 'application/msword', 'application/vnd.ms-excel', 'application/vnd.ms-powerpoint' ] }).then(fileUri => { alert(fileUri); }).catch(error => { alert(error); }); } }
这个方案不仅适配Android 10+,还支持iOS等其他平台,稳定性和兼容性更好。
3. 手动修改mfilechooser插件代码(如果一定要用原插件)
如果你坚持使用cordova-plugin-mfilechooser,需要修改它的Android源码来适配Scoped Storage:
- 找到插件的Android源码文件:
plugins/cordova-plugin-mfilechooser/src/android/MFileChooser.java - 修改Intent的创建逻辑,使用Android 10推荐的文件选择方式:
- 将原来的
ACTION_GET_CONTENT替换为ACTION_OPEN_DOCUMENT - 添加权限标记:
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION) - 确保Intent的类型参数正确,符合Android的MIME类型规范
- 将原来的
修改完成后重新编译项目,就能让插件适配Android 10的文件访问规则了。
内容的提问来源于stack exchange,提问作者Vasanth
相关产品推荐
相关产品推荐

