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 + "')");