更新记录

v1.0.2(2023-03-16)

增加一个API:计算文件的MD5

v1.0.1(2023-03-15)

计算文件的MD5,扩展到了TB级,只要该文件的尺寸不大于64位长整数的上限即可...


平台兼容性

Android Android CPU类型 iOS
适用版本区间:4.4 - 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原生插件配置”->”云端插件“列表中删除该插件重新选择


写在最前面

A:本插件为何收费?

Q:

1. 本插件的功能非常丰富。包含了文件IO操作的全面思考和深度定制,几乎能满足任何文件IO操作的业务需求

2. 本插件源码经过大量优化,无论是性能上,兼容上,还是安全上,都经过深度思考。而代价,就是作者为此付出了一个多月的时间

3. 本插件的开发初衷,虽不是为了插件市场,而是公司自用。但为了编写插件市场的相关文档,作者花费了整整一周的时间,用此时间来做别的事,作者也能获取不菲的回报

4. 定价299.00,从时间成本上看,购买本插件您并不亏。因为即使您自己开发一款这样的插件,您所花费的时间成本,也远大于购买成本!

5. 迭代与激励性。只有收费,作者才有激情不断迭代与维护。只有不断迭代与维护,您才能真正安心的使用。就算免费,若不维护与迭代,您也很难用的安心!

感谢您的理解与支持!谢谢!!!

写在前面 关于 bs-filesio 插件的重点简述

A:bs-filesio 能做什么?

Q:bs-filesio提供了一套完整的文件IO操作API,包括对文件的:读写、复制、剪切、删除、遍历、搜索、枚举、上传、下载、转换、获取文件属性等...共25个API。其中,文件读写支持文本型和二进制数据流型,二进制数据流支持:byte[]型,hexStr型,和base64Str型3种类型。简单的一句话就是:只要是文件操作,bs-filesio提供的API都能满足您的需求,不论这个需求是否变态!!!

A:bs-filesio 的存在解决了什么问题?

*Q: 众所周知,Uin-App官方提供的文件API只能操作APP沙盒内的文件,其中包括:uni.saveFile 和 plus.io.,因此很多时候不能满足我们的业务需求,而bs-filesio插件可以操作SD卡中的任何文件,无论APP沙盒内的文件,还是APP沙盒外的文件。bs-filesio插件对整个SD卡都拥有绝对的操作权限,当然,前提是用户愿意授权。不过别担心,bs-filesio提供了一个动态的授权请求API,该API非常完善和兼容,可在任何的Android系统版本中申请授权,不论Anroid 11以下,还是Android11 以上,不论是真机还是模拟器,不论调试环境,还是最终打包,统统兼容。**

A:bs-filesio 的优势有哪些?

Q:

1. 大权限。bs-filesio 插件向用户请求的文件读写权限为应用层最高权限,拥有系统自带的文件管理器的同等能力。完全没有沙箱限制。

2. 高兼容。bs-filesio 插件经过大量真机环境测试,在各Android系统版本中都能保持有效和稳定。不存在使用Native.js读取文件时很多真机无效的情况。

3. 高稳定。bs-filesio 插件提供的每个API的内部代码都经过精心优化,作者是一名非常追求性能和稳定的C语言程序员。

4. 高性能。bs-filesio 插件直接操作文件底层IO数据流,内部各种编码转换均由C语言代码移植而来。不依赖安卓系统和JAVA版本

5. 二进制。bs-filesio 插件可以高速读写二进制文件,并且提供了6个二进制操作API,可以满足各种多媒体文件的操作需求。

6. 灵活性。bs-filesio 插件共提供了25个文件操作API,通过这些API的组合,可以实现各种变态的文件操作管理的业务需求。

7. 人性化。bs-filesio 插件内置了各种常用编码集,在使用过程中,您完全不用担心各种中文乱码问题,作者所属公司踩过的坑,在bs-filesio中均已填平。

8. 易用性。bs-filesio 插件的开发初衷是为了解决作者自己所在公司的业务需求,开发时考虑最多的就是稳定性、实用性和易用性。使用Native.js需要写几天的代码,改成bs-filesio几句代码就搞定。

9. 高大尚。bs-filesio 插件按公司商务需求设计,上传、下载、搜索...等方法提供了精细的回调状态和统计信息,可以利用它们快速搭建精美的UI组件,展示您APP的高端逼格。这也是uni.uploadFile不能满足的需求。

10. 文档完善。bs-filesio 插件提供了非常完善的使用文档。作者仅为了编写插件文档,就花费了高达一周多的时间。无论您是萌新,还是大佬,通过文档,您都能快速入手bs-filesio插件。

A:bs-filesio 的应用场景有哪些?

Q:

1. 开发社交类APP,且希望该APP拥有像QQ、VX那种文件收发的能力(使用bs-filesio:浏览、选择、读取、保存、上传、下载手机上的文件)

