2015-08-22 24 views
19

Tôi đang cố gắng tạo ứng dụng bằng WebView nhưng trang web đang sử dụng https nhưng nội dung (ví dụ: tệp mp3) sử dụng http, vì vậy Android Lollipop sẽ không tải ứng dụng đó vì nó "Nội dung hỗn hợp". Tôi đã cố gắng sử dụng onReceivedSslErrorhandler.proceed(); nhưng không tải bất kỳ thứ gì. Có cách nào để khắc phục nó? hoặc tôi có thể chỉ làm cho tất cả các trang web được tải sử dụng http, vì vậy nó không hiển thị bất kỳ lỗi nào?Android WebView không tải Nội dung hỗn hợp

Trả lời

26

Since Lollipop (API 21), WebView blocks all mixed content by default.

Để thay đổi hành vi này, khi bạn đang nhắm mục tiêu cấp độ API 21 trở lên, sử dụng:

webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE); 

Trong chế độ này, WebView sẽ cố gắng để phù hợp với cách tiếp cận của một hiện đại trình duyệt web liên quan đến nội dung hỗn hợp. Một số nội dung không an toàn có thể được phép tải bằng nguồn gốc an toàn và các loại nội dung khác sẽ bị chặn. Các loại nội dung là được cho phép hoặc bị chặn có thể thay đổi bản phát hành để phát hành và không phải là được xác định rõ ràng.

Thực tế điều này sẽ cho phép tải hình ảnh, video, nhạc, v.v. - tất cả nội dung có xác suất thấp là mối đe dọa bảo mật lớn, khi bị thay thế bởi bên thứ ba độc hại.


Hoặc sử dụng (khuyến khích mạnh mẽ):

webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); 

Trong chế độ này, WebView sẽ cho phép một nguồn gốc an toàn để tải nội dung từ bất kỳ nguồn gốc khác, ngay cả khi nguồn gốc đó là không an toàn. Đây là chế độ hoạt động an toàn ít nhất cho WebView và nếu có thể, ứng dụng sẽ không đặt chế độ này.

+4

này không hoạt động – superUser

+3

Tôi đang chạy vào cùng một vấn đề. Tôi đang nhắm mục tiêu một thiết bị đó là api19 và mã trên chỉ hoạt động trên api 21, Seem được ở nơi ngọt ngào, nơi nó chỉ không làm việc một trong hai cách. Bất kỳ ý tưởng? – Danimal

+2

Điều này không hoạt động –

4

Nếu API phút của bạn là ít hơn 21 và không thể gọi setMixedContentMode trực tiếp, bạn có thể sử dụng phản ánh:

try { 
    Method m = WebSettings.class.getMethod("setMixedContentMode", int.class); 
    if (m == null) { 
     Log.e("WebSettings", "Error getting setMixedContentMode method"); 
    } 
    else { 
     m.invoke(webView.getSettings(), 2); // 2 = MIXED_CONTENT_COMPATIBILITY_MODE 
     Log.i("WebSettings", "Successfully set MIXED_CONTENT_COMPATIBILITY_MODE"); 
    } 
} 
catch (Exception ex) { 
    Log.e("WebSettings", "Error calling setMixedContentMode: " + ex.getMessage(), ex); 
} 
+0

Điều này rất hữu ích. Cảm ơn... – Abhineet

0

để tải nó có điều kiện về API> = 21, bạn không cần phải sử dụng phản ánh.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE); 
} 
Các vấn đề liên quan