更新记录
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:未测试 | × |
原生插件通用使用流程:
- 购买插件,选择该插件绑定的项目。
- 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
- 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
- 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
- 开发完毕后正式云打包
付费原生插件目前不支持离线打包。
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);
// });
// });
});
});
})
}