2. 开发音乐播放器类APP(使用bs-filesio:浏览、选择、扫描、读取、保存、下载手机上的所有音频)

3. 开发视频播放器类APP(使用bs-filesio:浏览、选择、扫描、读取、保存、下载手机上的所有视频)

4. 开发阅读器(文档,小说)类APP(使用bs-filesio:浏览、选择、扫描、读取手机上的所有Text、PDF、DOC、PPT 等)

5. 开发压缩工具类APP (使用bs-filesio:浏览、选择、扫描、读取手机上的所有视频)

6. 开发编辑类、剪辑类APP (使用bs-filesio:浏览、选择、扫描、读取、保存、导出相关文件)

7. 开发网盘类APP (使用bs-filesio:浏览、选择、扫描、监听、读取、保存、上传、下载手机上的文件)

8. 开发WEB浏览器类APP (使用bs-filesio:浏览、选择、读取、保存、上传、下载手机上的文件)

9. 开发文件浏览器类APP ,如 ES,RootExplorer,AndExplorer,Astro等知名的文件浏览器。无论您是否需要,但bs-filesio插件提供的API确实拥有实现它们的能力。

**10. 需要文件浏览器部分能力的APP,很多时候,我们确实不需要打造一个完整的文件浏览器,但获取浏览器的部分功能,却是我们做高端产品时常常需要的。

11. 还有其它很多作者没想到的场景——所有需要读取APP沙箱外部文件的需求,或所有需要把数据保存到APP沙箱外部的需求,都是bs-filesio插件的主要战场。

A:有 bs-filesio 有真实应用的额外小案例?

Q:

有。近年来多媒体行业非常火,因此市场上诞生了各种配音需求。作者所在公司刚好有一款配音APP,用户会把剧本、台词等文字通过我们的APP转成Mp3,然后再拿这些Mp3当成素材导入到剪映、剪影等工具里加工。于是,我们的APP就有了一个导出Mp3的需求。导出Mp3很难吗?当然不难,难的是怎么导出到沙箱以外的目录去!为什么要导出到沙箱以外去呢?因为APP沙箱的目录太深了,如果直接把Mp3保存在沙箱中,再让用户自己一层层的进沙箱中去找Mp3,这对用户的体验实在是惨不忍睹,更要命的是,很多用户的基础知识都是很差的,深层次的路径对他们来讲就是恶梦!所以,我们需要一个解决方案,那就是在SD卡的根目录下创建一个名叫:'0_mp3'的目录,然后把mp3文件都写入到这里来。为什么要取个名叫:'0mp3,因为'0'在Android系统中的排序优先级最高,也就是以0开头的文件夹会显示在最前面,效果和VX的名称前面加上A是一样的,目的都是为了显眼和好找。虽然这个方案很普通很简单,但想在Uin-App中实现,却非常困难!主要原因是:没有API,没有API,没有API(重要的事说三边)!次要的原因是使用Native.js申请权限兼容很差,兼容很差,兼容很差!(重要的事说三边) ,最后是严重的性能问题,因为文件IO流在JAVA中通过byte[]传址,而JS实现不了byte[]传址,若通过Native.js封装来读多媒体文件,只能一个字节一个字节的读,每读一次,磁盘IO开销一次,结果就是,一个100kb的mp3,要读好几分钟!因此,公司开发一款原生IO插件便刻不容缓,于是,bs-filesio插件应运而生!

话外题:作者认为,文件IO操作确实是Uin-App目前的短板,而对文件IO操作的相关业务需求却非常的普遍和广泛!故思考后,决定将 bs-filesio 插件上架到Uin-App的插件市场。但为何只有安卓版呢?一是因为,作者所属公司目前仅需要安卓版,所以当下只开发了安卓版本;二是因为,在IOS系统中,一切文件的读写都仅限于沙箱内!熟悉IOS的小伙伴们都知道,这并不是什么新规定,而是一直以来就是这么规定的(其实Android也在向IOS靠拢)。在IOS系统中,本质上就没有安卓SD根目录这种概念,其实,文件夹这种概念在IOS中压根就不存在!在IOS平台下,也没有Android这种能向用户申请文件所有操作权的API,文件只能通过APP的Inbox来分享给另一个APP,或者通过openURL来打开某个文件(例:在QQ中收到一个Mp3,可以选择使用哪种音乐播放器来打开它,用的就是openURL的方式),却无法像Android一样拿到权限之后,可以为所欲为。所以,单从系统权限上来讲,在IOS系统中,是无法开发出本插件这种能够为所欲为的文件插件。当然,除了没有沙箱外部权限以外,在沙箱内部,本插件的所有能力均可开发成IOS插件。如果您有需要的话,可以联系作者定制,作者QQ:267949,也可以在下方留言“需要IOS插件”。如果需要的人非常多,作者会抽时间来开发对应的IOS插件。在不确定有多少人需要这种插件的当下,作者也不想浪费时间去作无谓的事情!感谢您的理解与支持!谢谢!!!

