2010-02-12 15 views
24

是否可以使用addJavascriptInterface()將JavaScript對象從JavaScript傳遞到Java?沿着這些路線的東西:在Android上使用addJavascriptInterface()傳遞JavaScript對象

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

如何將這種調用在Java端拍攝的?我設置接口發送字符串沒有問題,但是當我發送一個對象時,我在Java端收到空。

回答

22

AFAIK,addJavascriptInterface()僅適用於原始類型和字符串,因此您無法傳遞任意Javascript對象。

+0

沒有辦法陣列? - 我需要傳遞一些「更長」的東西... – 2011-07-23 21:42:25

+5

@Robert Siemer:然後使用JSON。 – CommonsWare 2011-07-23 21:47:20

+0

或...我爲數組中的每個項調用一次Java方法。我希望有少於十個項目... – 2011-07-23 22:03:29

2

我想你也可以傳遞JSONObject和JSONArray。因此,不僅是原始類型,還有存儲在javascript數組[0,1,2]或字典{one:1,two:2}中的原始類型。

我沒有在代碼中驗證過,只是閱讀文檔。可能會很快使用它。

+2

文檔在哪裏?在WebView的文檔中只有一小部分專門介紹它。 – 2011-06-21 11:56:39

+0

有人可以證實這一點嗎? – 2011-07-23 21:41:34

+0

我可以證實這一點,但在JS空間中,它不是一個真正的Javascript數組。你會得到一個像length()和get()這樣的對象,我只能像getInt()那樣使用特定的get()。基本上我很確定你在這裏得到了一切:http://www.json.org/javadoc/org/json/JSONArray.html – 2012-05-31 20:23:42

7

我找到了一個解決方案,使用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上的睾丸。

1

您無法傳遞JSONObject或JSONArray,但可以使用該表單發送字符串並將它們解析爲這些類型。

您的選擇是公開使用字符串的方法,然後您可以使用JSONObject或JSONArray解析字符串並相應地使用它。

這是我做的。

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

} 

其中陣列 '[ 「字符串1」, 「字符串2」]' 和jsonObj是 '{ATTR:1,attR2位: 「MYNAME」}'

+0

這可能是一個很好的答案,如果是例子,並且清晰完整 – 2015-09-21 13:43:22

4

這是我過得怎麼樣?

在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)或undefinedgetJSONTData(如果參數類型被定義爲String)。

0

我可以運行這個功能

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

祝你好運......