Ionic 6 + Android 12使用readAsText读取文本文件返回null求助
问题:Ionic 6 + Android 12环境下readAsText读取文本文件返回null
在Ionic 6和Android 12环境中,使用FilePath、FileChooser和File插件读取文本文件时,文件能被识别,但调用readAsText方法始终返回null。以下代码数月前可正常运行:
//PROPERTY import { Injectable } from '@angular/core'; import { File } from '@ionic-native/file/ngx'; import { Device } from '@awesome-cordova-plugins/device/ngx'; import { FileChooser } from '@ionic-native/file-chooser/ngx'; import { FilePath } from '@awesome-cordova-plugins/file-path/ngx'; import { Platform } from '@ionic/angular'; import { HttpService } from './http.service'; import { Chooser } from '@awesome-cordova-plugins/chooser/ngx'; //CONSTRUCTOR public file: File, public device: Device, private platform: Platform, public fileChooser: FileChooser, private chooser: Chooser, public http: HttpService, private filePath: FilePath .... //SNIPPET WITH ERROR this.fileChooser .open() .then((uri) => { this.filePath .resolveNativePath(uri) .then((url) => { this.file .resolveLocalFilesystemUrl(url) .then((fileEntry: any) => { this.platform.ready().then(() => { debugger; this.file.checkFile(fileEntry['nativeURL'].replace(fileEntry['name'], ''), fileEntry['name']).then(response => { debugger; if (response === true) { this.file .readAsText( fileEntry['nativeURL'].replace(fileEntry['name'], ''), fileEntry['name'] ) .then((result) => { if (result) { ----> //RESULT ONLY NULL <--------- debugger; resolve(result); } else { reject('Errore'); } }) .catch((err) => { console.log('err-->' + JSON.stringify(err)); }); } }).catch(err => { debugger; }); }); }); }) .catch((err_3) => { reject(err_3); }); }) .catch((err_2) => { reject(err_2); });
可能的解决方案
适配Android 12权限模型,改用Chooser插件
Android 12及以上对文件访问权限限制更严格,FileChooser的路径解析方式已不适配新系统。建议使用Chooser插件直接获取文件的可访问URI:this.chooser.getFile('text/*') .then(file => { fetch(file.dataURI) .then(res => res.text()) .then(text => resolve(text)) .catch(err => reject(err)); }) .catch(err => reject(err));修正文件路径处理逻辑
原代码通过字符串替换获取目录路径的方式存在风险,改用fileEntry的原生属性构建正确路径:const directory = fileEntry.fullPath.substring(0, fileEntry.fullPath.lastIndexOf('/')); const fileName = fileEntry.name; this.file.readAsText(directory, fileName) .then(result => resolve(result)) .catch(err => reject(err));更新插件至兼容版本
检查@ionic-native/file、file-chooser、file-path等插件版本,确保其适配Ionic 6和Android 12。旧版本插件可能存在权限或路径解析的兼容性bug,更新到最新稳定版即可解决。使用原生FileReader读取文件
绕过插件的readAsText方法,直接通过fileEntry获取文件对象后用原生FileReader读取:fileEntry.file(file => { const reader = new FileReader(); reader.onloadend = () => { resolve(reader.result as string); }; reader.readAsText(file); }, err => reject(err));
内容的提问来源于stack exchange,提问作者Giuseppe Taormina
相关产品推荐
相关产品推荐

