2012-12-25 29 views
32

Tôi có chế độ xem web với giao diện javascript được thêm vào hoạt động hoàn hảo trên hầu hết các thiết bị, ngoại trừ những thiết bị chạy Android 4.2.1.Android 4.2.1, giao diện WebView và javascript ngắt

Tôi đã gỡ bỏ hầu hết các mã, và ở lại với một mã rất cơ bản:

this.webView.getSettings().setJavaScriptEnabled(true); 
this.webView.setWebChromeClient(new WebChromeClient()); 
this.webView.addJavascriptInterface(new Object() { 
    public void handshake() { 
     Log.d("JS", "handshake no params"); 
    } 

    public void handshake(String json) { 
     Log.d("JS", "handshake with params: " + json); 
    } 
}, "Android"); 

Ở phía bên javascript thứ mã thử nghiệm trông như thế này:

Android.handshake(); 

Nhưng tôi có được điều này trong logcat:

E/Web Console: Uncaught TypeError: Object [object Object] has no method 'handshake'

Một lần nữa, chính xác điều này cũng hoạt động tốt trên các thiết bị đang sử dụng e os android cũ hơn (< 4.2.1) mà tôi đã thử nghiệm (phiên bản tối thiểu là 2.3.3). Điều lạ lùng là nếu tôi bắt đầu một dự án hoàn toàn mới, không có gì ngoài một Hoạt động đơn lẻ chỉ có WebView, với cùng mã, mọi thứ hoạt động tốt ngay cả đối với 4.2.1, nhưng khi nó là một phần của thực tế của tôi dự án, mọi thứ phá vỡ. Không có gì tôi đang làm với chế độ xem web không được bao gồm trong đoạn mã này mà tôi đã cung cấp.

Điều kỳ lạ nhất đối với tôi là javascript tìm thấy đối tượng Android nhưng nó không có phương thức được yêu cầu (bắt tay), làm cách nào có thể?

Bất kỳ trợ giúp nào sẽ được đánh giá rất cao vì điều này đã khiến tôi phát điên trong 2 tuần qua (đó là lỗi tôi luôn quay lại, sau đó bỏ cuộc, v.v.). Cảm ơn.

Trả lời

95

Từ 4.2 tài liệu Android:

Chú ý: Nếu bạn đã thiết targetSdkVersion của bạn đến 17 hoặc cao hơn, bạn phải thêm chú thích @JavascriptInterface bất kỳ phương pháp mà bạn muốn mã trang web của bạn (phương pháp có sẵn những phải cũng được công khai). Nếu bạn không cung cấp chú thích thì phương thức sẽ không thể truy cập được bởi trang web của bạn khi chạy trên Android 4.2 trở lên.

+0

Ngoài ra, bạn phải đặt minSdkVersion> = 17, là 4,2, Jelly bean MR1. Trừ khi, nó sẽ làm chính xác những gì @ Nitzan-Tomer mô tả. Lý do của hành vi này là do các sự cố bảo mật của Android. –

4

Bạn phải chú thích các phương thức (@JavascriptInterface) trong lớp Java mà bạn muốn cung cấp cho JavaScript.

public class JavaScriptInterface { 
Context context; 


JavaScriptInterface(Context c) { 
    context = c; 
} 

@JavascriptInterface 
public void edit(String postid) { 
    Log.d("myApp", "EDIT!"); 
    //do stuff 
} } 

Làm việc cho tôi. Hãy thử điều này.

+0

Bạn nên đưa ra '@JavascriptInterface' đầu tiên vì nó ném một lỗi trong Android Studio là nó không thể áp dụng cho hàm tạo. –

+0

Cảm ơn bạn @AlexanderBolinsky – Raghu

Các vấn đề liên quan