在Android上使用addJavascriptInterface()传递JavaScript对象

时间:2010-02-12 09:56:40

标签: java javascript android

是否可以使用addJavascriptInterface()将JavaScript对象从JavaScript传递给Java?这些方面的东西:

var javaScriptObject = {"field1":"string1", "field2":"string2"};
JavaScriptInterface.passObject(javaScriptObject);

如何在Java端捕获这样的调用?设置接口以发送字符串没有问题,但是当我发送一个对象时,我在Java端收到null。

6 个答案:

答案 0 :(得分:28)

AFAIK,addJavascriptInterface()仅适用于原始类型和字符串,因此您无法传递任意Javascript对象。

答案 1 :(得分:9)

这就是我在做的......

在Android中......

@JavascriptInterface
public void getJSONTData(String jsonData) {
      try {
             JSONObject data = new JSONObject(jsonData); //Convert from string to object, can also use JSONArray
          } catch (Exception ex) {}
}

在JavaScript中......

var obj = { Name : 'Tejasvi', Age: 100};
var str = JSON.stringify(obj);
Android.getJSONTData(str);

截至目前,我找不到任何其他正确的方法将本机JavaScript对象直接传递给JavascriptInterface。

在{{1}中调用Android.getJSONTData({ Name : 'Tejasvi', Age: 100})会导致null(如果参数类型为Object)或undefined(如果参数类型定义为String) }}

答案 2 :(得分:8)

我找到了一个使用JSON的解决方案。我的Java方法返回一个JSONArray,在我收到的javascript代码上,并使用JSON.parse()转换为javascript向量。参见示例:

爪哇:

public class JavaScriptInterface {
Context mContext;
private static int ind=-1;
private static int [] val = { 25, 25, 50, 30, 40, 30, 30, 5, 9 };

public JavaScriptInterface(Context c) {
    mContext = c;
}

@JavascriptInterface
public JSONArray getChartData() {
    String texto = " [ {name: 'valor1', 2007: "+val[(++ind)%9]+"}, "+
                     " {name: 'valor2', 2007: "+val[(++ind)%9]+"}, "+
                     " {name: 'valor3', 2007: "+val[(++ind)%9]+"} ]"; 

    JSONArray jsonar=null;
    try {
        jsonar = new JSONArray(texto);
    } catch (JSONException e) {
        e.printStackTrace();
    }

    return jsonar;
}
}

现在是javascript代码:

window.generateData = function() {
        /*var data = [ {name: 'valor1', 2007: 50},
                     {name: 'valor2', 2007: 20},
                     {name: 'valor3', 2007: 30} ];     */
        var data = JSON.parse( Android.getChartData() );
        return data;
    };

上面评论的代码显示了静态时的情况,现在数据来自Java代码。

这是Android 2.1和3.2上的睾丸。

答案 3 :(得分:2)

我认为你也可以传递JSONObject和JSONArray。所以不仅是原始类型,还有存储在javascript数组[0,1,2]或字典{one:1,two:2}中的原始类型。

我没有在代码中验证这一点,只是阅读文档。可能很快就会使用它。

答案 4 :(得分:2)

您无法传递JSONObject或JSONArray,但您可以使用该表单发送字符串并将其解析为这些类型。

您的选择是使用字符串公开方法,然后您可以使用JSONObject或JSONArray来解析字符串并相应地使用它。

这就是我所做的。

@JavascriptInterface
public void passJSON(String array, String jsonObj) throws JSONException
{
    JSONArray myArray = new JSONArray(array);
    JSONObject myObj = new JSONObject(jsonObj);     
    ...

}

其中array是'[“string1”,“string2”]'和jsonObj是'{attr:1,attr2:“myName”}'

答案 5 :(得分:1)

我可以运行此功能

在Javascript中:

var data = {
            'username' : $('#username').val().trim(),
            'password' : $('#password').val().trim(),
            'dns' : $('#dns').val().trim()
        }
        var str = JSON.stringify(data);
        Native.getLoginService(str);

在Android中:

@JavascriptInterface
public void getLoginService(String jsonData){
    try{
        JSONObject data = new JSONObject(jsonData);
        String username = data.getString("username");
        String password = data.getString("password");
        String dns = data.getString("dns");

        Log.i("TAG",username + " - " + password + " - " + dns);

    }catch (Exception ex){
        Log.i("TAG","error : " + ex);
    }
}

祝你好运...