更新记录

1.0.5(2023-05-17)

1.0.5版本:新增判断是否具有某权限接口;修复解压windows压缩包时文件名中文乱码问题;解压接口返回code新增code=3(缺少解压密码)和code=4(文件不合法);Advanced接口新增useSubdirectory参数,Android12及以下默认请求Android/data目录权限,若useSubdirectory=true,则Android12及以下也请求Android/data子目录权限

1.0.4(2023-05-06)

1.0.4版本:统一getFileList和getFileListAdvanced获取的数据格式;复制或移动时允许覆盖同名文件或重命名复制文件;适配Android13;读取文件内容;压缩时加密文件;解压加密文件;添加文件到压缩文件里;从压缩文件里删除文件;重命名压缩文件中的文件

1.0.3(2022-11-02)

1.0.3版本:把【将应用加入系统的打开方式和分享列表中】功能从本插件中移出至新插件;新增获取、复制、删除Android/data目录下其他应用的私有目录功能

查看更多

平台兼容性

Android Android CPU类型 iOS
适用版本区间:5.0 - 12.0 armeabi-v7a:支持,arm64-v8a:支持,x86:支持 ×

原生插件通用使用流程:

  1. 购买插件,选择该插件绑定的项目。
  2. 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
  3. 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
  4. 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
  5. 开发完毕后正式云打包

付费原生插件目前不支持离线打包。
Android 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/android
iOS 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/ios

注意事项:使用HBuilderX2.7.14以下版本,如果同一插件且同一appid下购买并绑定了多个包名,提交云打包界面提示包名绑定不一致时,需要在HBuilderX项目中manifest.json->“App原生插件配置”->”云端插件“列表中删除该插件重新选择


更新说明

1.0.1版本:FileProvider冲突适配;优化删除目录或文件功能

1.0.2版本:打开文件和分享文件新增指定应用列表功能;将本应用加入【用其他应用打开】列表中,支持从微信或者QQ【用其他应用打开】时选择本应用;新增Android/data文件夹权限获取方法;新增获取"当前目录"下的所有子项(升级版),"当前目录"支持Android/data文件夹下的目录。

1.0.3版本:把【将应用加入系统的打开方式和分享列表中】功能从本插件中移出至新插件;新增获取、复制、删除Android/data目录下其他应用的私有目录功能

1.0.4版本:统一getFileList和getFileListAdvanced获取的数据格式;复制或移动时允许覆盖同名文件或重命名复制文件;适配Android13;读取文件内容;压缩时加密文件;解压加密文件;添加文件到压缩文件里;从压缩文件里删除文件;重命名压缩文件中的文件

1.0.5版本:新增判断是否具有某权限接口;修复解压windows压缩包时文件名中文乱码问题;解压接口返回code新增code=3(缺少解压密码)和code=4(文件不合法);Advanced接口新增useSubdirectory参数,Android12及以下默认请求Android/data目录权限,若useSubdirectory=true,则Android12及以下也请求Android/data子目录权限

引入插件

const lunafile = uni.requireNativePlugin("Luna-File");

1、权限接口

1.1 判断并授权所有文件的管理权限

getFileManagePermission(res=>{
    console.log(res);
    res={
        "hasPermission":true/false
    }
});

1.2 检查是否具有Android/data目录权限并授权

授权Android/data权限后,可以通过遍历获取其下的所有目录

Android13无法获取Android/data文件夹权限

checkAndroidDataPermission(res=>{
    console.log(res);
    res={
        "hasPermission":true/false
    }
});

1.3 检查是否具有Android/data、Android/obb子目录权限并申请授权

Android13可通过获取Android/data子文件权限操作Android/data下的文件

checkAndroidDataSubPermission({
    path:"" //例如QQ目录:/storage/emulated/0/Android/data/com.tencent.mobileqq/
},res=>{
    console.log(res);
    res={
        "hasPermission":true/false
    }
});

1.4 判断是否具有某权限

checkPermission({
   type:0,//权限类型,默认0,可选,0:“所有文件管理权限”,1:“Android/data权限”,2:“Android/data子目录权限”
   path:"",//Android/data子目录绝对路径,type=2时参数,例如QQ目录:/storage/emulated/0/Android/data/com.tencent.mobileqq/
},res=>{
    console.log(res);
    res={
        "hasPermission":true/false
    }
});

