Android WebView與JS互動及訊息處理
阿新 • • 發佈:2019-01-03
一、WebView與JS互動
1.JS呼叫本地方法
這個功能的實現還是比較容易的。直接呼叫WebView的該方法就可以新增介面了,不過先要啟動互動
?1 2 3 4 |
//
啟用javascript
mWebView.getSettings().setJavaScriptEnabled( true );
//
新增介面
public
void
addJavascriptInterface (Object object, String name)
|
Object是JS呼叫本地的類的物件,name是物件的別名,在JS可以用這個別名+點語法+方法名就可以呼叫本地的方法。例如:
1 2 3 4 5 |
WebView
mWebView;
//
...
mWebview.addJavascriptInterface( this ,
"myjs" );
|
再定義一個JS可以呼叫的方法:
?1 2 3 |
public
void
jsFunction(String string) {
System.out.println( "js呼叫了這個方法:"
+ string);
}
|
注意:該方法不可以定義成私有的,不然JS就不能呼叫
2.本地呼叫JS方法
這個就更容易了- -,直接用以下方法就行了,假設JS上有一個方法叫androidFunction()
1 |
mWebview.loadUrl( "javascript:androidFunction()" );
|
二、訊息處理
1、遇到Uncaught ReferenceError:...錯誤
出現該錯誤不會崩潰,它的意思是本地方法呼叫JS時沒有找到呼叫的方法。萬一我們呼叫的方法不存在,需要做相應的處理怎麼辦?Shamoo嘗試try ... catch ...抓取一下異常,發現什麼都沒有抓到...後來仔細看了一下錯誤Log的TAG,是Web Console。Shamoo想肯定有辦法抓取這個異常的,於是看了一下官方文件,終於發現了這麼一個方法:
?1 2 3 4 5 6 7 8 9 10 |
mWebview.setWebChromeClient( new
WebChromeClient() {
@Override
public
boolean
onConsoleMessage(ConsoleMessage consoleMessage) {
//
TODO Auto-generated method stub
if
(consoleMessage.message().contains( "Uncaught
ReferenceError" ))
{
//
do something...
}
return
super .onConsoleMessage(consoleMessage);
}
});
|
2.獲取JS方法的返回值
仔細觀察會發現WebView的loadUrl方法是沒有返回值的,那要是想要獲取JS方法的返回值就該怎麼做呢?Shamoo查了一些資料,發現網上也沒有很好的解決辦法,後來只能通過回撥的方法來實現返回,雖然很不靈活,不過也沒有辦法...
在loadUrl呼叫JS的一個方法,然後JS執行方法的時候,再呼叫Android本地的一個方法,並把返回值作為引數傳遞下來。