Android中Java和JavaScript交互代码示例3以及常见问题

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

Android中Java和JavaScript交互

SEP 20TH, 2014

Android提供了一个很强大的WebView控件用来处理Web网页,而在网页中,JavaScript又是一个很举足轻重的脚本。本文将介绍如何实现Java代码和Javascript代码的相互调用。

如何实现

实现Java和js交互十分便捷。通常只需要以下几步。

  • WebView开启JavaScript脚本执行
  • WebView设置供JavaScript调用的交互接口。
  • 客户端和网页端编写调用对方的代码。

本例代码

为了便于讲解,先贴出全部代码

Java代码

lineos:false
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package com.example.javajsinteractiondemo;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.webkit.JavascriptInterface;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;

public class MainActivity extends Activity {
  private static final String LOGTAG = "MainActivity";
  @SuppressLint("JavascriptInterface")
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      final WebView myWebView = (WebView) findViewById(R.id.myWebView);
      WebSettings settings = myWebView.getSettings();
      settings.setJavaScriptEnabled(true);
      myWebView.addJavascriptInterface(new JsInteration(), "control");
      myWebView.setWebChromeClient(new WebChromeClient() {});
      myWebView.setWebViewClient(new WebViewClient() {

          @Override
          public void onPageFinished(WebView view, String url) {
              super.onPageFinished(view, url);
              testMethod(myWebView);
          }
          
      });
      myWebView.loadUrl("file:///android_asset/js_java_interaction.html");
  }
  
  private void testMethod(WebView webView) {
      String call = "javascript:sayHello()";
      
      call = "javascript:alertMessage(\"" + "content" + "\")";
      
      call = "javascript:toastMessage(\"" + "content" + "\")";
      
      call = "javascript:sumToJava(1,2)";
      webView.loadUrl(call);
      
  }
  
  public class JsInteration {
      
      @JavascriptInterface
      public void toastMessage(String message) {
          Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
      }
      
      @JavascriptInterface
      public void onSumResult(int result) {
          Log.i(LOGTAG, "onSumResult result=" + result);
      }
  }

}

前端网页代码

lineos:false js_java_interaction.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<html>
<script type="text/javascript">
    function sayHello() {
        alert("Hello")
    }

    function alertMessage(message) {
        alert(message)
    }

    function toastMessage(message) {
        window.control.toastMessage(message)
    }

    function sumToJava(number1, number2){
       window.control.onSumResult(number1 + number2)
    }
</script>
Java-Javascript Interaction In Android
</html>

调用示例

js调用Java

调用格式为window.jsInterfaceName.methodName(parameterValues) 此例中我们使用的是control作为注入接口名称。

lineos:false
1
2
3
4
5
6
7
function toastMessage(message) {
  window.control.toastMessage(message)
}

function sumToJava(number1, number2){
   window.control.onSumResult(number1 + number2)
}

Java调用JS

webView调用js的基本格式为webView.loadUrl(“javascript:methodName(parameterValues)”)

调用js无参无返回值函数
lineos:false
1
2
String call = "javascript:sayHello()";
webView.loadUrl(call);
调用js有参无返回值函数

注意对于字符串作为参数值需要进行转义双引号。

lineos:false
1
2
String call = "javascript:alertMessage(\"" + "content" + "\")";
webView.loadUrl(call);
调用js有参数有返回值的函数

Android在4.4之前并没有提供直接调用js函数并获取值的方法,所以在此之前,常用的思路是 java调用js方法,js方法执行完毕,再次调用java代码将值返回。

1.Java调用js代码
lineos:false
1
2
String call = "javascript:sumToJava(1,2)";
webView.loadUrl(call);
2.js函数处理,并将结果通过调用java方法返回
lineos:false
1
2
3
function sumToJava(number1, number2){
       window.control.onSumResult(number1 + number2)
}
3.Java在回调方法中获取js函数返回值
lineos:false
1
2
3
4
@JavascriptInterface
public void onSumResult(int result) {
  Log.i(LOGTAG, "onSumResult result=" + result);
}
4.4处理

Android 4.4之后使用evaluateJavascript即可。这里展示一个简单的交互示例 具有返回值的js方法

lineos:false
1
2
3
function getGreetings() {
      return 1;
}

java代码时用evaluateJavascript方法调用