技术文档正文

bs-filesio插件 有25个API,为方便用户阅读,共分为8个组,如下图所示:

详情如下(建议:使用前请先认真读完整篇文档,或下载Demo代码,您会事半功倍):

组1. 权限申请,共2个API

01.fileIoCheckPermission() // 申请APP外部文件操作权限 02.fileIoCheckPermission() // 查询APP外部文件操作权限

组2.路径&&目录,共3个API

01.getEnvirPath() // 获取特定环境目录的绝对路径 02.newDir() // 在任意位置创建新的文件夹 02.deleteDir() // 删除任意位置指定的文件夹

组3.写入数据,共4个API

01.saveFileText() //保存文本型文件(text) 02.saveBinaryFile() // 保存二进制文件(byte[]) 03.saveFileHexstr() // 保存二进制文件(HexStr) 04.saveFileBase64() // 保存二进制文件(base64Str)

组4.读取数据,共4个API

01.readFileText() //读取文本型文件(text) 02.readFileBinary() // 读取二进制文件(byte[]) 03.readFileHexstr() // 读取二进制文件(HexStr) 04.readFileBase64() // 读取二进制文件(base64Str)

组5.上传&&下载组,共2个API

01.uploadFile() //上传文件(按指定路径上传) 02.downFile() // 下载文件(按指定路径保存)

组6.复制&&删除,共3个API

01.copyFile() //复制文件 02.moveFile() // 移动文件 03.deleteFile() // 删除文件

组7.遍历&&搜索,共3个API

01.enumFile() //枚举文件列表 02.searchFile() // 同步搜索匹配文件 03.searchFileAsync() // 异步搜索匹配文件

组8.属性&&转换,共3个API

01.getFileSize() //获取文件的尺寸大小 02.getFileMD5() //文件IO.获取文件的MD5 03.getFileModifiedTime() // 获取文件最后一次修改的时间 04.filePathToUrl() // 将文件的本地路径转换成URL路径

fileIoCheckPermission() JS调用函数原型

    /**
    * 动态申请文件系统操作权限。提示:本方法支持所有Android系统的版本,无论是Android 11以上,还是Android 11以下。本方法内部封装了各种Android系统版本的(文件读写管理相关)授权API,因此您可以放心使用,不必纠结Android系统的版本问题。
    * 备注:由于uin-app官方担忧未来Android会彻底关闭APP外部文件读写权限,因此未提供真正意义上的一套文件IO操作API,这给很多开发者带来了不便,毕竟文件IO操作是大部分应用开发中常常离不开的!插件的开发者,也是因为自己的众多项目都离不开IO操作,故才开发了这套插件。
    * 重点:虽然uin-app官方担忧的未来Android会彻底关闭APP外部文件读写权限的可能性不大,但有一点uin-app官方说的很对——APP外部文件读写的安全限制必然会愈发收费,其中第一个就是各大应用商店对上架APP的核审此路策略,在可预见的未来,如果您没有一个合理的说辞去读写APP外部目录,应用商店可能不会让您的APP上架,尤其是读写SD卡根目录的操作!
    * 建议:根据以上情况,作者建议开发者们在非必要的情况下别操作APP外部读写,尤其是SD卡根目录的目录创建和文件读写(在根目录中创建目录和读写文件是非常敏感的)!能在APP沙盒内搞定的事情,尽量放在沙盒内,遇到不能放在沙盒内的需求,也应当尽量使用Android系统提示的公共目录,如SD卡的:Download(公共下载目录),Documents(公共共享目录),Movies(公共视频目录),Music(公共音乐目录),DCIM(相机目录)...等公共目录。
    *
    * @param {function} callBackApplyRes 申请结果的回调函数。本方法为:异步执行,调用后会立即返回。
    * @return {void} 用户授权的行为本身就是异步操作,所以无法同步返回结果,因此申请的结果只能通过callBackApplyRes回调来得到。小知识:用户在授权前,会思考多久?操作多久?等待多久?这个时间是不确定的!我们如果等待同步结果,就会造成主线程阻塞,造成UI卡死,这是我们不想要的结果。因此,在这种场景下,异步回调结果就是最佳的解决方案。
    */
    void fileIoApplyPermission(function callBackApplyRes) { ... }

本方法的Demo代码如下:

    /**
    *  请下载 Demo.Zip,里面有保姆级示例代码,详细到另人发指!
    *  强烈建议荫新们去下载 Demo.Zip,即使用来参考学习,也非常有价值...
    */