2、文件操作接口

在调用文件操作接口之前,请先获取所有文件的管理权限

2.1 获取公共目录路径

getPublicPath({
    type: 0, //见注释1,0:获取外部存储目录路径
},res=>{
    console.log(res);
    res={
        "code": 0,
        "message": "获取成功",
        "data":"获取的路径"
    }
    res={
        "code": 1,
        "message": "获取失败",
    }
})

2.2 创建目录

createDirectory({
    dirPath:"",//目录,使用绝对路径
},res=>{
    console.log(res);
    res={
        "code": 0,
        "message": "目录创建成功",
    }
    res={
        "code": 1,
        "message": "目录创建失败",
    }
    res={
        "code": 2,
        "message": "目录已存在",
    }
})

2.3 创建TXT文件,并写入内容

createTxtFile({
    dirPath: "", // 文件所在目录,目录不存在则自动创建,使用绝对路径
    fileName: "", // 文件名称,不要添加后缀名,例如:MyTestFile
    messages: [], // 文件内容,字符串数组格式,写入时自动换行,例如:["第一条信息","第二条信息"]
    append: true, // true:文件已存在时在原文件内追加内容,false:文件已存在时覆盖原文件
},res=>{
    console.log(res);
    res={
        "code": 0,
        "message": "文件创建成功"
    }
    res={
        "code": 1,
        "message": "文件创建失败"
    }
})

2.4 复制目录或文件

copyFile({
    fromPath: "", //待复制的目录或文件,使用绝对路径
    toPath: "", //要粘贴到的目录,目录不存在时自动创建,使用绝对路径
    rename:"",//重命名复制后的目录或文件,可选
    overwrite:true,//是否覆盖同名文件,默认false,可选
    returnPath:true,//是否返回复制文件路径,默认false,可选
},res=>{
    console.log(res);
    res={
        "code": 0,
        "message": "复制成功",
    }
    res={
        "code": 1,
        "message": "复制失败",
    }
    res={
        "code": 2,
        "message": "目录或文件不存在",
    }
    res={
        "code": 3,
        "message": "其他错误原因",
    }
})

2.4.1 复制目录或文件,支持复制Android/data下的文件(支持循环复制子目录)1.0.3新增

Android12及以下默认请求Android/data目录权限,useSubdirectory=true,则Android12及以下请求Android/data子目录权限

Android13没有了Android/data权限弹窗,默认请求Android/data子目录权限

copyFileAdvanced({
    fromPath: "", //待复制的目录或文件,使用绝对路径
    toPath: "", //要粘贴到的目录,目录不存在时自动创建(Android/data下除本应用外的目录不支持创建),使用绝对路径
    rename:"",//重命名复制后的目录或文件,可选
    overwrite:true,//是否覆盖同名文件,默认false,可选
    useSubdirectory:true,//Android12及以下是否使用Android/data子目录权限,默认false,可选
},res=>{
    console.log(res);
    res={
        "code": 0,
        "message": "复制成功",
        "data":[],//返回复制后的文件路径
    }
    res={
        "code": 1,
        "message": "复制失败",
    }
    res={
        "code": 2,
        "message": "目录或文件不存在",
    }
    res={
        "code": 3,
        "message": "其他错误原因",
    }
})

2.5 重命名目录或文件

renameFile({
    oldPath: "", //待重命名的目录或文件,使用绝对路径
    newPath: "", //新目录或文件,使用绝对路径
},res=>{
    console.log(res);
    res={
        "code": 0,
        "message": "重命名成功",
    }
    res={
        "code": 1,
        "message": "重命名失败",
    }
    res={
        "code": 2,
        "message": "目录或文件不存在",
    }
})

2.6 移动目录或文件

(本质上是先复制,再删除原文件)

moveFile({
    fromPath: "", //待移动的目录或文件,使用绝对路径
    toPath: "", //要移动到的目录,目录不存在时自动创建,使用绝对路径
    rename:"",//重命名复制后的目录或文件,可选
    overwrite:true,//是否覆盖同名文件,默认false,可选
},res=>{
    console.log(res);
    res={
        "code": 0,
        "message": "移动成功"
    }
    res={
        "code": 1,
        "message": "移动失败",
    }
    res={
        "code": 2,
        "message": "目录或文件不存在",
    }
})

