先看一段代码,我使用NativeJS实现将base64转换成文件保存到本地:
plus.io.requestFileSystem(plus.io.PRIVATE_DOC, function(fs) {
fs.root.getFile('tts.mp3', {
create: true
}, function(entry) {
// 获得平台绝对路径
var fullPath = entry.fullPath;
var Base64 = plus.android.importClass("android.util.Base64");
var strBase64 ='这是base64字符串,太长省略';
var bytes = Base64.decode(strBase64, 0);
var FileOutputStream = plus.android.importClass("java.io.FileOutputStream");
var out = new FileOutputStream(fullPath);
mui.alert(bytes.length);
out.write(bytes);
out.close();
});
});
这段代码本身是没有问题的,而我在测试中发现,有时候文件正常,而有时候文件是0B。
经过不断测试,包括图片、txt等文件格式,最终发现,这个与base64本身的大小有关系。
当我用4k以下的文件做测试时都能成功,4k以上都不成功(我并没有去确认是不是一定是4k这个临界值)
也就是说,base64超过一定大小时,var bytes = Base64.decode(strBase64, 0);这句代码得到的bytes是null。同样的,base64比较小时var bytes = Base64.decode(strBase64, 0);能得到正确的bytes,但是如果这个bytes超过一定大小,FileOutputStream.write也会执行出错,导致写不进数据。
而我转到AS里写原生代码,用同样的base64测试是没有问题的。所以,我得出的结论是,nativeJS传递参数的长度有限制。还请官方解答一下。最好有解决方案,我们用HB就是为了避免离线打包,减少打包工作,现在我又不得不写原生代码,然后安卓和ios又得分别离线打包。
·回复
一个最简单的例子:
var Toast = plus.android.importClass("android.widget.Toast");
var activity=plus.android.runtimeMainActivity();
var str='测试内容';
var t1=Toast.makeText(activity,str, Toast.LENGTH_LONG);
t1.show();
这是没问题的。只是当str超过一定长度就不行了。
而同样的超长str在原生代码里是没问题的
·回复
传入了多长的数据?
JS层到原生是有语言环境的转换,不要传入过长的数据。
·回复
Android系统webview数据传输时会有长度限制,如果需要传输超长数据,可以集成X5内核解决,https://ask.dcloud.net.cn/article/36806