1. 程式人生 > >Android WebView與JS互動及訊息處理

Android WebView與JS互動及訊息處理

一、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就可以呼叫這個方法

注意:該方法不可以定義成私有的,不然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); } });
這個方法可以監聽WebView的控制檯訊息,然後判斷一下訊息是否包含“Uncaught ReferenceError”就可以捕獲該訊息了

2.獲取JS方法的返回值

仔細觀察會發現WebView的loadUrl方法是沒有返回值的,那要是想要獲取JS方法的返回值就該怎麼做呢?Shamoo查了一些資料,發現網上也沒有很好的解決辦法,後來只能通過回撥的方法來實現返回,雖然很不靈活,不過也沒有辦法...

在loadUrl呼叫JS的一個方法,然後JS執行方法的時候,再呼叫Android本地的一個方法,並把返回值作為引數傳遞下來。