2.7 删除目录或文件

deleteFile({
    path: "", //目录或文件,使用绝对路径
},res=>{
    console.log(res);
    res={
        "code": 0,
        "message": "删除成功",
    }
    res={
        "code": 1,
        "message": "删除失败",
    }
    res={
        "code": 2,
        "message": "目录或文件不存在",
    }
})

2.7.1 删除目录或文件,支持删除Android/data下的文件(支持循环删除子目录)1.0.3新增

Android12及以下默认请求Android/data目录权限,useSubdirectory=true,则Android12及以下请求Android/data子目录权限

Android13没有了Android/data权限弹窗,默认请求Android/data子目录权限

deleteFileAdvanced({
    path: "", //目录或文件,使用绝对路径
    useSubdirectory:true,//Android12及以下是否使用Android/data子目录权限,默认false,可选
},res=>{
    console.log(res);
    res={
        "code": 0,
        "message": "删除成功",
    }
    res={
        "code": 1,
        "message": "删除失败",
    }
    res={
        "code": 2,
        "message": "目录或文件不存在",
    }
})

2.8 获取"当前目录"或"当前文件所在目录"下的所有文件和文件夹列表

getFileList({
    path: "", //目录或文件,使用绝对路径
},res=>{
    console.log(res);
    res={
        "code": 0,
        "message": "读取成功",
        "data":[
            {
                "name":"文件名",
                "path":"文件绝对路劲",
                "isFile":"是否是文件",
                "isDirectory":"是否是目录",
                "lastModified":"最后一次修改时间",
                "length":"文件大小",
            }
            ……
        ]
    }
    res={
        "code": 1,
        "message": "读取失败",
    }
    res={
        "code": 2,
        "message": "目录或文件不存在",
    }
})

2.8.1 获取"当前目录"下的所有子项,支持获取Android/data下的文件列表(支持循环读取子目录)1.0.3优化

Android12及以下默认请求Android/data目录权限,useSubdirectory=true,则Android12及以下请求Android/data子目录权限

Android13没有了Android/data权限弹窗,默认请求Android/data子目录权限

getFileListAdvanced({
    path: "", //目录,使用绝对路径
    deep: false,//是否循环获取子目录,默认false,可选
    useSubdirectory:true,//Android12及以下是否使用Android/data子目录权限,默认false,可选
},res=>{
    console.log(res);
    res={
        "code": 0,
        "message": "读取成功",
        "data":[
            {
                "name":"文件名",
                "path":"文件绝对路劲",
                "isFile":"是否是文件",
                "isDirectory":"是否是目录",
                "lastModified":"最后一次修改时间",
                "length":"文件大小",
                "originalLength":"文件原始大小",
                "childCount":"文件夹子项数量",
            }
            ……
        ]
    }
    res={
        "code": 1,
        "message": "读取失败",
    }
})

2.9.0 获取系统打开应用的列表(即用其他应用打开,其他应用列表)(1.0.2新增)

getOpenApps({
    filePath: '', //文件绝对路径
},res=>{
    console.log(res);
    res={
        "code": 0,
        "message": "调用成功",
    }
    res={
        "code": 1,
        "message": "调用失败",
    }
})

2.9 调用本机应用打开文件

openFile({
    filePath: '', //文件绝对路径
    openApps:[{
        "packageName": "com.tencent.mobileqq",
        "activityName": "com.tencent.mobileqq.activity.JumpActivity"
    }, {
        "packageName": "com.tencent.mobileqq",
        "activityName": "com.tencent.mobileqq.activity.qfileJumpActivity"
    }],//可选,不包含openApps参数时,默认获取所有可供选择的应用列表。指定打开文件的应用列表,值可以通过getShareApps获取或者百度获取
},res=>{
    console.log(res);
    res={
        "code": 0,
        "message": "调用成功",
    }
    res={
        "code": 1,
        "message": "调用失败",
    }
})

2.10.0 获取系统分享应用的列表(即用其他应用分享,其他应用列表)(1.0.2新增)

