有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

是否可以使用addJavascriptInterface()将JavaScript对象从JavaScript传递到Java?大致如下:

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

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


共 (6) 个答案

  1. # 1 楼答案

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

    爪哇:

    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代码

    这是安卓2.1和3.2上的测试

  2. # 2 楼答案

    我认为您还可以传递JSONObject和JSONArray。因此,不仅是基元类型,还包括存储在javascript数组[0,1,2]或字典{one:1,two:2}中的基元类型

    我没有在代码中验证,只是阅读文档。可能很快就要用了

  3. # 3 楼答案

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

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

    这就是我所做的

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

    其中数组是“[“string1”,“string2”]”,jsonObj是“{attr:1,attr2:“myName”}”

  4. # 4 楼答案

    当然,addJavascriptInterface()只适用于基本类型和字符串,因此不能传递任意Javascript对象

  5. # 5 楼答案

    我就是这样做的

    在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

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

  6. # 6 楼答案

    我可以运行此功能

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

    祝你好运