更新记录

1.0.0(2020-09-10)

解决android.util.Base64的var bytes = Base64.decode(base64Str,0);解码大小限制,返回为null的问题


平台兼容性

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


1. 引入依赖包

// 文件操作
const Helper = uni.requireNativePlugin('lizhao-Helper')

2.base64解码

// njs的使用方法有大小限制,会出现Base64.decode(base64Str,0)为null
let Base64 = plus.android.importClass("android.util.Base64");
let bytes = Base64.decode(base64Str,0);//有大小限制已舍弃此方法

/**
 * 此处需要把base64前缀去除,解码后,拿到字节流数组
 * 去除头部如data:image/jpg;base64,留下base64编码后的字符串
**/
let index=base64.indexOf(',')
let base64Str=base64.slice(index+1,base64.length)
//base64编码的字符串获取bytes字节流,此bytes为编码的
let bytes = Helper.Str2Bytes(base64Str,'utf-8').data;
// bytes再去解密,得到原始的字节流bytes
bytes=Helper.Base64Decode(bytes,0).data;

3.插件方法

//读取文件
//传入文件绝对路径path
let ByteArray=Helper.readFile2Stream(path).data

//base64解码
//传入byte字节数组
let ByteArray=Helper.Base64Decode(byte,0).data

//base64加密
//传入byte字节数组
let ByteArray=Helper.Base64Encode(byte,0).data

//字符串转bytes
//传入字符串和编码格式
let bytes=Helper.Str2Bytes(base64Str,'utf-8').data

//bytes转字符串
//传入bytes和编码格式
let srt=Helper.Bytes2Str(bytes,'utf-8').data

4.实例方法

//#ifdef APP-PLUS
// 文件操作
const Helper = uni.requireNativePlugin('lizhao-Helper')
//#endif

//文件的写入操作传入要写入文件名,base64
function lzFileWriter(base64,fileName) {
    return new Promise((result,reject)=>{
        // PRIVATE_WWW:本地文件系统常量,Number类型,固定值1。应用运行资源目录,仅本应用可访问。 为了确保应用资源的安全性,此目录只可读。
        // PRIVATE_DOC 本地文件系统常量,Number类型,固定值2。应用私有文档目录,仅本应用可读写。
        plus.io.requestFileSystem(plus.io.PRIVATE_DOC, function(fs) {
            /*
            fs.root是根目录操作对象DirectoryEntry
            getFile(path,flag,succesCB,errorCB)创建或打开文件
                path: ( DOMString ) 必选 要操作文件相对于当前目录的地址
                flag: ( Flags ) 可选 要操作文件或目录的参数 create: (Boolean 类型 )是否创建对象标记 指示如果文件或目录不存在时是否进行创建,默认值为false
                succesCB: ( EntrySuccessCallback ) 可选 创建或打开文件成功的回调函数
                errorCB: ( FileErrorCallback ) 可选 创建或打开文件失败的回调函数
            */ 
           // 创建或打开文件
            fs.root.getFile(fileName,{create:true},function(fileEntry) {
                // 获得平台绝对路径
                var fullPath = fileEntry.fullPath;  
                console.log('平台绝对路径',fullPath);
                // 引入安卓原生类
                // var Base64 = plus.android.importClass("android.util.Base64");
                var FileOutputStream = plus.android.importClass("java.io.FileOutputStream");
                //如果文件不存在则创建文件,如果文件存在则删除文件后重新创建文件
                var out = new FileOutputStream(fullPath); 
                /**
                 * 此处需要把base64前缀去除,解码后,在写入字节流数组
                 * 去除头部如data:image/jpg;base64,留下base64编码后的字符串
                **/
                let index=base64.indexOf(',')
                let base64Str=base64.slice(index+1,base64.length)
                //base64编码的字符串获取bytes字节流,此bytes为编码的
                let bytes = Helper.Str2Bytes(base64Str,'utf-8').data;
                /**
                 * bytes再去解密,得到原始的字节流bytes
                 * 由于使用njs的android.util.Base64的var bytes = Base64.decode(base64Str,0);解码有大小限制,只能写原始插件Helper
                **/
                bytes=Helper.Base64Decode(bytes,0).data;
                /**
                 * base64解密得到字节流bytes;但是njs有大小限制,解码不能超过100kb具体与手机系统版本有关
                 * Base64.decode(base64Str,0);此方法相当于上面的操作
                 * 【let bytes = Helper.Str2Bytes(base64Str,'utf-8').data;   bytes=Helper.Base64Decode(bytes,0).data;】
                **/
                // var bytes = Base64.decode(base64Str,0);//有大小限制已舍弃此方法
                try{
                    out.write(bytes); // byte 数组写入此文件输出流中。
                    out.flush(); //刷新写入文件中去。
                    out.close(); //关闭此文件输出流并释放与此流有关的所有系统资源。
                    result(fullPath)
                }catch(e){  
                    console.log(e.message);  
                    reject(e.message)
                }
                // 下面的方法只能写入字符串,无法写入字节流bytes
                // fileEntry文件系统中的文件对象,用于管理特定的本地文件
                // fileEntry.file(function(file) {
                //  /*createWriter获取文件关联的写文件操作对象FileWriter
                //      abort: 终止文件写入操作
                //      seek: 定位文件操作位置
                //      truncate: 按照指定长度截断文件
                //      write: 向文件中写入数据
                //  */
                //  fileEntry.createWriter(function(FileWriter) {
                //      FileWriter.write(base64);
                //      FileWriter.onwriteend=function(res){
                //          console.log(res.target.fileName);
                //          result(res.target.fileName)
                //      }
                //      FileWriter.onerror=function(error){
                //          console.log(error);
                //          reject(error)
                //      }
                //  }, function(e) {
                //      console.log(e);
                //  });
                // });
            });
        });
    })
}

隐私、权限声明

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

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

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

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