这几天用Nexus5 4.4.4系统做一个简单的手机设备号获取,然后调用javascript显示在网页里的功能,以前做过n多类似的程序,结果程序一运行啥问题都出来了,呵呵
[INFO:CONSOLE(1)] "Uncaught ReferenceError: is not define
I/chromium(490): [INFO:CONSOLE(1)] "Uncaught SyntaxError: Unexpected token ILLEG
[Android] Web Console: Uncaught TypeError: Object [object Object] has no method 'xxx'
总结来看就是上述问题,先看代码吧
demo.html
无标题文档
href="http://www.baidu.com" 打开baidu
href="http://www.baidu.com/closeappwin" 关闭浏览器closeappwin
href="new://www.sohu.com/" 在当前浏览器打开一个子浏览器new subwindow
看看我的android 代码如下:
private void loadUrl(){
String key="";
String androidID="";
try{
androidID = Secure.getString(getContentResolver(),Secure.ANDROID_ID);
Log.d(TAG, "androidID:"+androidID);
}catch(Exception e){
Log.e(TAG, "");
}finally{
String script=String.format("javascript:getDeviceID('"+androidID+"')");
mWebview.evaluateJavascript(script, new ValueCallback() {
@Override
public void onReceiveValue(String value) {
Log.d(TAG, "onReceiveValue value=" + value);
if(value!=null){
flag_get_deviceid=true;
}
}});
//mWebview.loadUrl("javascript:getDeviceID('maomao')");
}
}
基本上就出现上面的错误了,我想是不是4.4的系统在写法上跟低版本不一样,还是用了2种调用方式:
mWebview.evaluateJavascript
mWebview.loadUrl("javascript:getDeviceID('maomao')");
那最后的判断就是一种可能: 调用getDeviceID 方法的时候,js没有加载完毕。
解决办法:
private class WebViewClientDemo extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.d(TAG, " url:"+url);
view.loadUrl(url);// 当打开新链接时,使用当前的 WebView,不会使用系统其他浏览器
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
//在这里执行你想调用的js函数
if(!flag_get_deviceid){
loadUrl();
}
}
}
最后顺便提一下 webview.evaluateJavascript的好处,这个方法,可以把js函数的return结果获取到:
mWebview.evaluateJavascript(script, new ValueCallback() {
@Override
public void onReceiveValue(String value) {
Log.d(TAG, "onReceiveValue value=" + value);
if(value!=null){
flag_get_deviceid=true;
}
}});