web-dev-qa-db-fra.com

Android WebView ne charge pas le contenu mixte

J'essaie de créer une application avec WebView, mais le site Web utilise https, mais le contenu (fichier mp3, par exemple) utilise http. Android Lollipop ne la chargera donc pas car il s'agit de "contenu mixte". J'ai essayé d'utiliser onReceivedSslErrorhandler.proceed();, mais il ne charge rien. Y a-t-il un moyen de le réparer? ou pourrais-je simplement faire en sorte que tous les sites Web chargés utilisent http, afin de ne pas afficher d'erreur?

26
taeuk

Depuis Lollipop (API 21), WebView bloque tous les contenus mélangés par défaut .

Pour modifier ce comportement, lorsque vous ciblez une API de niveau 21 ou supérieur, utilisez:

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

Dans ce mode, WebView tentera d’être compatible avec le approche d'un navigateur Web moderne en ce qui concerne le contenu mixte. Certains le contenu non sécurisé peut être autorisé à être chargé par une origine sécurisée et les autres types de contenu seront bloqués. Les types de contenu sont autorisé ou bloqué peut changer de version en version et ne sont pas explicitement défini.

En pratique, cela devrait permettre le chargement d'images, de vidéos, de musique, etc.


Vous pouvez également utiliser (fortement déconseillé):

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

Dans ce mode, WebView permettra à une origine sécurisée de charger du contenu de toute autre origine, même si cette origine n'est pas sécurisée. C'est le mode de fonctionnement le moins sécurisé pour WebView, et si possible les applications ne doivent pas définir ce mode.

35
user11153

Si votre API min est inférieure à 21 et ne peut pas appeler directement setMixedContentMode, vous pouvez utiliser la réflexion:

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);
}
7
Andrew Lim

pour le charger conditionnellement sur API> = 21, vous ne devez pas utiliser de réflexion .

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {   
          webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);
}
2
xtools

J'ai récemment migré de Crosswalk pour utiliser WebView natif. 

A dû se battre avec ce problème pendant quelques heures. Le correctif consistait à exécuter clearCache () avant de définir les paramètres.


Avant

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

Vider le cache

webView.clearCache(false);
0
Luffy