先看一段代码,我使用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

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Scroll Up