getShareApps({
    filePath: '', //文件绝对路径
},res=>{
    console.log(res);
    res={
        "code": 0,
        "message": "调用成功",
    }
    res={
        "code": 1,
        "message": "调用失败",
    }
})

2.10 调用本机应用分享文件

shareFile({
    filePath: '', //文件绝对路径
    shareApps:[{
        "packageName": "com.tencent.mobileqq",
        "activityName": "com.tencent.mobileqq.activity.JumpActivity"
    }, {
        "packageName": "com.tencent.mobileqq",
        "activityName": "com.tencent.mobileqq.activity.qfileJumpActivity"
    }],//可选,不包含shareApps参数时,默认获取所有可供选择的应用列表。指定分享文件的应用列表,值可以通过getShareApps获取或者百度获取
},res=>{
    console.log(res);
    res={
        "code": 0,
        "message": "调用成功",
    }
    res={
        "code": 1,
        "message": "调用失败",
    }
})

2.11 Base64Data转本地图片

调用saveBase64Data方法时,'data:image/jpeg;base64,' 需要替换成''

saveBase64Data({
    base64Data: "", //base64数据,去掉开头的数据类型字符串"data:image/jpeg;base64,"
    filePath: "",//输出的图片文件路径,使用绝对路径
},res=>{
    console.log(res);
    res={
        "code": 0,
        "message": "转换成功",
    }
    res={
        "code": 1,
        "message": "转换失败",
    }
})

2.12 本地图片转Base64Data

getBase64Data({
    filePath: '', //待处理的本地图片文件路径,使用绝对路径
},res=>{
    console.log(res);
    res={
        "code": 0,
        "message": "转换成功",
        "data":'完整的base64数据'
    }
    res={
        "code": 1,
        "message": "转换失败",
    }
})

2.13 压缩目录或文件

compressFile({
    path:"", //要压缩的目录或文件,使用绝对路径
    zipFilePath: "", //压缩完成的Zip文件路径,使用绝对路径,允许重命名压缩文件
    password: "", //压缩密码,可选参数
},res=>{
    console.log(res);
    res={
        "code": 0,
        "message": "压缩成功",
    }
    res={
        "code": 1,
        "message": "压缩失败",
    }
})

2.14 解压zip文件

extractFile({
    zipFilePath: "", //要解压的Zip文件路径,使用绝对路径
    dirPath: "", //输出目录,即解压后的目录或文件所在目录,使用绝对路径,默认解压到dirPath+'/zip文件名'目录
    rename: "",//重命名解压文件,可选参数,重命名后文件将解压到dirPath+'/rename'目录
    password: "", //解压密码,可选参数
},res=>{
    console.log(res);
    res={
        "code": 0,
        "message": "解压成功",
    }
    res={
        "code": 1,
        "message": "解压失败:"+失败原因,
    }
    res={
        "code": 2,
        "message": "解压失败:压缩文件不存在",
    }
    res={
        "code": 3,
        "message": "解压失败:缺少解压密码",
    }
    res={
        "code": 4,
        "message": "解压失败:压缩文件不合法,可能被损坏",
    }
})

2.14.1 添加文件到压缩文件里 1.0.4新增

addFilesToZip({
    zipFilePath: "", //Zip文件路径,使用绝对路径,已存在的zip文件或未存在的zip文件均支持
    filePathList:[], //待添加的文件路径集合,使用绝对路径,格式["路径1","路径2"]
    dirName: "", //在压缩文件里的目录名,文件将被添加进该目录,目录不存在时主动创建,可选参数,默认值为null
    password: "", //压缩密码,如果源文件有密码,此密码需要设置与源文件相同或不设置,可选参数,默认值为null
},res=>{
    console.log(res);
    res={
        "code": 0,
        "message": "压缩成功",
    }
    res={
        "code": 1,
        "message": "压缩失败",
    }
})

2.14.2 从压缩文件里删除文件(仅支持删除文件,不支持删除文件夹) 1.0.4新增

