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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 21:42:06