標籤:confirm cti back efi equal conf 地方 callback string
Android與HTML5的互動主要是兩個部分, 與HTML5的互動以及與JavaScript的互動, 與HTML5的互動可以通過註冊onclick事件轉化為與JavaScript的互動
Android與JavaScript的互動主要是通過相互調用方法實現的, Android對JavaScript的可以稱之為調用, 但是JavaScript對於Android代碼的調用則是通過攔截(@JavascriptInterface與映射實現存在較多漏洞, 也不推薦使用)
Android調用JavaScript代碼有兩種方式, 通過WebView對象的loadUrl(String)或evaluateJavascript(String, ValueCallback
// audioPrepareResult是當前頁面中的一個JavaScript方法// startRecordResult是Android本地方法返回的結果, 作為參數傳遞給JavaScript方法mWebView.evaluateJavascript("javascript:audioPrepareResult(\"" + startRecordResult + "\")", new ValueCallback<String>() { @Override public void onReceiveValue(String value) { // nothing }});
這裡有一個坑, 如果JavaScript方法的參數是一個字串的話, 一定要在參數前後手動加上"(引號), 否則JavaScript會產生undefined, 比較奇葩的是, 如果參數是一段JSON, 所以就有了"{ \"longitude\": 0, \"latitude\": 0}"這種代碼
JavaScript調用Android方法有三種, 第一種是通過WebView的addJavascriptInterface(Object, String)進行映射, 這個方法雖然很方便, 但是存在嚴重漏洞, 不推薦使用. 第二種方法是通過攔截shouldOverrideUrlLoading(WebView, String)進行URL攔截, 與約定匹配就進行對應的方法調用. 第三種是通過重寫WebChromeClient裡的onJsAlert(WebView view, String url, String message, String defaultValue, JsPromptResult result), onJsConfirm(/* 參數同onJsAlert/), onJsPrompt(/ 參數同onJsAlert*/)進行攔截對應的對話方塊, 匹配參數3的message, 與約定匹配就執行對應的Android代碼, 下面給出第三種代碼的demo:
mWebView.setWebChromeClient(new WebChromeClient() { @Override public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) { Uri uri = Uri.parse(message); if (uri.getScheme().equals("CallAndroidMethod")) { switch (uri.getAuthority()) { case "recordAudio": boolean recordAudioResult = MainActivity.this.recordAudio(); result.confirm(new Boolean(recordAudioResult).toString()); return true; default: break; } } result.confirm(new Boolean(true).toString()); return super.onJsPrompt(view, url, message, defaultValue, result); }});
調用這段代碼對應的 H5 代碼為:
<html> <head> <meta charset="UTF-8" /> <title>Android With H5 Demo</title> <script> function uploadImage() { var result = prompt("CallAndroidMethod://recordAudio?type=search"); } </script> </head> <body> <button type="button" id="recordAudioButton" onclick="recordAudio()">Record Audio</button> </body></html>
這裡有個坑, 在onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result)方法返回前一定要調用最後一個參數JsPromptResult的confirm(bool)方法, 否則會造成HTML5頁面無響應
其他一些操作:
WebView的canGoBack()與goBack()方法配合Activity的onKeyDown(int keyCode, KeyEvent event)可以實現使用者按返回鍵是返回上一個Web頁面而非退出頁面
Android 內嵌 HTML5 並進行互動