js怎么和安卓交互

我们的应用想包成一个安卓APP,但是没有用phonegap,用的似乎是原生的,具体我也不太明白。我主要负责web,现在需要和安卓的哥们儿进行交互,它暴露给我一个函数比如说window.haha.hehe(),我调用这个之后安卓客户端就能调用原生的地图。我想要获取地图信息,但是不知道该怎么做。如果我在window.haha.hehe里传一个回调函数,但是android那边应该怎么写呢?网上看到一种方法,是把回调函数变成字符串传过去,安卓那边解析后执行。但是那样执行的作用域是全局的,根本无法访问到我调用window.haha.hehe()时作用域里的变量啊。
有没有什么比较好的方法呢,谢谢啦

阅读 13.4k
5 个回答

试试Crosswalk+Cordova,于是你就可以自己做应用开发了

你这边需要封装好,把你函数声明完成后,注册到一个全局的函数列表里,并把这个函数调用方式通过字符串或者其他方式传入到Android提供的函数里。

假设调用方式是callback[3](poi)
那么可以window.haha.hehe("callback[3]");告诉Android端调用callback[3]就可以啦。
这里很类似jsonp。

Android端就可以使用

javamWebView.loadUrl("javascript:callback[3](poi)");

调用到你的回调函数。

另外,这和你的变量作用域没有关系,举个例子

jsvar callback = [];
var clou = function () {
    var a = 3;
    var p = function (poi) {
        console.log(a);
    }
    callback.push(p);
};
clou();
callback[0]();

你看,能输出3

之前看到的博客,记下来了。

WebView 与 JS 交互

1.Android 利用 webView 调用网页上的JS 代码

Android 中可以通过WebView来实现和Js的交互,在程序中调用Js代码,
只需要将webView控件的支持Js的属性设置为true,
然后通过loadUrl就可以直接进行调用,如下所示:

mWebView.getSettings().setJavaScriptEnable(true);     
mWebView.loadUrl("javascript:test()");

2.网页上调用Android 中 Java 代码的方法

在网页中调用 Java 代码,需要在webView 控件中添加 javascriptInterface。如下所示

mWebView.addJavascriptInterface(new Object() {     
  public void clickOnAndroid() {    
    mHandler.post(new Runnable() {    
      public void run() {   
        Toast.makeText(Test.this, "测试调用java", Toast.LENGTH_LONG).show();   
      }   
    });   
  }   
}, "demo");

在网页中,只需要像调用 JS 方法一样进行调用就可以了

<div id='b'><a onclick="window.demo.clickOnAndroid()">b.c</a></div>

3.Java 代码调用 JS 并传递参数

首先调用带参数的 JS 函数,如 function test(str) ,
然后只需要在调用JS 时传入参数即可,如下所示:

mWebView.loadUrl("javascript:test('aa')");  

4.JS 中调用Java 函数并传递参数

首先一样需要带参数的函数形式,但需注意此处的参数需要final类型,
即得到以后不可修改,如果需要修改其中的值,可以先设置中间变量,
然后进行修改。如下所示:

mWebView.addJavascriptInterface(new Object() {  
  public void clickOnAndroid(final int i) {   
    mHandler.post(new Runnable() {   
      public void run() {   
        int j = i;   
        j++;   
        Toast.makeText(Test.this,    
        "测试调用java" + String.valueOf(j), Toast.LENGTH_LONG).show();   
      }   
    });   
  }   
}, "demo"); 

然后在 HTML 页面中,利用如下代码:

<div id='b'><a onclick="window.demo.clickOnAndroid(2)">b.c</a></div> 

即可实现调用。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题