it-swarm.com.de

Android WebView lädt gemischten Inhalt nicht

Ich versuche, eine App mit WebView zu erstellen, aber die Website verwendet https, aber der Inhalt (z. B. die MP3-Datei) verwendet http, sodass Android Lollipop sie nicht lädt, weil es "gemischter Inhalt" ist. Ich habe versucht, onReceivedSslErrorhandler.proceed(); zu verwenden, aber es wird nichts geladen. Gibt es eine Möglichkeit, das Problem zu beheben? oder könnte ich einfach alle geladenen Websites mit http versehen lassen, damit keine Fehler angezeigt werden?

26
taeuk

Seit Lollipop (API 21) blockiert WebView standardmäßig alle gemischten Inhalte .

Um dieses Verhalten zu ändern, verwenden Sie , wenn Sie auf API-Ebene 21 oder höher abzielen:

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

In diesem Modus versucht das WebView, mit dem .__ kompatibel zu sein. Ansatz eines modernen Webbrowsers in Bezug auf gemischte Inhalte. Etwas Unsichere Inhalte können von einem sicheren Origin und .__ geladen werden. Andere Arten von Inhalten werden blockiert. Die Inhaltstypen sind erlaubt oder gesperrt kann von Release zu Release wechseln und ist nicht explizit definiert.

In der Praxis sollte dies das Laden von Bildern, Videos, Musik usw. ermöglichen - alle Inhalte, die eine geringe Sicherheitsgefahr darstellen, wenn sie von böswilligen Drittanbietern manipuliert oder ersetzt werden.


Verwenden Sie alternativ (stark entmutigt):

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

In diesem Modus ermöglicht das WebView einem sicheren Laden von Inhalten von einem anderen Ursprung, auch wenn dieser Ursprung unsicher ist. Dies ist das am wenigsten sicheren Betriebsmodus für das WebView und soweit möglich Apps sollten diesen Modus nicht einstellen.

35
user11153

Wenn Ihre Mindest-API kleiner als 21 ist und setMixedContentMode nicht direkt aufgerufen werden kann, können Sie Reflection verwenden:

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

In Android pie müssen Sie neben dem Modus für gemischte Inhalte auch den Android:usesCleartextTraffic Attribut in der AndroidManifest.

In deinem AndroidManifest.xml machen:

<application
    ....
    Android:usesCleartextTraffic="true"
    ...>

und wenn Sie die Webansicht einrichten, gehen Sie wie folgt vor:

webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);
6
Navin Peiris

um es bedingt über API> = 21 zu laden, müssen Sie nicht mit Reflektion verwenden.

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

Ich habe vor kurzem von Crosswalk migriert, um das native WebView zu verwenden. 

Musste einige Stunden mit diesem Thema kämpfen. Das Update bestand darin, clearCache () auszuführen, bevor die Einstellungen festgelegt wurden.


Vor

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

Cache leeren

webView.clearCache(false);
0
Luffy