You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的兼容配置,让应用暂时使用旧版存储模型:
    <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>
    
    配置完成后重新编译Android项目,这个方法能快速解决大部分Android 10的适配问题,但注意Android 11及以上这个配置会失效,适合临时过渡。

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:

  1. 找到插件的Android源码文件:plugins/cordova-plugin-mfilechooser/src/android/MFileChooser.java
  2. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:41:42