[Android]JavaScript與Android溝通

------------有問題的方法-------------------------------------------------------------------
在 Android 裡將網頁載入到畫面使用 WebView 元件就可以很輕鬆達成任務,如果要再加上跟 JavaScript 的互動的話
Android 系統也提供了互通機制可從 Android 呼叫 JavaScript 的函式或從 JavaScript 呼叫 Android 的函式。


設定 Android 端

建立一個類別 JavaScriptInterface
專門給 JavaScript 呼叫
1
2
3
4
5
6
/** 建立給 JavaScript 呼叫的函式 **/
public class JavaScriptInterface {
    public void fun1() {
        //Android 要執行的程式碼
    }
}
設定 WebView 的功能
1
2
3
4
5
//啟用 WebView 的 JavaScript 執行功能
webView.getSettings().setJavaScriptEnabled(true);
//設定允語 JavaScript 呼叫的對應名稱
webView.addJavascriptInterface(new JavaScriptInterface(), "android");

設定 JavaSript 端

1
2
3
4
5
<script type="text/javascript">
    function fun2() {
        //JavaScript 要執行的程式碼
    }
</script>

JavaScript 與 Android 程式碼互相呼叫

Android
1
mWebView.loadUrl("javascript:fun2()");
JavaScript
1
window.android.fun1();
--------------------------------------------------------------------------------------------------------------------------
------------解決的方法-------------------------------------------------------------------
上列方法在一些版本或在一些手機上無法進行溝通,因此本人使用以下的方法。
設定Html端
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html>
<html>
    <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     <title>Example</title>
        <meta name="viewport" content="user-scalable=yes,target-densityDpi=device-dpi,width=device-width" />
  <script type='text/javascript'>
   function showMsg() {
    prompt("This is prompt", "defaultValue");
   }
  </script>
    </head>
 <body>
  <input type='button' value='Click Me' onclick='showMsg();' />
 </body>
</html>

設定Android的WebView

透過WebChromeClent我們可以利用這個方式來非直接的調用 java 函式, 
特別注意的是第 10 行, 如果不 cancel, 畫面就會因為這個 prompt 而無法操作喔.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
WebChromeClient mWebChromeClient = new WebChromeClient() {
 @Override
 public boolean onJsPrompt(WebView view, String url, String message,
   String defaultValue, JsPromptResult result) {
  if ((defaultValue != null) && (defaultValue.length() != 0)) {
   if (defaultValue.equalsIgnoreCase("jstesting")) {
    Toast.makeText(MainActivity.this, R.string.msg_js_call_toast, Toast.LENGTH_SHORT).show();
    result.cancel();
    return true;
   }
  }
   
  return super.onJsPrompt(view, url, message, defaultValue, result);
 }
  
};
參考資料:http://www.allenj.net/?p=2704
http://weakapp0320.blogspot.tw/2013/05/23x-android-os-java.html

留言

這個網誌中的熱門文章

[Unity]UGUI 原理篇 (一):Canvas 渲染模式

[Android]加載圖片導致內存溢出(Out of Memory 異常)