http://blog.csdn.net/carson_ho/article/details/64904691

通过 WebViewClient 的方法shouldOverrideUrlLoading ()回调拦截 url

  • 具体原理:

    1. Android通过 WebViewClient 的回调方法shouldOverrideUrlLoading ()拦截 url
    2. 解析该 url 的协议
    3. 如果检测到是预先约定好的协议,就调用相应方法

    即JS需要调用Android的方法

  • 具体使用: 
    步骤1:在JS约定所需要的Url协议 
    JS代码:javascript.html

    以.html格式放到src/main/assets文件夹里

<!DOCTYPE html>
<html><head> <meta charset="utf-8"> <title>Carson_Ho</title> <script> function callAndroid(){ /*约定的url协议为:js://webview?arg1=111&arg2=222*/ document.location = "js://webview?arg1=111&arg2=222"; } </script> </head> <!-- 点击按钮则调用callAndroid()方法 --> <body> <button type="button" id="button1" onclick="callAndroid()">点击调用Android代码</button> </body> </html>
  • 当该JS通过Android的mWebView.loadUrl("file:///android_asset/javascript.html")加载后,就会回调shouldOverrideUrlLoading (),接下来继续看步骤2:

步骤2:在Android通过WebViewClient复写shouldOverrideUrlLoading ()

MainActivity.java

public class MainActivity extends AppCompatActivity { WebView mWebView; // Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mWebView = (WebView) findViewById(R.id.webview); WebSettings webSettings = mWebView.getSettings(); // 设置与Js交互的权限 webSettings.setJavaScriptEnabled(true); // 设置允许JS弹窗 webSettings.setJavaScriptCanOpenWindowsAutomatically(true); // 步骤1:加载JS代码 // 格式规定为:file:///android_asset/文件名.html mWebView.loadUrl("file:///android_asset/javascript.html"); // 复写WebViewClient类的shouldOverrideUrlLoading方法 mWebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // 步骤2:根据协议的参数,判断是否是所需要的url // 一般根据scheme(协议格式) & authority(协议名)判断(前两个参数) //假定传入进来的 url = "js://webview?arg1=111&arg2=222"(同时也是约定好的需要拦截的) Uri uri = Uri.parse(url); // 如果url的协议 = 预先约定的 js 协议 // 就解析往下解析参数 if ( uri.getScheme().equals("js")) { // 如果 authority = 预先约定协议里的 webview,即代表都符合约定的协议 // 所以拦截url,下面JS开始调用Android需要的方法 if (uri.getAuthority().equals("webview")) { // 步骤3: // 执行JS所需要调用的逻辑 System.out.println("js调用了Android的方法"); // 可以在协议上带有参数并传递到Android上 HashMap<String, String> params = new HashMap<>(); Set<String> collection = uri.getQueryParameterNames(); } return true; } return super.shouldOverrideUrlLoading(view, url); } } ); } }

转载于:https://www.cnblogs.com/wcLT/p/7845455.html

android应用js相关推荐

  1. Android 与 JS 的交互 以及 JS与Android 的交互

    Android与JS交互以及JS与Android 的交互 是通过WebView互相调用方法 对于Android调用JS代码的方法有2种: 通过WebView的loadUrl() 通过WebView的e ...

  2. [转]JS调用Android里面的方法,Android调用JS里面的方法

    FROM : http://blog.csdn.net/hj563308597/article/details/45197709 Android WebView 在公司Android的开发过程中遇到一 ...

  3. Android与Js进行交互

    Android与JS进行交互主要依靠WebView,webView相当于一个桥梁来沟通两者. Android调用Js: 1.webView的loadurl()方法 互联网页面用:loadUrl(htt ...

  4. Android开发之android与JS互调 | Android与H5互调(附源码)

    我们先看下JS代码: <!DOCTYPE html> <html lang="en"> <head><meta charset=" ...

  5. android webview js 交互框架,自定义android混合框架开发实践1:实现基础andorid和webview交互...

    1. 本地web资源 1.构建assets/web文件夹 2.创建index.html你的html代码 3.使用本地web资源WebView mv = findViewById(...); mv.lo ...

  6. android的交互方式,Android与js的交互方式

    参考 Android:你要的WebView与 JS 交互方式 都在这里了 代码 一.交互方式总起 1.1 Android调用js + WebView.loadUrl("javascript: ...

  7. WebView的使用之Android与JS通过WebView互调方法

    WebView的使用之Android与JS通过WebView互调方法 一.概述:  Android与JS通过WebView实现交互,实际上是: Android调用JS的代码: JS调用Android的 ...

  8. Android开发-WebView中实现Android调用JS JS调用Android 【三】

    老早之前就想总结下Webview相关的知识点了,因为互联网大潮中,很多APP都会使用到Webview,像那些不计其数的电商APP,无一例外的使用Webview:或者一些非电商APP中的像广告页面,注册 ...

  9. android 和 js 之间交互的封装

    HybridBridge 项目地址:YouJZ/HybridBridge 简介:android 和 js 之间交互的封装 更多:作者   提 Bug    标签: webview-js-android ...

  10. android和js交互的代码,Android与JS代码交互

    现如今,很多Android APP都要与JS进行交互,而WebView就是Android与JS交互的桥梁,日常中最常见Android和JS交互有:APP注册协议,APP里的文章,APP里的活动页,这都 ...

最新文章

  1. 9 单元测试中不得不知的概念
  2. Web 服务器 之 简易WWW服务器的架设
  3. Maven全局配置文件settings.xml 全解
  4. 【Android 高性能音频】Oboe 音频流打开后 耳机 / 音箱 插拔事件处理 ( 设置 Oboe 音频设备 ID | setDeviceId 函数原型 | AudioStream 音频流 )
  5. 于企业而言,Linux 与 Windows 哪个更安全?
  6. Linux shell 中获取当前目录的方法
  7. linux压缩、解压操作
  8. Spark之SparkStreaming数据源
  9. 微软重新设计 Edge for Android 的用户界面
  10. poj1811(pollard_rho模板)
  11. 【手写数字识别】基于matlab知识库手写体数字识别【含Matlab源码 311期】
  12. 低版本向日葵本机识别码和验证码提取
  13. 二十一条自动化测试过程中遭遇的问题及解决思路
  14. 请把西游记倒过来看!
  15. 海外英语杂志社海外英语杂志社海外英语编辑部2022年第14期目录
  16. Java 求解自幂数(水仙花数)
  17. Python的Pexpect详解
  18. Maven工程报错:No goals have been specified for this build. You must specify a valid lifecycle phase or a
  19. 在word如何显示左侧的索引目录
  20. 〖3D激光点云〗激光雷达点云bin文件读取和显示!

热门文章

  1. 基于mcat开发以太坊智能合约
  2. 利用cache特性检测Android模拟器
  3. ARM64的启动过程之(四):打开MMU
  4. 使用snmp4j实现Snmp功能(一)
  5. JZOJ 5878. 【NOIP2018提高组模拟9.22】电路图 A
  6. 交换二维数组元素c语言,二维数组中元素替换问题!
  7. java+arrayblockquene_java集合(五)Queue集合之ArrayBlockingQueue 详解
  8. VALSE 2020-18 《如何写/审AI领域的论文》笔记
  9. 字符序列pascal程序
  10. 运输pascal 90分程序