更新记录

4.1.1(2024-07-29) 下载此版本

1.修复安卓端原生选择器选择第三方应用内文件时无效的问题

4.1.0(2024-04-07) 下载此版本

1.变更:(安卓)API : gotoSetting 已废弃,不再支持 2.新增:(安卓,自定义文件选择器)自定义文件选择器终于支持了多选功能,支持长按开启多选模式 3.变更:(ios)为优化用户体验,ios打开文件选择器时会显示动画效果 4.新增:(安卓)API : gotoAllowReadAllFilesSetting 用于打开【所有文件读取权限】设置页面 5.新增:(安卓)安卓端也新增了用户取消选择文件的回调(状态码1006),便于实现特殊的业务逻辑,自定义选择器和原生选择器都支持

4.0.5(2024-02-23) 下载此版本

1.fix:修复安卓多应用冲突

查看更多

平台兼容性

Android Android CPU类型 iOS
适用版本区间:5.0 - 14.0 armeabi-v7a:支持,arm64-v8a:支持,x86:未测试 适用版本区间:11 - 17

原生插件通用使用流程:

  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原生插件配置”->”云端插件“列表中删除该插件重新选择


lemonjk-FileSelect[文件选择]

一、基本使用

使用前须知:

  • 推荐优先使用【下载for离线打包】方式下载插件包,然后在项目中引入。此方式同样可以云打包,且插件包是存放在本地项目中的,所以不用开发者绑定账号,任何人复制你的项目都可以直接使用插件打包,更适合多人开发\交付项目。可以不受插件后续版本更新的影响。 详见: https://ask.dcloud.net.cn/article/35844
  • 已适配安卓14.x( SdkVersion>=34)版本 ,满足上架谷歌商店的新应用需要targetSdkVersion>=33的规定,本插件(>=3.1版)经测试可以在targetSdkVersion>=34条件下正常选取文件。
  • 已在部分真机(详情见:二、兼容性说明)测试通过,其他系统版本、机型未知,请自行测试。

本插件特色:

  • 多端支持: 支持安卓苹果双平台使用
  • 可以获取当前手机连接的所有外接存储设备(sd卡、u盘、移动硬盘等),并可访问对应的外接存储设备
  • 支持大文件选取。多线程处理大文件读取,选取更快,异步返回结果。
  • 文件读取时可配置加载提示,更好的用户体验。
  • 多种文件选择方式: 安卓端支持自定义文件选择器和原生文件选择器,苹果端支持原生文件选择器。其中自定义文件选择器支持个性化UI界面,适配夜间模式,可以根据系统自动切换。(通过调用不同API选择)
    • 原生文件选择器自定义文件选择器有何区别?
      • 原生文件选择器是安卓系统内置的。不可定制界面,与应用风格不协调,可配置属性少,无法满足定制化需求,操作体验不好。但是可以不用申请各种权限,官方推荐,可以让用户放心隐私问题。
      • 自定义文件选择器是开发者自行制作编写的。界面可任意定制,理论上可配置任何属性样式,满足定制化需求,但需要申请读写权限,高版本安卓13.x还需要MANAGE_EXTERNAL_STORAGE权限(此权限上架不了谷歌商店),同时用户可能并不会愿意授权。
    • 我该如何选择?
      • 第一要考虑的就是是否需要上架谷歌商店,若无此方面考虑则可放心使用自定义文件选择器,但仍然建议使用原生文件选择器。
      • 看老板怎么说?原生文件选择器界面太丑?改!
      • 当原生文件选择器没办法满足特定的需求,如:指定只能选择特定的几个文件类型(其实可以在用户选择后对后缀名作判断,让用户重新选择),建议使用自定义文件选择器
      • 只是简单选择个文件?建议使用原生文件选择器
  • 支持多选,同时选取多个文件。
  • 插件支持权限检查,支持申请权限,跳转到APP权限设置页。
  • 支持限制文件类型选取(安卓为mime类型,ios为utis类型),实现限制文件类型选取。
  • (安卓)支持访问指定目录,方便用户在指定目录快速选取。

    新版本特别说明:

  • 本插件(4.0.0+)已完全进行重构,与之前版本的使用方式不完全兼容,但大多数配置仍可使用,推荐使用最新版本。
  • 为避免与之前旧版本(4.0.0以下)插件可能存在的冲突,使用新版本(4.0.0+)前请移除本插件的旧版本。
  • 版本4.0.4+开始,需要在manifest.json -> APP原生插件配置->本插件下的[appid_android]输入框中填入你的应用包名,自行离线打包见本文档最后的‘问题反馈与收集’

1.在页面引入

不要忘了在 "manifest.json -> APP原生插件配置" 内添加本插件,否则云打包(离线打包)不会生效

