Android 內嵌 HTML5 並進行互動

來源:互聯網
上載者:User

標籤: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 並進行互動

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.