fileIoCheckPermission() JS调用函数原型

    /**
    * 文件IO.获取特定环境目录的绝对路径,本方法是一切文件IO操作的基石。提示:在使用本方法前,需要先通过 "fileIoApplyPermission()" 拿到用户的文件操作授权。
    * 备注:这个方法之所以放在最前面,是因为大部分文件IO操作都依赖它。为什么?因为在安卓系统上,SD卡根目录的路径并不是固定的,不同的系统版本、不同的厂商造成了杂乱的局面。因此,在操作文件IO前,正确的姿势是通过本方法拿到环境变量,也就是特定目录的绝对路径,然后再去操作文件IO。
    * 提醒:若放弃本方法,去直接使用固定的字符串值作为SD卡的根路径,是非常危险和不明智的!这在不同手机上、不同的操作系统上会带来致命错误!一旦您提供的SD卡根路径不正确,就会导致一切文件IO的操作都是无效的,徒劳的,意淫的!所以,使用本方法是保障安全、稳定、兼容的必要过程!
    *
    * @param {Number} rootType 要查询的位置类型 ? 0:SD卡的根目录(sd:root/)(默认) || 1:SD卡的公共下载目录(sd:root/Download/) || 2:SD卡的公共共享目录(sd:root/Documents/) || 3:SD卡的用户数据目录(sd:root/data/) || 4:SD卡的系统相机目录(sd:root/DCIM/) || 5:SD卡的系统视频目录(sd:root/Movies/) || 6:SD卡的系统音乐目录(sd:root/Music/) || 7:SD卡的系统相册目录(sd:root/Pictures/)(注意它和DCIM是有区别的) || 8:SD卡的系统截屏目录(sd:root/Screenshots/)
    * @return {String} 执行成功返回:被查询目录的绝对路径,失败返回:空字符串
    */
    String getEnvirPath(int rootType) { ... }

本方法的Demo代码如下:

    /**
    *  请下载 Demo.Zip,里面有保姆级示例代码,详细到另人发指!
    *  强烈建议荫新们去下载 Demo.Zip,即使用来参考学习,也非常有价值...
    */

getEnvirPath() JS调用函数原型

    /**
    * 文件IO.获取特定环境目录的绝对路径,本方法是一切文件IO操作的基石。提示:在使用本方法前,需要先通过 "fileIoApplyPermission()" 拿到用户的文件操作授权。
    * 备注:这个方法之所以放在最前面,是因为大部分文件IO操作都依赖它。为什么?因为在安卓系统上,SD卡根目录的路径并不是固定的,不同的系统版本、不同的厂商造成了杂乱的局面。因此,在操作文件IO前,正确的姿势是通过本方法拿到环境变量,也就是特定目录的绝对路径,然后再去操作文件IO。
    * 提醒:若放弃本方法,去直接使用固定的字符串值作为SD卡的根路径,是非常危险和不明智的!这在不同手机上、不同的操作系统上会带来致命错误!一旦您提供的SD卡根路径不正确,就会导致一切文件IO的操作都是无效的,徒劳的,意淫的!所以,使用本方法是保障安全、稳定、兼容的必要过程!
    *
    * @param {Number} rootType 要查询的位置类型 ? 0:SD卡的根目录(sd:root/)(默认) || 1:SD卡的公共下载目录(sd:root/Download/) || 2:SD卡的公共共享目录(sd:root/Documents/) || 3:SD卡的用户数据目录(sd:root/data/) || 4:SD卡的系统相机目录(sd:root/DCIM/) || 5:SD卡的系统视频目录(sd:root/Movies/) || 6:SD卡的系统音乐目录(sd:root/Music/) || 7:SD卡的系统相册目录(sd:root/Pictures/)(注意它和DCIM是有区别的) || 8:SD卡的系统截屏目录(sd:root/Screenshots/)
    * @return {String} 执行成功返回:被查询目录的绝对路径,失败返回:空字符串
    */
    String getEnvirPath(int rootType){ ... }

本方法的Demo代码如下:

    /**
    *  请下载 Demo.Zip,里面有保姆级示例代码,详细到另人发指!
    *  强烈建议荫新们去下载 Demo.Zip,即使用来参考学习,也非常有价值...
    */

newDir() JS调用函数原型

    /**
    * 文件IO.创建目录。支持多级创建,路径中间所有不存在的目录均会一一创建。
    *
    * @param {String} dirName 欲创建目录的绝对路径。提示:Android系统SD卡根目录的环境变量可以通过 getEnvirPath() 方法获取。
    * @return {Boolean} 创建成功返回:true,失败返回:false
    */
    boolean newDir(String dirName){ ... }

本方法的Demo代码如下:

    /**
    *  请下载 Demo.Zip,里面有保姆级示例代码,详细到另人发指!
    *  强烈建议荫新们去下载 Demo.Zip,即使用来参考学习,也非常有价值...
    */

deleteDir() JS调用函数原型

    /**
    * 文件IO.删除目录。支持多级目录删除,不论该目录中有多少子目录和文件,都可以一次删除。
    *
    * @param {String} dirName 该目录的绝对路径。提示:Android系统SD卡根目录的环境变量可以通过 getEnvirPath() 方法获取。
    * @return {Boolean} 执行成功返回:true,否则返回:false
    */
    @UniJSMethod(uiThread = false)
    boolean deleteDir(String dirName) { ... }

