Cordova插件File的externalRootDirectory始终返回null问题排查
Cordova File插件externalRootDirectory返回null排查方案
权限适配问题(最高发)
如果近期升级了App的targetSdkVersion到33(对应Android13)及以上,原有存储权限已失效:
- 原有
WRITE_EXTERNAL_STORAGE、READ_EXTERNAL_STORAGE权限在Android13+已废弃,需要根据文件类型补充配置READ_MEDIA_IMAGES/READ_MEDIA_VIDEO/READ_MEDIA_AUDIO权限,若要访问公共下载目录还需要申请MANAGE_EXTERNAL_STORAGE特殊权限 - 补充运行时动态权限申请逻辑:当前代码没有前置权限校验,需要先申请存储权限、用户授权完成后再调用File插件API
插件版本适配问题
如果近期升级过cordova-plugin-file或@ionic-native/file依赖包,部分高版本对Android12+的存储适配逻辑变更会触发该问题:
- 回退到之前功能正常时的插件版本验证,推荐稳定兼容版本:cordova-plugin-file@7.0.0、@ionic-native/file@5.36.0
代码逻辑优化
当前代码缺少插件初始化就绪校验:
- 必须等待
this.platform.ready()回调完成后再读取File插件属性,避免插件未初始化完成返回null - 增加目录降级逻辑:如果externalRootDirectory返回空,优先使用
this.file.externalDataDirectory(App专属外部存储目录,无需额外权限即可访问)替代,兼容不同设备权限配置,参考代码:
async downloadFile(base64String: string, extension: string, fileName: string) { // 新增等待平台就绪逻辑 await this.platform.ready(); // 这里可以插入动态权限申请逻辑,确认授权后再执行后续代码 const dt = new Date().toISOString().slice(0, 19).split('-').join('').split(':').join(''); fileName = `${fileName}-${dt}.${extension}`; const blob = this.b64toBlob(base64String, this.getMimeTypeFromExt(extension)); if (this.platform.is('android')) { let path = ''; // 新增目录判空降级逻辑 if (this.file.externalRootDirectory) { path = `${this.file.externalRootDirectory}Download/`; } else { path = `${this.file.externalDataDirectory}Download/`; // 若需要系统文件管理器可见,可后续调用媒体扫描接口更新系统媒体库 } // 原有写入、打开文件逻辑不变 this.file.writeFile(path, fileName, blob) .then(() => { this.fileOpener.open(`${path}${fileName}`, this.getMimeTypeFromExt(extension)).then( () => { }).catch((error) => { this.notificationService.error(MSG.OPENING_DOCUMENT_ERROR); }); }).catch((error) => { this.notificationService.error(MSG.DOWNLOADED_DOCUMENT_ERROR); }); } else { const fileURL = URL.createObjectURL(blob); if ( extension === 'pdf' ) { const newWindow = window.open(); newWindow.location.href = fileURL; } else { const link = document.createElement("a"); link.href = fileURL; link.download = fileName link.click(); } } }
快速验证方法
进入测试设备的应用设置页面,手动开启存储权限后重启App,若功能恢复即可定位为权限申请逻辑缺失问题。
内容的提问来源于stack exchange,提问作者Leandro Hernández Mira
相关产品推荐
相关产品推荐

