標籤雲

搜尋此網誌

2011/12/20

Android 筆記-讓 WebView 裡的 javascript 呼叫 java

這幾天碰到了一個問題
在 WebView 裡面有撥電話的連結
使用類似下面這樣的 html 碼
<a href="tel:0288888888">0288888888</a>

點下連結時 Android 會叫出撥號介面並且自動將號碼填進去
使用者只要按下撥號鍵就可以撥出

不過要是電話號碼有分機資訊時
我們需要的電話號碼可能是 0288888888,123 這樣的格式(","代表暫停兩秒)
使用上述方法叫出撥號介面的話
Android 會把","及其後面的號碼都給去掉

為此我做了一些測試
發現如果是透過 Intent.ACTION_DIAL 叫出撥號介面會出現一樣情形
但是 Intent.ACTION_CALL 直接撥號可以正常撥出分機

所以只要我讓 WebView 呼叫 java
透過 Intent.ACTION_CALL 直接撥號
就可以解決分機的問題了

那要怎麼做呢?
就是用 addJavascriptInterface 這個方法

把要做的事情寫在一個對應 Object 的 method 裡面
MyObj myObj = new MyObj();

public class MyObj{

//After API 17, you will have to annotate each method with @JavascriptInterface within your class that you'd like to access from Javascript.

@JavascriptInterface
public void telext(String telStr) {
Uri uri = Uri.parse("tel:"+telStr);
Intent intent = new Intent(Intent.ACTION_CALL, uri);  
startActivity(intent); 
}

}

在 WebView 載入資料前要指定對應的 Obj
//打開 JavaScriptEnabled 並加入對應物件
myWebView.getSettings().setJavaScriptEnabled(true);
myWebView.addJavascriptInterface(myObj, "myObj");

addJavascriptInterface 需要傳入兩個參數
第一個是 Object 物件,第二個是 javascript 呼叫時的名稱

載入的 html 就可以用類似這樣的方式呼叫 java
<a href="#" onClick="window.myObj.telext('"+sContactTel+"');\">sContactTel</a>

沒有留言: