Android WebView
chứa phương pháp có tên addJavascriptInterface(Object obj, String interfaceName)
sẽ hữu ích ở đây.
Sử dụng phương pháp này, đối tượng obj
mà bạn thêm làm giao diện có thể được truy cập thông qua mã JavaScript trong Chế độ xem web. Trong trường hợp của bạn, bạn có thể truyền vào một đối tượng có phương thức setter chuyển một số đối tượng JavaScript trở lại Java.
Bạn vẫn cần phải tạo mã keo để chuyển đổi đối tượng JavaScript của bạn thành đối tượng JSON. Để có cách tiếp cận nhanh chóng, bạn chỉ có thể có giao diện tạo JSONObject ở phía Java bằng cách sử dụng một chuỗi JSON được truyền từ JavaScript. Lớp JSONObject
trong Java có một hàm tạo chấp nhận một chuỗi chứa dữ liệu JSON. Vì vậy, bạn có thể chuyển kết quả đã được xâu chuỗi trực tiếp trở lại Java và tạo đối tượng theo cách đó. Ví dụ:
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");
Sau đó, ở phía bên JavaScript, trong xử lý mà có một blob của chưa phân tích JSON trong biến jsonData:
Android.passObject("pageItems", jsonData);
Bây giờ, JSInterface bạn ở phía bên Java sẽ có một JSONObject chứa các mục mà bạn có thể truy cập bằng cách sử dụng các getters do JSONObject cung cấp. Các đối tượng được tạo qua cuộc gọi Javascript sẽ nằm trong bản đồ mObjectsFromJS
. Tất nhiên bạn sẽ muốn thêm các phương thức trợ giúp bổ sung vào lớp JSInterface để cho phép quản lý các đối tượng tốt hơn.
Tôi chưa biên soạn hoặc thử nghiệm bất kỳ phương pháp nào trong số này, vì vậy bạn có thể phải chỉnh sửa chúng một chút để hoạt động tốt. Nhưng hy vọng điều này mang lại cho bạn ý tưởng. Tuy nhiên, nếu các đối tượng có giao diện và các mục dữ liệu nhất quán thì sẽ dễ dàng hơn khi tạo một hàm keo JavaScript đơn giản liên kết các thuộc tính đối tượng JavaScript với các trường đối tượng Java sử dụng các phương thức setter.
XIN LƯU Ý Điều này mang lại khả năng mã từ xa để kích hoạt mã gốc trên thiết bị của bạn. Nếu bạn không có toàn quyền kiểm soát các trang/tập lệnh được tải vào WebView
, bạn phải đảm bảo rằng hành vi được hiển thị bởi obj
không cho phép bất kỳ lần khai thác nào.
Kiểm tra câu trả lời trong chủ đề tương tự http://stackoverflow.com/questions/2250917/passing-a-javascript-object-using-addjavascriptinterface-on-android/32698399#32698399 –