lineos:false
1
2
3
4
5
6
7
8
private void testEvaluateJavascript(WebView webView) {
  webView.evaluateJavascript("getGreetings()", new ValueCallback<String>() {

  @Override
  public void onReceiveValue(String value) {
      Log.i(LOGTAG, "onReceiveValue value=" + value);
  }});
}

输出结果

lineos:false
1
I/MainActivity( 1432): onReceiveValue value=1

注意

  • 上面限定了结果返回结果为String,对于简单的类型会尝试转换成字符串返回,对于复杂的数据类型,建议以字符串形式的json返回。
  • evaluateJavascript方法必须在UI线程(主线程)调用,因此onReceiveValue也执行在主线程。

疑问解答

Alert无法弹出

你应该是没有设置WebChromeClient,按照以下代码设置

1
myWebView.setWebChromeClient(new WebChromeClient() {});

Uncaught ReferenceError: functionName is not defined

问题出现原因,网页的js代码没有加载完成,就调用了js方法。解决方法是在网页加载完成之后调用js方法

fileos:false
1
2
3
4
5
6
7
8
9
myWebView.setWebViewClient(new WebViewClient() {

  @Override
  public void onPageFinished(WebView view, String url) {
      super.onPageFinished(view, url);
      //在这里执行你想调用的js函数
  }
  
});

Uncaught TypeError: Object [object Object] has no method

安全限制问题

如果只在4.2版本以上的机器出问题,那么就是系统处于安全限制的问题了。Android文档这样说的

Caution: If you’ve set your targetSdkVersion to 17 or higher, you must add the @JavascriptInterface annotation to any method that you want available your web page code (the method must also be public). If you do not provide the annotation, then the method will not accessible by your web page when running on Android 4.2 or higher.

中文大意为

警告:如果你的程序目标平台是17或者是更高,你必须要在暴露给网页可调用的方法(这个方法必须是公开的)加上@JavascriptInterface注释。如果你不这样做的话,在4.2以以后的平台上,网页无法访问到你的方法。

解决方法
  • 将targetSdkVersion设置成17或更高,引入@JavascriptInterface注释
  • 自己创建一个注释接口名字为@JavascriptInterface,然后将其引入。注意这个接口不能混淆。这种方式不推荐,大概在4.4之后有问题。

注,创建@JavascriptInterface代码

lineos:false
1
2
3
public @interface JavascriptInterface {

}
代码混淆问题

如果在没有混淆的版本运行正常,在混淆后的版本的代码运行错误,并提示Uncaught TypeError: Object [object Object] has no method,那就是你没有做混淆例外处理。 在混淆文件加入类似这样的代码

lineos:false
1
2
3
4
5
keepattributes *Annotation*
keepattributes JavascriptInterface
-keep class com.example.javajsinteractiondemo$JsInteration {
    *;
}

All WebView methods must be called on the same thread

过滤日志曾发现过这个问题。

lineos:false
1
2
3
4
5
6
7
8
9
E/StrictMode( 1546): java.lang.Throwable: A WebView method was called on thread 'JavaBridge'. All WebView methods must be called on the same thread. (Expected Looper Looper (main, tid 1) {528712d4} called on Looper (JavaBridge, tid 121) {52b6678c}, FYI main Looper is Looper (main, tid 1) {528712d4})
E/StrictMode( 1546):   at android.webkit.WebView.checkThread(WebView.java:2063)
E/StrictMode( 1546):   at android.webkit.WebView.loadUrl(WebView.java:794)
E/StrictMode( 1546):   at com.xxx.xxxx.xxxx.xxxx.xxxxxxx$JavaScriptInterface.onCanGoBackResult(xxxx.java:96)
E/StrictMode( 1546):   at com.android.org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method)
E/StrictMode( 1546):   at com.android.org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:27)
E/StrictMode( 1546):   at android.os.Handler.dispatchMessage(Handler.java:102)
E/StrictMode( 1546):   at android.os.Looper.loop(Looper.java:136)
E/StrictMode( 1546):   at android.os.HandlerThread.run(HandlerThread.java:61)

在js调用后的Java回调线程并不是主线程。如打印日志可验证

lineos:false
1
ThreadInfo=Thread[WebViewCoreThread,5,main]

解决上述的异常,将webview操作放在主线程中即可。

1
2
3
4
5
6
webView.post(new Runnable() {
    @Override
    public void run() {
        webView.loadUrl(YOUR_URL).
    }
});

其他

