我正在將一個web應用程序遷移到android版本。 收到並處理了JSON數據之後,我在頁面中保存了一個Javascript對象數組。我可以將Javascript對象傳遞給Android WebView嗎?
我如何通過JavaScript對象「走出去」的網頁視圖容器使用原生Android控件顯示一個的全部內容?
最後,我可以創建具有用於每個可能的javascript對象的屬性參數的方法JavaScript接口 - 但這似乎是過於沉重。
任何人都可以在這方面幫助?
我正在將一個web應用程序遷移到android版本。 收到並處理了JSON數據之後,我在頁面中保存了一個Javascript對象數組。我可以將Javascript對象傳遞給Android WebView嗎?
我如何通過JavaScript對象「走出去」的網頁視圖容器使用原生Android控件顯示一個的全部內容?
最後,我可以創建具有用於每個可能的javascript對象的屬性參數的方法JavaScript接口 - 但這似乎是過於沉重。
任何人都可以在這方面幫助?
Android的WebView
包含一個名爲addJavascriptInterface(Object obj, String interfaceName)
方法應該會有幫助。
使用這種方法,你添加爲接口的對象obj
可以通過在Web瀏覽JavaScript代碼進行訪問。在你的情況下,你可以傳入一個具有setter方法的對象,該方法將一些JavaScript對象轉換回Java。
您仍需要創建您的JavaScript對象轉換成JSON對象的膠水代碼。對於一種快速方法,您可以讓您的界面使用從JavaScript傳遞的JSON字符串在Java端生成JSONObject。 Java中的JSONObject
類具有接受包含JSON數據的String的構造函數。因此,您可以直接將字符串化結果傳遞迴Java,並以此方式創建對象。例如:
class JSInterface {
HashMap<String, JSONObject> mObjectsFromJS = new HashMap<String, JSONObject>();
public void passObject(String name, String json) {
mObjectsFromJS.put(name, new JSONObject(json));
}
}
//At some point, register using:
mJSInterface = new JSInterface();
mWebView.addJavascriptInterface(mJSInterface, "Android");
然後,在JavaScript端,在處理程序中有未解析JSON的可變jsonData一個blob:
Android.passObject("pageItems", jsonData);
現在,你在Java端JSInterface將有包含項目的JSONObject,您可以使用JSONObject提供的getters訪問項目。通過Javascript調用創建的對象將位於mObjectsFromJS
地圖中。您當然想要將其他輔助方法添加到JSInterface類中,以便更好地管理對象。
我還沒有編譯或測試任何這些方法,所以你可能不得不調整他們一點正確的操作。但希望這給你的想法。但是,如果對象具有一致的接口和數據項,那麼只需創建一個簡單的JavaScript粘連函數,使用setter方法將JavaScript對象屬性綁定到Java端對象字段將更爲明智。
請注意 這是給觸發設備上的原生代碼遠程代碼的能力。如果您無法完全控制正在加載到WebView
中的頁面/腳本,則應確保obj
公開的行爲不允許任何漏洞利用。
謝謝你傑森, 從你所說的話,不可能「簡單地」將javascript對象直接傳遞給java setter函數並期望它被翻譯。 因此,要恢復,我需要: - 把我的JSON對象,將其恢復爲一個JSON編碼字符串 - 通過JavaScript接口, 通過編碼字符串備份 - 它解碼成一個Java對象 所有那些能夠正確訪問數據。 謝謝你澄清這一點。 – Simon 2012-04-03 07:34:00
試圖讓這個答案工作後,我發現JavaScript的界面在Android的v2.3.x中完全破解。恥辱。 – Simon 2012-04-30 15:31:51
如果我想讓我的Java函數成爲構造函數,那麼我會打電話給'var ob = new Android.MyObject()',我將如何返回一個原生的javascript對象? – Michael 2017-10-19 00:26:08
入住類似於螺紋的答案 http://stackoverflow.com/questions/2250917/passing-a-javascript-object-using-addjavascriptinterface-on-android/32698399#32698399 – 2015-09-21 15:02:51