本方法的Demo代码如下:

    /**
    *  请下载 Demo.Zip,里面有保姆级示例代码,详细到另人发指!
    *  强烈建议荫新们去下载 Demo.Zip,即使用来参考学习,也非常有价值...
    */

saveFileText() JS调用函数原型

    /**
    * 文件IO.保存文本型文件
    *
    * @param {String} saveData 欲保存的数据。
    * @param {String} savePath 欲保存的绝对路径。提示:Android系统SD卡根目录的环境变量可以通过 getEnvirPath() 方法获取。
    * @return {String} 执行失败返回:空字符串,执行成功返回:被保存文件的绝对路径。温馨提示:若有需要,文件的绝对路径可以通过 filePathToUrl() 方法转换成URL路径;
    */
    String saveFileText(String saveData, String savePath){ ... }

本方法的Demo代码如下:

    /**
    *  请下载 Demo.Zip,里面有保姆级示例代码,详细到另人发指!
    *  强烈建议荫新们去下载 Demo.Zip,即使用来参考学习,也非常有价值...
    */

saveBinaryFile() JS调用函数原型

    /**
    * 文件IO.保存二进制文件 ( byte[] )。本方法会先将接受到的number数组转成二进制,然后再保存到指定的文件中。
    *
    * @param {byte[]} saveData 欲保存的数据。
    * @param {String} savePath 欲保存的绝对路径。提示:Android系统SD卡根目录的环境变量可以通过 getEnvirPath() 方法获取。
    * @return {String} 执行失败返回:空字符串,执行成功返回:被保存文件的绝对路径。温馨提示:若有需要,文件的绝对路径可以通过 filePathToUrl() 方法转换成URL路径;
    */
    String saveBinaryFile(byte[] saveData, String savePath){ ... }

本方法的Demo代码如下:

    /**
    *  请下载 Demo.Zip,里面有保姆级示例代码,详细到另人发指!
    *  强烈建议荫新们去下载 Demo.Zip,即使用来参考学习,也非常有价值...
    */

saveFileHexstr() JS调用函数原型

    /**
    * 文件IO.保存二进制文件。本方法会先将接受到的HexString(十六进制字符串)转成二进制,然后再保存到指定的文件中。
    *
    * @param {String} saveData 欲保存的数据。HexString格式。共支持3种常用格式,分别为 -> 0:无分割符,如:'000102a1b2c3'; 1:逗号分割符,如:'00,01,02,a1,b2,c3'; 2:空格分割符,如:'00 01 02 a1 b2 c3';
    * @param {String} savePath 欲保存的绝对路径。提示:Android系统SD卡根目录的环境变量可以通过 getEnvirPath() 方法获取。
    * @return {String} 执行失败返回:空字符串,执行成功返回:被保存文件的绝对路径。温馨提示:若有需要,文件的绝对路径可以通过 filePathToUrl() 方法转换成URL路径;
    */
    String saveFileHexstr(String saveData, String savePath)

本方法的Demo代码如下:

    /**
    *  请下载 Demo.Zip,里面有保姆级示例代码,详细到另人发指!
    *  强烈建议荫新们去下载 Demo.Zip,即使用来参考学习,也非常有价值...
    */

saveFileBase64() JS调用函数原型

    /**
    * 文件IO.保存二进制文件。本方法会先将接受到的Base64字符串转成二进制,然后再保存到指定的文件中。
    *
    * @param {String} saveData 欲保存的数据(Base64格式)。
    * @param {String} savePath 欲保存的绝对路径。提示:Android系统SD卡根目录的环境变量可以通过 getEnvirPath() 方法获取。
    * @return {String} 执行失败返回:空字符串,执行成功返回:被保存文件的绝对路径。温馨提示:若有需要,文件的绝对路径可以通过 filePathToUrl() 方法转换成URL路径;
    */
    String saveFileBase64(String saveData, String savePath){ ... }

本方法的Demo代码如下:

    /**
    *  请下载 Demo.Zip,里面有保姆级示例代码,详细到另人发指!
    *  强烈建议荫新们去下载 Demo.Zip,即使用来参考学习,也非常有价值...
    */

