1.重寫WebChromeClient
final class MyWebChromeClient extends WebChromeClient {
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
Log.d("MyWebChromeClient", message);
Toast.makeText(OnJsPromptActivity.this, message, Toast.LENGTH_SHORT).show();
result.confirm();
return true;
}
@Override
public boolean onJsConfirm(WebView view, String url, String message,
JsResult result) {
// TODO Auto-generated method stub
return super.onJsConfirm(view, url, message, result);
}
@Override
public boolean onJsPrompt(WebView view, String url, String message,
String defaultValue, JsPromptResult result) {
Toast.makeText(OnJsPromptActivity.this, message, Toast.LENGTH_SHORT).show();
// TODO Auto-generated method stub
//return super.onJsPrompt(view, url, message, defaultValue, result);
result.confirm();
return true;
}
}
使用onJsAlert或者onJsPrompt,onJsAlert,onJsPrompt分別對(duì)應(yīng)JS中的alert和prompt。
在web中調(diào)用方式:
<button onclick="showAndroidToast('Hello Android!');">showAndroidToast</button>
<script type="text/javascript">
function showAndroidToast(toast) {
prompt('js prompt');
}
</script>
2.addJavascriptInterface
mWebView.addJavascriptInterface(new WebAppInterface(this), "Android");
public class WebAppInterface {
Context mContext;
/** Instantiate the interface and set the context */
WebAppInterface(Context c) {
mContext = c;
}
//在Android 4.2以上的,google作了修正,通過在Java的遠(yuǎn)程方法上面聲明一個(gè)@JavascriptInterface,
/** Show a toast from the web page */
@JavascriptInterface
public void showToast(String toast) {
Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
}
}
addJavascriptInterface是Android提供的方法,包含兩個(gè)參數(shù)。第一個(gè)是java中實(shí)現(xiàn)的類,類提供了JavaScript訪問方法;第二個(gè)參數(shù)是java類映射到j(luò)avascript的對(duì)象名。
在web中調(diào)用方式:
<button onclick="showAndroidToast('addjavascriptinterface');">showAndroidToast</button>
<script type="text/javascript">
function showAndroidToast(toast) {
Android.showToast(toast);
}
</script>
第二種方法在Android4.2一下存在安全漏洞,詳細(xì)的漏洞可以見烏云平臺(tái)的這份報(bào)告:WebView中接口隱患與手機(jī)掛馬利用。這種漏洞尤為在訪問第三方地址時(shí)出現(xiàn)。在Android 4.2以上的,google作了修正,通過在Java的遠(yuǎn)程方法上面聲明一個(gè)@JavascriptInterface。Android4.2以下還沒有好的方法,只能限制訪問特定地址實(shí)現(xiàn)安全。但是對(duì)于我們自己的Hybird APP已足夠。