Android 内嵌 HTML5 并进行交互

Posted seliote

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 内嵌 HTML5 并进行交互相关的知识,希望对你有一定的参考价值。

androidhtml5的交互主要是两个部分, 与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 并进行交互的主要内容,如果未能解决你的问题,请参考以下文章

Android原生代码与html5交互

iframe在顶级页面弹窗并交互

Atitit java集成内嵌浏览器与外嵌浏览器attilax总结

一处折腾笔记:Android内嵌html5加入原生微信分享的解决的方法

Android WebView与H5交互汇总

Android WebView与H5交互汇总