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分別對應JS中的alert和prompt。
在web中調用方式:
<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的遠程方法上面聲明一個@JavascriptInterface,
/** Show a toast from the web page */
@JavascriptInterface
public void showToast(String toast) {
Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
}
}
addJavascriptInterface是Android提供的方法,包含兩個參數。第一個是java中實現的類,類提供了JavaScript訪問方法;第二個參數是java類映射到javascript的對象名。
在web中調用方式:
<button onclick="showAndroidToast('addjavascriptinterface');">showAndroidToast</button>
<script type="text/javascript">
function showAndroidToast(toast) {
Android.showToast(toast);
}
</script>
第二種方法在Android4.2一下存在安全漏洞,詳細的漏洞可以見烏云平臺的這份報告:WebView中接口隱患與手機掛馬利用。這種漏洞尤為在訪問第三方地址時出現。在Android 4.2以上的,google作了修正,通過在Java的遠程方法上面聲明一個@JavascriptInterface。Android4.2以下還沒有好的方法,只能限制訪問特定地址實現安全。但是對于我們自己的Hybird APP已足夠。