##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已足夠。