2012-04-02 4 views
8

웹 응용 프로그램을 안드로이드 버전으로 마이그레이션하고 있습니다. JSON 데이터를 받고 처리 한 후 페이지 내에 Javascript 객체 배열이 있습니다.Javascript 객체를 Android WebView에 전달할 수 있습니까?

어떻게 네이티브 안드로이드 컨트롤을 사용하여 디스플레이에 대한 웹보기 컨테이너에 자바 스크립트 객체 "밖으로"중 하나의 전체 내용을 전달할 수 있습니다?

결국, I는 가능한 자바 스크립트 객체의 각 속성에 대한 매개 변수를 갖는 방법으로 자바 스크립트 인터페이스를 작성할 수 - 있지만 지나치게 무거운 것으로 보인다.

아무도 도와 드릴 수 있습니까?

+1

확인 응답 http://stackoverflow.com/questions/2250917/passing-a-javascript-object-using-addjavascriptinterface-on-android/32698399#32698399 –

답변

15

는 안드로이드의 WebView 여기에 유용합니다 addJavascriptInterface(Object obj, String interfaceName)라는 메서드가 포함되어 있습니다. 이 방법을 사용

, 당신은 인터페이스로 추가 객체 obj은 웹보기에서 자바 스크립트 코드를 통해 액세스 할 수 있습니다. 귀하의 경우에는 일부 JavaScript 객체를 Java로 다시 전송하는 setter 메서드가있는 객체를 전달할 수 있습니다.

당신은 여전히 ​​JSON 객체로 자바 스크립트 객체를 변환하는 글루 코드를 작성해야합니다. 빠른 접근을 위해 자바 스크립트에서 전달 된 JSON 문자열을 사용하여 인터페이스가 자바 측에서 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"); 

그런 변수 jsonData에서 구문 분석되지 않은 JSON의 덩어리가 핸들러에서 자바 스크립트 측에 : 지금

Android.passObject("pageItems", jsonData); 

을, 자바 측에서 당신의 JSInterface는있을 것이다 JSONObject에서 제공하는 getter를 사용하여 액세스 할 수있는 항목을 포함하는 JSONObject입니다. Javascript 호출을 통해 생성 된 객체는 mObjectsFromJS 맵에 있습니다. 물론 JSInterface 클래스에 추가 도우미 메서드를 추가하여 개체를보다 효율적으로 관리 할 수 ​​있습니다.

내가 컴파일 또는 이러한 방법을 테스트, 그래서 당신은 그들에게 적절한 작동을 위해 조금 조정할해야 할 수도 없다. 그러나 바라건대 이것은 당신에게 아이디어를줍니다.

그러나 객체에 일관된 인터페이스와 데이터 항목이있는 경우 setter 메소드를 사용하여 JavaScript 객체 속성을 Java 객체 객체 필드에 바인딩하는 간단한 JavaScript 접착 함수를 만드는 것이 더 현명합니다.

참고 사항 이 코드는 원격 코드가 장치의 원시 코드를 트리거 할 수있게합니다. WebView에로드되는 페이지/스크립트를 완전히 제어 할 수없는 경우 obj에 의해 노출 된 동작이 악용을 허용하지 않아야합니다. 유사한 스레드에서

+0

는 당신에게 제이슨 감사 당신이 말하는 것에서는 자바 스크립트 객체를 자바 설정자 함수에 직접 전달하고 번역 할 것을 기대할 수는 없습니다.자바 스크립트 인터페이스 를 통해 다시 인코딩 된 문자열을 전달 - - 자바 객체로 디코딩 내 JSON 객체를 받아 다시 JSON 인코딩 된 문자열 에 다시 복귀 - : 그래서, 내가해야, 다시 시작하려면 데이터에 올바르게 액세스 할 수있는 모든 것. 해명 해 주셔서 감사합니다. – Simon

+0

이 답변을 얻으려고하면 Android 인터페이스 v2.3.x에서 자바 스크립트 인터페이스가 완전히 깨져 있다는 것을 알게되었습니다. 부끄러움. – Simon

+0

Java 함수를 생성자로 만들고 싶으면 예를 들어 전화 할 것입니다. 'var ob = new Android.MyObject()', 네이티브 javascript 객체를 어떻게 반환하겠습니까? – Michael

관련 문제