readFileText() JS调用函数原型

    /**
    * 文件IO.读取文本型文件。执行成功后返回为UTF-16编码的文本格式,特别备注:UTF-16是JavaScript的默认编码,支持中文。延伸知识:很多同学以为JS的默认编码是UTF-8,这种想法是错误的,实际上JS和JAVA的默认编码都是UTF-16,请想想为什么我们总是需要在HTML中声明UTF-8,其实目的就是告诉浏览器,让它把JS的UTF-16自动转换成UTF-8,好方便我们作AJAX请求给服务器!
    *
    * @param {String} readPath 欲读取文档的绝对路径。提示:Android系统SD卡根目录的环境变量可以通过 getEnvirPath() 方法获取。
    * @param {Number} charType 该文档的字符集类型 ? 0:UTF-8 || 1:UTF-16 || 2:ASCII || 3:GBK ;注意:此处指的是该文件在存档时使用的编码类型,并不是指返回类型。返回类型固定为:UFT-16,否则存放到JavaScript的变量中就会乱码。换句话说,本函数在返回内容前,需要将先该文档的数据转换成UTF-16,至于为什么要这么作,小白请自行查阅jvm与编码相关的资料!如果不想查也没关系,你只要明白,这么做是科学的,是慎重的,是严谨的,是必须的,是对你有益的,内部帮你写了很多转换代码,没有这个参数,有了本参数能帮你省去很多事,明白这些就行了。
    * @return {String} 执行成功返回:文本内容,否则返回:空字符串
    */
    String readFileText(String readPath, int charType){ ... }

本方法的Demo代码如下:

    /**
    *  请下载 Demo.Zip,里面有保姆级示例代码,详细到另人发指!
    *  强烈建议荫新们去下载 Demo.Zip,即使用来参考学习,也非常有价值...
    */

readFileBinary() JS调用函数原型

    /**
    * 文件IO.读取二进制文件 ( byte[] )。执行成功后返回为:Object,该Object本质上是一个number数组,本方法可用于读取图片,音频,视频等。
    *
    * @param {String} readPath 欲读取的文件绝对路径。提示:Android系统SD卡根目录的环境变量可以通过 getEnvirPath() 方法获取。
    * @return {byte[]} 执行成功返回:文本内容,否则返回:空字符串
    */
    byte[] readFileBinary(String readPath){ ... }

本方法的Demo代码如下:

    /**
    *  请下载 Demo.Zip,里面有保姆级示例代码,详细到另人发指!
    *  强烈建议荫新们去下载 Demo.Zip,即使用来参考学习,也非常有价值...
    */

readFileHexstr() JS调用函数原型

    /**
    * 文件IO.读取二进制文件。执行成功后返回为:hexString(十六进制字符串),本方法可用于读取图片,音频,视频等。
    *
    * @param {String} readPath 欲读取的文件绝对路径。提示:Android系统SD卡根目录的环境变量可以通过 getEnvirPath() 方法获取。
    * @param {Number} hexForm 导出十刘进制字符串的格式。共支持3种常用格式,分别为 -> 0:无分割符,如:'000102a1b2c3'; 1:逗号分割符,如:'00,01,02,a1,b2,c3'; 2:空格分割符,如:'00 01 02 a1 b2 c3';
    * @return {String} 执行成功返回:十六进制字符串,否则返回:空字符串
    */
    String readFileHexstr(String readPath, int hexForm) { ... }

本方法的Demo代码如下:

    /**
    *  请下载 Demo.Zip,里面有保姆级示例代码,详细到另人发指!
    *  强烈建议荫新们去下载 Demo.Zip,即使用来参考学习,也非常有价值...
    */

readFileBase64() JS调用函数原型

    /**
    * 文件IO.读取二进制文件。执行成功后返回为:Base64格式,本方法可用于读取图片,音频,视频等。
    *
    * @param {String} readPath 欲读取的文件绝对路径。提示:Android系统SD卡根目录的环境变量可以通过 getEnvirPath() 方法获取。
    * @return {String} 执行成功返回:Base64格式字符串,否则返回:空字符串
    */
    String readFileBase64(String readPath){ ... }

本方法的Demo代码如下:

    /**
    *  请下载 Demo.Zip,里面有保姆级示例代码,详细到另人发指!
    *  强烈建议荫新们去下载 Demo.Zip,即使用来参考学习,也非常有价值...
    */

uploadFile() JS调用函数原型

    /**
    * 文件IO.从指定路径上传(POST)文件到服务器
    *
    * @param {String}     url 上传链接
    * @param {String}     sveaPath 文件路径
    * @param {Number}     timeout 等待超时
    * @param {function}   callBackStatus 上传进度回调
    * @param {jsonObject} requestHeader 自定义请求头。荫新们不要随意设置,无特殊需求,流派本参数留空即可。
    * @return {void} 为保障主UI线程流畅,本API为异步执行,没有返回值;
    */
    void uploadFile(String url, String filePath, int timeout, function callBackStatus, JSONObject requestHeader){ ... }

本方法的Demo代码如下:

    /**
    *  请下载 Demo.Zip,里面有保姆级示例代码,详细到另人发指!
    *  强烈建议荫新们去下载 Demo.Zip,即使用来参考学习,也非常有价值...
    */

