2013/05/02

如何在 2.3.x android OS 呼叫 java 函式 ?

之前提到 WebView 與 javascript 使用,
但卻不適用於 android 2.3.x, 因為會有問題. (App 直接關閉)

下面是我所使用的方式, 讓我們可以在 2.3.x 去調用 java 函式.

稍微修改了一下所使用的 html, 修改 showMsg 所使用的方式
<!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");
}
</script>
</head>
<body>
<input type='button' value='Click Me' onclick='showMsg();' />
</body>
</html>

執行結果如下圖:


透過這個我們可以利用這個方式來非直接的調用 java 函式,
特別注意的是第 10 行, 如果不 cancel, 畫面就會因為這個 prompt 而無法操作喔.
 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);
  }
  
 };

再次修改一下 html 檔.
<!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", "jstesting");
}
</script>
</head>
<body>
<input type='button' value='Click Me' onclick='showMsg();' />
</body>
</html>

這樣就可以調用 java 函式了.

如果覺得上面方式有點怪異或麻煩, 也可以使用參考資料 [1] 的方式.
不過對我而言以上方式就是最簡單的方式了.

範例原始碼: WebViewExample4_1

參考資料:
[1]. http://fred-zone.blogspot.tw/2011/12/android-23x-javascript-interface.html