前一段時間做公司的項目,涉及到WebView與JS之間的通訊,於是在網上查了點資料研究了一下下。
一、WebView與JS互動
1.JS調用本地方法
這個功能的實現還是比較容易的。直接調用WebView的該方法就可以添加介面了,不過先要啟動互動
// 啟用javascript mWebView.getSettings().setJavaScriptEnabled(true);// 添加介面public void addJavascriptInterface (Object object, String name)
Object是JS調用本地的類的對象,name是對象的別名,在JS可以用這個別名+點文法+方法名就可以調用本地的方法。例如:
WebView mWebView;// ...mWebview.addJavascriptInterface(this, "myjs");
再定義一個JS可以調用的方法:
public void jsFunction(String string) {System.out.println("js調用了這個方法:" + string);} 這樣在JS就可以調用這個方法
注意:該方法不可以定義成私人的,不然JS就不能調用
2.本地調用JS方法
這個就更容易了- -,直接用以下方法就行了,假設JS上有一個方法叫androidFunction()
mWebview.loadUrl("javascript:androidFunction()");
二、訊息處理
1、遇到Uncaught ReferenceError:...錯誤
出現該錯誤不會崩潰,它的意思是本地方法調用JS時沒有找到調用的方法。萬一我們調用的方法不存在,需要做相應的處理怎麼辦?Shamoo嘗試try ... catch ...抓取一下異常,發現什麼都沒有抓到...後來仔細看了一下錯誤Log的TAG,是Web Console。Shamoo想肯定有辦法抓取這個異常的,於是看了一下官方文檔,終於發現了這麼一個方法:
mWebview.setWebChromeClient(new WebChromeClient() { @Override public boolean onConsoleMessage(ConsoleMessage consoleMessage) { // TODO Auto-generated method stubif (consoleMessage.message().contains("Uncaught ReferenceError")) {// do something...}return super.onConsoleMessage(consoleMessage); }}); 這個方法可以監聽WebView的控制台訊息,然後判斷一下訊息是否包含“Uncaught ReferenceError”就可以捕獲該訊息了
2.擷取JS方法的返回值
仔細觀察會發現WebView的loadUrl方法是沒有返回值的,那要是想要擷取JS方法的返回值就該怎麼做呢?Shamoo查了一些資料,發現網上也沒有很好的解決辦法,後來只能通過回調的方法來實現返回,雖然很不靈活,不過也沒有辦法...
在loadUrl調用JS的一個方法,然後JS執行方法的時候,再調用Android本地的一個方法,並把返回值作為參數傳遞下來。