deleteFileInZip({
    zipFilePath: "", //Zip文件路径,使用绝对路径,例如:/storage/emulated/0/A测试目录/demo.zip
    deletedFileName: "", //待删除文件在Zip文件中的相对路径。例如:log/log.txt(删除zip中log文件夹下的log.txt文件)
},res=>{
    console.log(res);
    res={
        "code": 0,
        "message": "删除成功",
    }
    res={
        "code": 1,
        "message": "删除失败",
    }
})

2.14.3 从压缩文件里批量删除文件(仅支持删除文件,不支持删除文件夹) 1.0.4新增

deleteFilesInZip({
    zipFilePath: "", //Zip文件路径,使用绝对路径,例如:/storage/emulated/0/A测试目录/demo.zip
    deletedFileNames: [], //待删除文件在Zip文件中的相对路径集合。例如:['log/log.txt','log2/log.txt']
},res=>{
    console.log(res);
    res={
        "code": 0,
        "message": "删除成功",
    }
    res={
        "code": 1,
        "message": "删除失败",
    }
})

2.14.4 重命名压缩文件中的文件(仅支持重命名文件,不支持重命名文件夹) 1.0.4新增

renameFileInZip({
    zipFilePath: "", //Zip文件路径,使用绝对路径,已存在的zip文件或未存在的zip文件均支持
    oldFileName: "", //待重命名文件在Zip文件中的相对路径。例如:log/log.txt(重命名zip中log文件夹下的log.txt文件)
    newFileName: "", //重命名。例如:log/log123.txt(zip中log文件夹下的log.txt文件重命名为log123.txt)
},res=>{
    console.log(res);
    res={
        "code": 0,
        "message": "重命名成功",
    }
    res={
        "code": 1,
        "message": "重命名失败",
    }
})

2.14.5 批量重命名压缩文件中的文件(仅支持重命名文件,不支持重命名文件夹) 1.0.4新增

renameFilesInZip({
    zipFilePath: "", //Zip文件路径,使用绝对路径,已存在的zip文件或未存在的zip文件均支持
    fileNames:[{}], //待重名文件在Zip文件中的相对路径对象数组。例如:[{"oldFileName":"log/log.txt","newFileName":"log/log123.txt"},...]
},res=>{
    console.log(res);
    res={
        "code": 0,
        "message": "重命名成功",
    }
    res={
        "code": 1,
        "message": "重命名失败",
    }
})

2.15 通过安卓存储访问框架打开目录

openDirectoryBySAF({
    dirPath: "", //目录,使用绝对路径
},res=>{
    console.log(res);
    res={
        "code": 0,
        "message": "打开成功",
    }
    res={
        "code": 1,
        "message": "打开失败",
    }
})

2.16 读取文件内容,支持读取Android/data下的文件内容 1.0.4新增

仅测试过读取字符集为UTF-8的txt文件

Android12及以下默认请求Android/data目录权限,useSubdirectory=true,则Android12及以下请求Android/data子目录权限

Android13没有了Android/data权限弹窗,默认请求Android/data子目录权限

readFileAdvanced({
    path: "", //读取的文件路径,使用绝对路径
    type: 1, //读取类型,可选,默认读取全部内容。1:读取文件某一行内容;2:读取文件某几行内容
    row: 1, //type=1时的参数,读取的行,默认1
    startLine: 1, //type=2时的参数,读取的起始行,默认1
    endLine: 2, //type=2时的参数,读取的结束行,默认2
    returnType: 1, //返回类型,可选,默认返回字符串,1:返回按行读取的数组
    useSubdirectory:true,//Android12及以下是否使用Android/data子目录权限,默认false,可选
},res=>{
    console.log(res);
    res={
        "code": 0,
        "message": "读取成功",
        "data":"返回字符串或字符串数组"
    }
    res={
        "code": 1,
        "message": "读取失败",
    }
})

3、注释

3.1 获取公共目录路径

type 说明
0 获取外部存储目录
1 获取应用私有目录
2 获取公共文档目录
3 获取公共下载目录
4 获取DCIM(相册)目录
5 获取公共图片目录
6 获取公共视频目录
7 获取公共音乐目录
8 获取U盘路径

隐私、权限声明

1. 本插件需要申请的系统权限列表:

<!-- 获取应用列表 --> <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" tools:ignore="QueryAllPackagesPermission" /> <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> <!-- 存储 --> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问