android行情一天不如一天。都说是铁打的后台,流水的前端,没人要的移动端。
言归正传,现在项目需求中原生app开发好使比较久,现需求架子是app,内容全是webview嵌套。但现在发现,纯网页流程度上实在不敢恭维,而且有些功能前端实现不了(比如不使用第三方加载txt、word、ppt、pdf文本,调用本机上传图片。)
第一步在webActivity中设置
WebSettings settings = mWebView.getSettings();
settings.setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(myWebChromeClient2, "android");//记住这个名字,可以随意命名
第二步写一个方法供js调用,可以有参数,参数根据需求自己定义
@JavascriptInterface
public void getImageName(String imagename) {
Log.e("TAG_imagename==", imagename + "");
this.imagename = imagename;
take(imagename);
}
js调用的时候就是android.getImageName("");
android调用js方法请看下面
比如js的方法是这样定义的
function getandroidString(String stringbase64){
alert(stringbase64);
}
android 调用的时候
mWebView.loadUrl("javascript:getandroidString(" + imagebase64 + ")");
于是坑出现了,因为我这边需要传两个值,所以定义两个参数。有时
mWebView.loadUrl却不调用,网上也有一下说法。
第一:webview.loadurl 的加载是在另一个线程中执行必须要在webview加载完毕执行。
mWebView.loadUrl("http://www.baidu.com");
mWebView.loadUrl("javascript:getandroidString(" + imagebase64 + ")");
也就是说虽然是这么写的,但实际上第二句有可能比第一句先完成
解决办法:重写MyWebViewClient的onPageFinished方法,在onPageFinished方法中处理操作。
第二:js有错误,前端还无法定位,这个就很蛋疼了。
然这两种方式都没有解决我的问题。因为我需要传递来两个参数,第一个参数字母数字都可以,第二个参数只要传递字母就无法执行。
开始想的是前端在定义两个参数的时候类型有差别,但前端再三保证,诶有问题。无意中发现一篇文章,上面写道有人要求传递参数的时候要加单引号‘’
他测试后发现没有问题,加不加一样。
然后我就想是不是一位内这个原因呢,特殊情况必须要加单引号‘’
mWebView.loadUrl("javascript:getandroidString('" + photoName + "','" + imagebase64 + "')");