AndroidJavaJavaScript交互 Android提供了一个很强大的WebView控件用来处理Web网页,而在网页中,JavaScript又是一个很举足轻重的脚本。本文将介绍如何实现Java代码Javascript代码的相互调用。 如何实现 实现Javajs交互十分便捷。通常只需要以下几步。 WebView开启JavaScript脚本执行 WebView设置供JavaScript调用的交互接口。 客户端 阅读详情

相关推荐

基础巩固(五)Android通过WebView与Js交互

WebView是一个基于webkit引擎、展现web页面的控件。Android的Webview在低版本高版本采用了不同的webkit版本内核,4.4后直接使用了Chrome。显示渲染web界面直接使用html文件(网络上或者本地asset)作为布局可与JavaScript交互调用WebView控件功能强大,除了具有一般View的属性设置外,还可以对url请求、页面加载、渲染、页面交互进行强大的处理。

芸兮的博客 3629

Android 基于 J2V8 运行 JavasScript 实践

以上基本上能解决大部分 Android 调用 js的代码逻辑了,这里对整体执行的流程进行一个总结1、通过 webpack 对多个 .js 文件打包2、初始化 V8 环境并加载 .js 文件3、注册 Java 方法,供 js 进行调用4、读取指定的模板5、执行目标 js 方法,并释放 v8 执行过程中产生的资源。

落叶挽歌的博客 1549

Java Bridge Method

bridge method 如果一个类继承了一个范型类或者实现了一个范型接口, 那么编译器在编译这个类的时候就会生成一个叫做桥接方法的混合方法(混合方法简单的说就是由编译器生成的方法, 方法上有synthetic修饰符), 这个方法用于范型的类型安全处理, 用户一般不需要关心桥接方法。 实例: //范型接口 public interface Parent<T> { v...

江城宴的博客 674

Android -- WebView 与 JS 交互方式总结

前言 现在很多App都选择混合开发模式,即App内置Web网页(Hybrid App),比如说很多电商平台,淘宝、京东、聚划算等等 App中加载网页是由Android的WebView实现的,其中涉及到Android客户端与Web网页交互的实现 下面是对 Android通过WebView与JS交互 的总结 1. 交互方式总结 Android与JS通过WebView互相调用的方法,实际上是: A...

一只驴在敲代码 6411

安卓混合开发实例——JS与Java交互

今天说说安卓混合开发。 曾经有一个话题是web终会一统app,然后我们看到随着时间的推移。web越来越强大(H5啊,JS各种框架啊),但同时原生app也在不断发展。 或许在将来还会再有这种话题论战,但目前,混合开发,结合web原生app二者各自的优势,已经是众望所归了。其中最常见的一种方式,在安卓的webview中嵌套web,通过各类设计,让二者进行交互。使得用户体验上几乎无法分辨出究竟是否纯

LeBang的博客 4600

androidjs交互代码,Android与JS代码交互

现如今,很多Android APP都要与JS进行交互,而WebView就是Android与JS交互的桥梁,日常中最常见AndroidJS交互有:APP注册协议,APP里的文章,APP里的活动页,这都是嵌套的H5页面。Android与JS交互有以下逻辑步骤:创建WebView创建Html文件创建JS文件WebView调用JS代码JS代码中调用Android代码1. 创建WebView创建一个布局文...

weixin_35846141的博客 2570

android webview js 交互框架,安卓中webview与javascript交互

当我们要实现丰富的图文混排效果的时候,我们一般会使用webview,这是一个功能十分强大的的控件,来看看官方的解释:A View that displays web pages. This class is the basis upon which you can roll your own web browser or simply display some online content wit...

weixin_42508114的博客 345

webview android js交互,Webview Android与js交互(示例代码)

Android中可以通过webview来实现js的交互,在程序中调用js代码,只需要将webview控件的支持js的属性设置为trueAndroid(Java)JavaScript(HTML)交互有四种情况:1) Android(Java)调用HTML中js代码2) Android(Java)调用HTML中js代码(带参数)3) HTML中js调用Android(Java)代码4) HTML...

weixin_42143092的博客 364

android java调用js方法参数_AndroidJavaJavaScript交互

Android提供了一个很强大的WebView控件用来处理Web网页,而在网页中,JavaScript又是一个很举足轻重的脚本。本文将介绍如何实现Java代码Javascript代码的相互调用。如何实现实现Javajs交互十分便捷。通常只需要以下几步。WebView开启JavaScript脚本执行WebView设置供JavaScript调用的交互接口。客户端网页端编写调用对方的代码。本例代码...

