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

IT技术 java javascript android
2021-01-19 10:15:41

是否可以使用 addJavascriptInterface() 将 JavaScript 对象从 JavaScript 传递到 Java?沿着这些路线的东西:

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

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

6个回答

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

从我的测试中,您可以传递这些数组的任何原始字符串、字符串。但是,在多态的情况下,似乎接受 float 的方法具有优先权(可能是对方法进行排序的问题)。当我进一步调查时,我会发布一些关于这个的东西
2021-03-21 10:15:41
@WayneUroda:唉,我不知道有任何正式文件。
2021-03-26 10:15:41
有谁知道实际上是否有任何关于可以作为参数的确切内容以及可以从作为注入的 java 对象的一部分的方法返回的内容的任何文档?
2021-03-28 10:15:41
@Robert Siemer:然后使用 JSON。
2021-04-02 10:15:41
将 javascript 对象序列化为 json 字符串,然后将该字符串传递给 android 界面。现在将这个 json 字符串在 java 中反序列化为 java 对象。
2021-04-12 10:15:41

这就是我正在做的...

在安卓...

@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。

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

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

Java:

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 上的睾丸。

我可以运行这个功能

在 JavaScript 中:

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

在安卓中:

@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);
    }
}

祝你好运...

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

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

我可以确认这一点,但在 JS 空间中,它不是真正的 Javascript 数组。你会得到一个带有像length()和get()这样的方法的对象,我只能使用像getInt()这样的特定get()。基本上我很确定你在这里得到了一切:json.org/javadoc/org/json/JSONArray.html
2021-04-05 10:15:41
文档在哪里?WebView 的文档中只有一小部分专门介绍它。
2021-04-08 10:15:41