const lemonjkFileSelect = uni.requireNativePlugin('lemonjk-FileSelect');

2.唤起文件选择

lemonjkFileSelect.showPicker({
    //各属性配置见下方【showPicker可配置参数说明】
    pathScope: "/Download",  
    mimeType: "*/*",
    utisType:["public.data"],
    }, result => {
    // 返回值说明见下方【showPicker返回值说明】
            console.log(result);
    })
//showPicker在苹果端唤起的是原生文件选择器
//showPicker在安卓端唤起的是自定义文件选择器,如需唤起原生选择器请调用showNativePicker

二、插件方法和参数配置

1.showPicker

4.0.0+安卓端变更为唤起的是自定义文件选择器,如需打开原生文件选择器请调用: lemonjkFileSelect.showNativePicker

示例

lemonjkFileSelect.showPicker({
    pathScope: "/Download",  
    mimeType: "*/*",
    utisType:["public.data"],
    multi:'yes'
}, result => {})

//4.0.0+ 安卓自定义文件选择器使用及高级筛选器配置示例
lemonjkFileSelect.showPicker({
    mimeType: "*/*",
    utisType:["public.data"],
    pathScope: "/Download",
    navTitle:"文件选择",
    navTextColor:'#55ff00',
    navBarBgColor:'#00aaff',  
    theme:'light',  //auto 跟随系统  light 亮色  dark 暗色 
    showHideFile:"yes",   //是否显示隐藏的文件和文件夹      
    filterConfig:{  //对象里配置的属性要同时满足   
        // fileName:['base.apk','config.txt','配置文件.yaml'],  //属性数组满足其中一项
        fileSize:String(1*1024*1024),  // 单位:byte(字节)  //属性数组满足其中一项
        fileExtension:['apk','txt','jpg','mp3','yaml'],  //属性数组满足其中一项 
    }
}, result => {
    console.log(result);
})

可配置参数说明

