3***@qq.com
3***@qq.com
  • 发布:2022-03-14 10:51
  • 更新:2022-03-14 10:55
  • 阅读:8836

uni-app 使用plus.io.requestFileSystem读取本地文件, 安卓10以上系统无法读取.

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: 10

HBuilderX类型: 正式

HBuilderX版本号: 3.3.11

手机系统: Android

手机系统版本号: Android 11

手机厂商: OPPO

手机机型: 任意

页面类型: vue

vue版本: vue2

打包方式: 云端

项目创建方式: HBuilderX

示例代码:

plus.io.requestFileSystem( plus.io.PRIVATE_DOC, function(fobject){
// fs.root是根目录操作对象DirectoryEntry
fobject.root.getFile('config.xml',{create:true}, function(fileEntry){
fileEntry.file( function(file){
var fileReader = new plus.io.FileReader();
self.resInfo = JSON.stringify(file);
fileReader.readAsText(file, 'utf-8');
fileReader.onloadend = function(evt) {
self.resInfo = self.resInfo+'--'+JSON.stringify(evt);
}
self.resInfo = self.resInfo+'--'+file.size + '--' + file.name;
} );
});
} );

操作步骤:

用安卓10以上手机, 把代码示例中的 'config.xml' 替换成根目录下的文件, 然后执行该代码段, 无法获取文件

预期结果:

代码可以执行

实际结果:

代码可以执行, 但是无法读取文件

bug描述:

plus.io.requestFileSystem 使用 改方法 读取安卓10版本以上的手机的文件的时候, 是失败的.

config.xml是根目录下的文件, 而fileEntry.file( function(file)获取到的是 /storage/emulated/0/Android/data/io.dcloud.HBuilder/apps/HBuilder/(很多层) /config.xml .
安卓10之后无权限访问.
安卓10以下 以及 鸿蒙系统可以访问
请看代码

2022-03-14 10:51 负责人:无 分享
已邀请:
3***@qq.com

3***@qq.com (作者)

替代解决方案

                            let pathUrl = '/_doc/db.txt';   //指定文件路径   
            let environment = plus.android.importClass("android.os.Environment");  
            var sdRoot = environment.getExternalStorageDirectory(); //文件夹根目录  
            var File = plus.android.importClass("java.io.File");  
            var BufferedReader = plus.android.importClass("java.io.BufferedReader");  
            var FileReader = plus.android.importClass("java.io.FileReader");  
            var FileWriter = plus.android.importClass("java.io.FileWriter");  

            let readFr = new File(sdRoot + pathUrl);  
            let txt = '';  
            try {  
                var reader = new BufferedReader(new FileReader(readFr))  
                // 我的需求是读取多行,所以把每行都读出来存在数组里  
                let arr = [];  
                let txt;  
                while ((txt = reader.readLine()) != null) {  
                    arr.push(txt)  
                }  
                // 传入回调处理你的业务  
                //处理业务逻辑  
            } catch (e) {  

            }
  • 2***@qq.com

    读取txt文件可以,读取bin文件如何修改呢?

    //读取bin文件

    function readJsonByFile_bin(fileNamePath) {

    // 只能用于安卓 导入java类

    const File = plus.android.importClass('java.io.File')

    const BufferedInputStream = plus.android.importClass('java.io.BufferedInputStream')

    const FileInputStream = plus.android.importClass('java.io.FileInputStream')

    const readFile = (fileName) => {


        let inputStream = null ;  
    try {
    const readFr = new File(fileName);
    let fileInputStream = new FileInputStream(readFr);
    let bufferedInputStream = new BufferedInputStream(fileInputStream);

    const buffer = new ArrayBuffer(1024);
    let bytesRead;
    console.log(bufferedInputStream)
    let bytes = new Uint8Array();
    while ((bytesRead = bufferedInputStream.read(buffer)) != -1) {
    console.log(bytesRead)
    // console.log(buffer)
    // 处理读取到的二进制数据
    for (let i = 0; i < bytesRead; i++) {
    let data = buffer[i];
    // 进行处理或保存数据
    console.log(data)
    bytes.push(data) ;
    }
    // bytes = Uint8Array.concat(bytes,bytesRead) ;
    }
    return bytes
    } catch (e) {
    console.log(e)
    return ''
    }finally{
    fileInputStream.close();
    // 关闭文件流
    if (fileInputStream != null) {
    try {
    fileInputStream.close();
    } catch (err) {

    }
    }
    }
    }
    //const settingJsonPath = '/sdcard/wisdomApp/settingJson.txt'
    const json = readFile(fileNamePath);
    // console.log(json)
    return json

    }


    读到的都是null。。

    2023-06-17 10:01

  • 2***@qq.com

    回复 2***@qq.com: 唉,uniapp高版本安卓读取文件完全不行,你这个方法不行的原因是因为js没有和java一样的字节数组,使用 Unit8Array建立的字节数组,FileInputStream的read方法不认,只能建立一个普通数组然后用一个循环调用read()方法,才能读到所有的数据,但是这样子性能太差了,直接无解了

    2024-01-29 10:24

FullStack

FullStack - 【插件开发】【专治疑难杂症】【ios上架、马甲包、白包、过审、已成功上架过几百个】【多款插件已上架:https://ext.dcloud.net.cn/publisher?id=22130】【非诚勿扰】QQ:543610866

去 文件管理器 看有没有这个文件

该问题目前已经被锁定, 无法添加新回复