weixin_32028323的博客 703

安卓webview原生JavaScript(js)交互传值的4种方式 javajs交互 安卓JsBridge原理解析

JsBridge:安卓javascript最流行的交互方式,有以下4种方式可以实现交互传值 1,addJavascriptInterface:针对Android 4.2(API 17)及以上,只有标有@JavascriptInterface注解的public方法才能从js调用。而对targetSdkVersion为API Level 16及以下的app,js可以调用Java所有的publi...

编程小石头 2951

Android安全】AndroidJavaJS的交互

Android安全】AndroidJavaJS的交互

Juruo@Security 1571

android webview与js交互(动态添加js)

Toast.makeText(mContxt, “调用funFromAndroid:” + name, Toast.LENGTH_LONG).show();Toast.makeText(MainActivity.this, “js加载失败”, Toast.LENGTH_SHORT).show();注:此例为本地html与本地js交互,如想在本地html添加js,将js.js代码复制到html对应标签内即可。一、本地html与本地js交互(本地html引用本地js)读取js添加到String 类型中。

2501_90499563的博客 1480

java代码安卓代码_AndroidJava代码JavaScript交互

Android开发中,经常使用WebView展示需要实时更新的网页内容,这样服务端修改就可以而不需要App发新版本,而H5页面里面会有JavaScript代码处理一些业务逻辑。这里就会涉及到Android里面的Java代码JavaScript交互。例如,点击H5里面的按钮,需要调用Android里面的一些方法,或者Android里面的一些方法,需要把处理结果传给H5使用。那么两者之间是如何交互...

weixin_30430517的博客 245

android java js_AndroidJavaJavaScript交互实例

Android提供了一个很强大的WebView控件用来处理Web网页,而在网页中,JavaScript又是一个很举足轻重的脚本。本文将介绍如何实现Java代码Javascript代码的相互调用。如何实现实现Javajs交互十分便捷。通常只需要以下几步。1.WebView开启JavaScript脚本执行2.WebView设置供JavaScript调用的交互接口。3.客户端网页端编写调用对方的代...

weixin_29612623的博客 198

常见jsjava交互

** 前言 ** Android提供了一个很强大的WebView控件用来处理Web网页,而在网页中,JavaScript又是一个很举足轻重的脚本。本文将介绍如何实现Java代码Javascript代码的相互调用。 如何实现 实现Javajs交互十分便捷。通常只需要以下几步: 1、WebView开启JavaScript脚本执行。 2、WebView设置供JavaScript调用的交互接口。 3、客户端网页端编写调用对方的代码示例代码 java端: public class MainActivity

qq_35836473的博客 1468

Android与js交互实例

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666) 本文核心代码转自阳光岛主:http://blog.csdn.net/ithomer/article/details/8737999 Android中可以通过webview来实现js的交互,在程序中调用js代码...

孤云博客 5392

android与普通js交互androidvue打包的交互

一、安卓与常规js交互 android调用js方法 webView.loadUrl (javascript:callJS());这是android很早以前就有的一种调用js的方法,调用简单,但是缺点就是没有返回值,所以在4.4版本以后,又有了一个新的方法 webView.evaluateJavascript (javascript:callJsByEvaluateJavascript()” , new ValueCallback < String > ( ) { @Override

weixin_37391237的博客 2091

js与android交互,js怎么安卓交互

之前看到的博客,记下来了。WebView 与 JS 交互1.Android 利用 webView 调用网页上的JS 代码Android 中可以通过WebView来实现Js的交互,在程序中调用Js代码,只需要将webView控件的支持Js的属性设置为true,然后通过loadUrl就可以直接进行调用,如下所示:mWebView.getSettings().setJavaScriptEnable(t...

weixin_32491317的博客 409

android js交互_安卓原生js交互的4种方式 javajs交互 安卓JsBridge原理解析

JsBridge:安卓javascript最流行的交互方式,有以下4种方式可以实现交互传值1,addJavascriptInterface:针对Android 4.2(API 17)及以上,只有标有@JavascriptInterface注解的public方法才能从js调用。而对targetSdkVersion为API Level 16及以下的app,js可以调用Java所有的public方法。...

weixin_39879881的博客 451
上一篇: Android WebView 与 JavaScript 交互【经典】
下一篇: RecyclerView滑动源码分析
Manaasdfasdf
博客等级 码龄11年 131粉丝 151原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值