Android与HTML5的交互主要是两个部分, 与HTML5的交互以及与JavaScript的交互, 与HTML5的交互可以通过注册onclick事件转化为与JavaScript的交互

Android与JavaScript的交互主要是通过相互调用方法实现的, Android对JavaScript的可以称之为调用, 但是JavaScript对于Android代码的调用则是通过拦截(@JavascriptInterface与映射实现存在较多漏洞, 也不推荐使用)

Android调用JavaScript代码有两种方式, 通过WebView对象的loadUrl(String)或evaluateJavascript(String, ValueCallback), 第二种方式便于获取返回值(虽然很少用), 下面给出一个第二种方法的demo:

// 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页面而非退出页面

最新文章

  1. MySQL高级特性
  2. insmod过程详解【转】
  3. target=&quot;_blank&quot;
  4. 推荐25款php中非常有用的类库
  5. 【Minimum Depth of Binary Tree】cpp
  6. VMware Workstation中linux(centos)与windows7共享文件夹
  7. mysql存储过程出现OUT or INOUT argument 10 for routine
  8. TFS2013团队使用纪要
  9. 【Hibernate步步为营】--双向关联一对一映射具体解释(一)
  10. HTML的第一课
  11. 更加清楚理解mvc结构
  12. maven 下载镜像文件卡,下载pom文件慢的问题
  13. 利用java8对设计模式的重构
  14. 手机开发-IOS
  15. FileWriter剖析
  16. vue element-ui 实现点击查看审核记录
  17. vs2015 去除 git 源代码 绑定,改成向tfs添加源码管理
  18. pyCharm最新2019激活码
  19. 如何使用Flash抓抓狂抓取网页Flash
  20. java接口实例

热门文章

  1. JQuery中Checkbox选择
  2. SPFieldLookupValue
  3. ansible使用5-Variables
  4. Springboot中SpringMvc拦截器配置与应用(实战)
  5. linux基础命令-文件查看类命令cat/tac/more/less/tail/head
  6. 如何在windows下运行Linux命令?(转载)
  7. MHA启动及关闭
  8. 【HHHOJ】ZJOI2019模拟赛(十五)03.17 解题报告
  9. rsync安装配置实时同步
  10. [Pytorch] pytorch笔记 &lt;三&gt;