downFile() JS调用函数原型

    /**
    * 文件IO.下载文件并保存到指定路径
    *
    * @param {String}     url 下载链接。支持 http 和 https 两种协议;
    * @param {String}     sveaPath 保存的绝对路径。提示:Android系统SD卡根目录的环境变量可以通过 getEnvirPath() 方法获取。
    * @param {Number}     timeout 等待超时,单位为:毫秒;注意:本参数不可忽略,必须要设置!建议取值范围:30000 - 180000
    * @param {function}   callBackStatus 下载进度回调
    * @param {jsonObject} requestHeader 自定义请求头。荫新们不要随意设置,无特殊需求,流派本参数留空即可。
    * @return void 为保障主UI线程流程,本API为异步执行,没有返回值;
    */
    void downFile(String url, String sveaPath, int timeout, function callBackStatus, JSONObject requestHeader){ ... }

本方法的Demo代码如下:

    /**
    *  请下载 Demo.Zip,里面有保姆级示例代码,详细到另人发指!
    *  强烈建议荫新们去下载 Demo.Zip,即使用来参考学习,也非常有价值...
    */

copyFile() JS调用函数原型

    /**
    * 文件IO.复制文件
    *
    * @param {String} oriFileName 原文件的绝对路径。提示:Android系统SD卡根目录的环境变量可以通过 getEnvirPath() 方法获取。
    * @param {String} newFileName 新文件的绝对路径。提示:Android系统SD卡根目录的环境变量可以通过 getEnvirPath() 方法获取。
    * @return {Boolean} 执行成功返回:true,否则返回:false
    */
    boolean copyFile(String oriFileName, String newFileName){ ... }

本方法的Demo代码如下:

    /**
    *  请下载 Demo.Zip,里面有保姆级示例代码,详细到另人发指!
    *  强烈建议荫新们去下载 Demo.Zip,即使用来参考学习,也非常有价值...
    */

moveFile() JS调用函数原型

    /**
    * 文件IO.移动文件
    *
    * @param {String} oriFileName 原文件的绝对路径。提示:Android系统SD卡根目录的环境变量可以通过 getEnvirPath() 方法获取。
    * @param {String} newFileName 移动后的绝对路径。提示:Android系统SD卡根目录的环境变量可以通过 getEnvirPath() 方法获取。
    * @return {Boolean} 执行成功返回:true,否则返回:false
    */
    boolean moveFile(String oriFileName, String newFileName){ ... }

deleteFile() JS调用函数原型

/**
*  请下载 Demo.Zip,里面有保姆级示例代码,详细到另人发指!
*  强烈建议荫新们去下载 Demo.Zip,即使用来参考学习,也非常有价值...
*/
    /**
    * 文件IO.删除文件
    *
    * @param {String} fileName 该文件的绝对路径。提示:Android系统SD卡根目录的环境变量可以通过 getEnvirPath() 方法获取。
    * @return {Boolean} 执行成功返回:true,否则返回:false
    */
    @UniJSMethod(uiThread = false)
    boolean deleteFile(String fileName){ ... }

本方法的Demo代码如下:

enumFile() JS调用函数原型

/**
*  请下载 Demo.Zip,里面有保姆级示例代码,详细到另人发指!
*  强烈建议荫新们去下载 Demo.Zip,即使用来参考学习,也非常有价值...
*/
    /**
    * 文件IO.枚举文件列表 ( 可用来做强大的文件浏览器 )。温馨提示:若有需要,通过本方法可以搭建任何需求的文件浏览器。只要您愿意并善用UI组件,您完全可以通过本方法搭建高端的、精美的、灵活的、甚至是远胜系统自带的文件浏览器。
    *
    * @param {String} fileName 被枚举目录的绝对路径。提示:Android系统SD卡根目录的环境变量可以通过 getEnvirPath() 方法获取。
    * @param {Number}    enumType 枚举类型。0:枚举目录和文件,1:仅枚举目录,2:仅枚举文件
    * @return {String} 执行成功返回:list,多个文件之间用‘,’分割
    */
    String enumFile(String fileName, int enumType){ ... }

本方法的Demo代码如下:

    /**
    *  请下载 Demo.Zip,里面有保姆级示例代码,详细到另人发指!
    *  强烈建议荫新们去下载 Demo.Zip,即使用来参考学习,也非常有价值...
    */

searchFile() JS调用函数原型

    /**
    * 文件IO.同步搜索匹配文件 (用来查找文件)。温馨提示:本方法为同步方法,使用时应当在执行函数前加上[async]关键字,否则可能会造成UI主线程假死,导致APP本刊崩溃!!!
    *
    * @param {String}  fileType 起始搜索目录。本参数为:必选。提示:Android系统SD卡根目录的环境变量可以通过 getEnvirPath() 方法获取。
    * @param {Boolean} isInfinite 是否无限深入搜索子目录和子文件。本参默认为:false,false表示只搜索目录中的直属子文件;
    * @param {String}  fileType 匹配文件的类型。本参数为:可选,多个类型可用英文逗号分割,例:".jpg,.png,.fig",本参数若为:"*",将表示无条件匹配所有文件。
    * @param {String}  nameContain 匹配名称中包含的关键字。本参数为:可选,多个关键字可用英文逗号分割,例:"2019,2020,2021,2022"
    * @return {Number} 执行成功返回:匹配到的文件总数,否则返回:0;
    */
    int searchFile(String onPath, boolean isInfinite, String fileType, String nameContain, function callBackRes){ ... }