属性 类型 说明 兼容性(4.0.0、4.0.1等指插件版本)
navTitle string 顶部导航栏标题 仅【4.0.0+】安卓自定义文件选择器
navTextColor string 顶部导航栏文字颜色
如: navTextColor:'#ffffff'
仅【4.0.1+】安卓自定义文件选择器,此优先级高于theme主题对应的颜色
loadingToast string 是否在用户选择文件后显示文件加载弹窗提示
可选值:
[不填] 显示弹窗提示
no 不显示弹窗提示
仅【4.1.0+】
pickerMode string 选择器模式
可选值:
[不填] 会在左侧显示第三方APP
"OPEN_DOCUMENT" 隐藏第三方APP
仅【4.0.2+】安卓原生选择器
注:你不理解该属性作用的,请不要设置该属性,不填即可
navBarBgColor string 顶部导航栏背景颜色
如:navBarBgColor:'#ffffff'
仅【4.0.1+】安卓自定义文件选择器,此优先级高于theme主题对应的颜色
theme string 选择器外观主题,默认值为:auto
可选值
auto 跟随系统 (默认值)
light 亮色
dark 暗色
仅【4.0.1+】安卓自定义文件选择器
showHideFile string 是否显示隐藏的文件和文件夹
可选值:
[不填] 不显示
yes 显示
仅【4.0.0+】安卓自定义文件选择器
pathScope string 【可选】访问指定目录,不需要则不要声明该属性,默认显示顶级目录
例:
pathScope:"/DCIM/Camera" 相机目录
pathScope:"/Download" 下载目录
仅安卓,部分目录由于安全策略无法访问,如"Android/data",请自行测试,可以参考自己手机的目录进行设置
原生文件选择器指定目录需在Android 8.0及以上系统支持(如需低版本系统支持请使用4.0.0+插件的自定义文件选择器)
externalStoragePath string 如果pathScope路径为外接存储设备路径(从getAllExternalStorage中获取),需设置externalStoragePath为yes 仅【4.0.0+】安卓自定义文件选择器
filterConfig object 高级筛选器配置,用于可选文件过滤,更高级的文件筛选功能,满足更复杂的文件筛选要求。
filterConfig.fileName 文件名筛选(Array)
filterConfig.fileSize 文件大小筛选(String,单位:字节)
filterConfig.fileExtension 文件类型筛选(Array)
具体使用见上方使用示例
仅【4.0.1+】安卓自定义文件选择器
mimeType string 【必填】限制选取的文件类型,不限制需设为 "*/*",更多类型请参照Mime类型对照表,暂时仅支持设置单个类型
例:
image/* (图片)
text/plain (文本)
application/vnd.openxmlformats-officedocument.wordprocessingml.document (word)
仅安卓,ios使用utisType属性代替

自定义文件选择器(4.0.0+),请使用filterConfig高级筛选器代替
utisType Array 【必填】限制选取的文件类型,支持以数组形式同时设置多个类型限制.
不限制需设为["public.data"],更多类型请参照utis类型对照表
utis对照表请点此前往
仅ios,安卓使用mimeType代替
multi string 【可选】是否开启多选,"yes"为开启,默认不填即为单选
securityPackageName string 【可选】"Android/data"下要访问的包名,可以参考自己手机目录"Android/data"下的包名进行设置
如果需要选取 "Android/data" 安全目录下的文件,请设置该属性,不需要则不要声明该属性
仅【<4.0.0】安卓
securityScope string 【可选】安全访问的根目录,暂时只支持 "data"
如果需要选取 "Android/data" 安全目录下的文件,请设置该属性,不需要则不要声明该属性
注:securityPackageName和securityScope需要同时设置才能访问 "Android/data"下的目录
仅【<4.0.0】安卓

返回值说明

属性 类型 说明 兼容性
code int 状态码:
0 成功
1 未知错误
1001 未授权文件读取权限(没有权限或权限被拒绝)
1004 用户取消了选择
【4.1.0+】安卓端也新增了用户取消选择文件的回调(状态码1006),便于实现特殊的业务逻辑,自定义选择器和原生选择器都支持
filePath string 选取的文件的绝对路径,可以直接提供给uniapp的上传、下载等api使用,需要二进制上传请使用plus5+API进行转换 请参考files属性
fileName string 选取的文件的名称 请参考files属性
fileRealName为实际在文件名,而fileName则为逻辑上的展示名称
fileRealName string 选取的文件的真实名称 请参考files属性
fileRealName为实际在文件名,而fileName则为逻辑上的展示名称
fileSize string 选取的文件的大小(单位:字节) 请参考files
fileExtension string 选取的文件的后缀名 请参考files
fileMime string 选取的文件的Mime类型 请参考files,仅安卓原生文件选择器
本属性不保证返回,请勿以此作为唯一判断业务逻辑的属性
files array
无论设置了单选还是多选,都以数组形式返回所选文件列表。如果单选,则数组长度为1,使用files[0]即可。
files结构如下:
[{filePath,fileName,fileExtension,fileSize},...]
errMsg string 选择完成后的状态信息
detail string 具体的文字说明

2.【已废弃】gotoSetting(仅安卓)

跳转到应用设置页面 由于uniapp官方已提供该功能的API,所以插件4.1.0+开始,此API不再支持 详见:https://uniapp.dcloud.net.cn/api/system/openappauthorizesetting.html

示例

// lemonjkFileSelect.gotoSetting();
// 使用官方的API代替即可
uni.openAppAuthorizeSetting({
  success (res) {
    console.log(res)
  }
})

可配置参数说明

返回值说明

3.grantSecurityScope(仅安卓<4.0.0,维护中)

打开安全目录授权页面

//1.选取 "Android/data" 目录文件之前,需要调用此方法。
//2.用户同意授权后,才可使用lemonjkFileSelect.showPicker选取 "Android/data"目录下的文件,否则直接调用将不会。
//3.仅需用户首次授权即可,永久有效,除非应用被卸载。
lemonjkFileSelect.grantSecurityScope({
                    securityScope:"data",
                    securityPackageName: "com.android.egg" 
                }, result => {
                    console.log(result);
                    //  result.code       状态码【1005 用户授权成功】 
                    //  result.errMsg     选择完成后的状态信息
                    //  result.detail     具体的文字说明

                })
//提示:
//用户授权成功后,请自行保存维护该包名对应文件夹的授权记录
//如storage持久化:[{PackageName:"com.android.egg",isGrant:true}],
//以后无需调用lemonjkFileSelect.grantSecurityScope授权该包名下的文件夹,可直接调用lemonjkFileSelect.showPicker进行选取

可配置参数说明

属性 类型 说明 兼容性
securityPackageName string 【可选】"Android/data"下要访问的包名,可以参考自己手机目录"Android/data"下的包名进行设置
如果需要选取 "Android/data" 安全目录下的文件,请设置该属性,不需要则不要声明该属性
仅安卓
securityScope string 【可选】安全访问的根目录,暂时只支持 "data"
如果需要选取 "Android/data"安全目录下的文件,请设置该属性,不需要则不要声明该属性
注:securityPackageName和securityScope需要同时设置才能访问 "Android/data"下的目录
仅安卓

返回值说明

属性 类型 说明 兼容性
code int 状态码:
0 用户授权成功(仅安卓)

errMsg string 选择完成后的状态信息
detail string 具体的文字说明

4.showNativePicker(仅4.0.0+插件安卓)

打开安卓原生的文件选择器,

参考说明1.showPicker(showPicker的大部分配置参数都可以生效,具体查看兼容性说明)

5.getAllExternalStorage(仅4.0.0+插件安卓)

获取外接存储设备列表,如sd卡、u盘、移动硬盘等,仅高版本安卓系统支持,低版本系统在适配中。。。。

可配置参数说明

返回值说明

返回当前手机所有已连接的外接存储设备路径列表,可使用该列表中的路径传给showPicker使用,实现打开对应外接设备文件选取

lemonjkFileSelect.getAllExternalStorage({}, result => {
          this.pathScope=result.storages[1];
                // 拿到路径地址后可以调用showPicker访问
        })

6.isHaveSecurityScopeGrant(仅4.1.1+插件,安卓端)

查询手机是否拥有文件相关权限(仅自定义文件选择器需要,原生选择器无需任何权限) 一种特殊情况: 当上架应用商店可能会有如下要求:在申请权限之前,应用需要先弹出提示告知用户,并对要申请的权限进行说明,才能申请权限,否则无法审核通过上架。 你可以使用该API先检查是否有权限,如果没有权限先提示用户,用户确认后,再开始申请权限,有权限后再调用文件选择器。

可配置参数说明

返回值说明

属性 类型 说明 兼容性
code int 状态码:
0 权限状态查询成功
4.0.1+
type string 固定值:"FILE_PERMISSON" 4.0.1+
result string "yes" 已拥有文件相关权限,可以正常选择文件
"no" 没有权限,请先提示用户同意授权,然后申请权限
4.0.1+
errMsg string 调用完成后的状态信息 4.0.1+
detail string 具体的文字说明 4.0.1+

示例

const _this=this;
lemonjkFileSelect.isHaveSecurityScopeGrant({
                    type:"FILE_PERMISSION"   //不填默认为"FILE_PERMISSION",可选值:"FILE_PERMISSION"(用于自定义文件选择器相关权限查询)
                }, result => {
                    console.log(result);
                    if(result.result=="yes"){
                        //有权限,可以直接唤起自定义文件选择器
            //lemonjkFileSelect.showPicker()
                    }else{
            //无权限,询问用户是否同意申请权限
                        uni.showModal({
                            content:"需要申请文件访问权限,是否同意",
                            success(e) {
                                if(e.confirm){
                                    // lemonjkFileSelect.reqCustomPickerPermission()
                                }else{

                                }
                            }
                        })
                    }
})

7.reqCustomPickerPermission(仅4.1.1+插件,安卓端)

申请自定义文件选择器所需的权限

可配置参数说明

返回值说明

示例

lemonjkFileSelect.reqCustomPickerPermission({}, result => {
                    if(result.code==3002){
            //用户同意了权限,可以唤起自定义文件选择器
                        //lemonjkFileSelect.showPicker()
                    }else{
            //用户拒绝了权限
                        uni.showToast({
                            title:"你拒绝了授权"})
                    }
                    console.log(result);
})

8.shareFile(仅4.0.2+插件,安卓端。ios暂不支持)

唤起系统分享,分享指定文件给第三方应用

可配置参数说明

属性 类型 说明 兼容性
fileAbsPath string 必填,需要分享的文件的绝对路径,支持来自于本文件选择器unipp相关Api返回的路径 4.0.2+
targetApp string 第三方应用包名,用于分享给指定的第三方应用,不填则由用户自行选择 4.0.2+

返回值说明

二、兼容性说明

目前仅测试了部分系统版本,其他系统版本兼容性未知,请自行测试。

三、问题反馈与收集

目前收集的问题(Q&A):
1.(ios)控制台报错:自定义基座不包含本插件:请不要使用ios模拟器运行,使用真机运行即可
2.(ios)唤起文件选择器闪退,utisType 属性为必填项,请确认是否填写了该属性
3.(安卓)需要自己离线打包的,可能会报未设置LEMONJK_APPID,解决办法如下:
      打开 build.gradle(Module:app) 配置文件,在相应节点填加对应配置项: 
      android {
          ...
          defaultConfig {
             ...
              //在该节点填加以下配置,并填入你的应用包名
              manifestPlaceholders = [LEMONJK_APPID: "此处填入你的包名"]
          }
      }

隐私、权限声明

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

"<uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>", "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>", "<uses-permission android:name=\"android.permission.MANAGE_EXTERNAL_STORAGE\"/>" 如果需要上架谷歌,请移除权限"<uses-permission android:name=\"android.permission.MANAGE_EXTERNAL_STORAGE\"/>"

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

插件不采集任何数据

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

许可协议

作者未提供license.md

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