本方法的Demo代码如下:

    /**
    *  请下载 Demo.Zip,里面有保姆级示例代码,详细到另人发指!
    *  强烈建议荫新们去下载 Demo.Zip,即使用来参考学习,也非常有价值...
    */

searchFileAsync() JS调用函数原型

    /**
    * 文件IO.异步搜索匹配文件 (用来查找文件)。温馨提示:本方法为异步方法,调用后会立即返回,不会阻塞UI主线程。
    *
    * @param {String}  fileType 起始搜索目录。本参数为:必选。提示:Android系统SD卡根目录的环境变量可以通过 getEnvirPath() 方法获取。
    * @param {Boolean} isInfinite 是否无限深入搜索子目录和子文件。本参默认为:false,false表示只搜索目录中的直属子文件;
    * @param {String}  fileType 匹配文件的类型。本参数为:可选,多个类型可用英文逗号分割,例:".jpg,.png,.fig",本参数若为:"*",将表示无条件匹配所有文件。
    * @param {String}  nameContain 匹配名称中包含的关键字。本参数为:可选,多个关键字可用英文逗号分割,例:"2019,2020,2021,2022"
    * @return {void} 为保障主UI线程流畅,本API为异步执行,没有返回值;
    */
    void searchFileAsync(String onPath, boolean isInfinite, String fileType, String nameContain, function callBackRes){ ... }

本方法的Demo代码如下:

    /**
    *  请下载 Demo.Zip,里面有保姆级示例代码,详细到另人发指!
    *  强烈建议荫新们去下载 Demo.Zip,即使用来参考学习,也非常有价值...
    */

getFileSize() JS调用函数原型

    /**
    * 文件IO.获取文件的字节大小(长度,尺寸)
    *
    * @param {String} fileName 该文件的绝对路径。提示:Android系统SD卡根目录的环境变量可以通过 getEnvirPath() 方法获取。
    * @return {Number} 执行成功返回:文件的字节大小,否则返回:-1
    */
    long getFileSize(String fileName) { ... }

本方法的Demo代码如下:

    /**
    *  请下载 Demo.Zip,里面有保姆级示例代码,详细到另人发指!
    *  强烈建议荫新们去下载 Demo.Zip,即使用来参考学习,也非常有价值...
    */

getFileMD5() JS调用函数原型

    /**
    * 文件IO.获取文件的MD5
    *
    * @param {string}        fileName 该文件的绝对路径。提示:Android系统SD卡根目录的环境变量可以通过 getEnvirPath() 方法获取。
    * @param {UniJSCallback} callBackStatus 计算结果回调。该函数中需要一个参数,用来接收计算结果;
    * @return {void} 为保障主UI线程流畅,本API为异步执行,没有返回值;
    * 
    * void getFileMD5(String filePath, UniJSCallback callBackRes) {...}
    */

本方法的Demo代码如下:

    /**
    *  请下载 Demo.Zip,里面有保姆级示例代码,详细到另人发指!
    *  强烈建议荫新们去下载 Demo.Zip,即使用来参考学习,也非常有价值...
    */

getFileModifiedTime() JS调用函数原型

    /**
    * 文件IO.获取文件最后一次修改的时间
    *
    * @param {String} fileName 该文件的绝对路径。提示:Android系统SD卡根目录的环境变量可以通过 getEnvirPath() 方法获取。
    * @return {String} 执行成功返回:时间戳,否则返回:空字符串
    */
    String getFileModifiedTime(String fileName){ ... }

本方法的Demo代码如下:

    /**
    *  请下载 Demo.Zip,里面有保姆级示例代码,详细到另人发指!
    *  强烈建议荫新们去下载 Demo.Zip,即使用来参考学习,也非常有价值...
    */

filePathToUrl() JS调用函数原型

    /**
    * 文件IO.将文件的绝对路径转换成URL路径
    *
    * @param {String} fileName 该文件的绝对路径。提示:Android系统SD卡根目录的环境变量可以通过 getEnvirPath() 方法获取。
    * @return {String} 执行成功返回:换成后的URL路径,否则返回:空字符串
    */
    String filePathToUrl(String fileName){ ... }

本方法的Demo代码如下:

    /**
    *  请下载 Demo.Zip,里面有保姆级示例代码,详细到另人发指!
    *  强烈建议荫新们去下载 Demo.Zip,即使用来参考学习,也非常有价值...
    */

隐私、权限声明

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

<uses-permission android:name="android.permission.INTERNET" /> <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.MOUNT_UNMOUNT_FILESYSTEM" />

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

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

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