web-dev-qa-db-ja.com

Android WebViewは混合コンテンツをロードしていません

WebViewでアプリを作成しようとしていますが、ウェブサイトはhttpsを使用していますが、コンテンツ(例:mp3ファイル)はhttpを使用しているため、Android = Lollipopは「混合コンテンツ」であるためロードできません。onReceivedSslErrorhandler.proceed();を使用しようとしましたが、何もロードされません。修正する方法はありますか?ロードされたすべてのウェブサイトにhttpを使用させるだけで、エラーは表示されませんか?

28
taeuk

Pie(API 29)以降、アプリのすべての非HTTPSトラフィックはデフォルトで無効になっています

APIレベル26以上をターゲットにしている場合、最初にマニフェストファイルで有効にする必要があります。追加

Android:usesCleartextTraffic="true"

<application> 鬼ごっこ。


Lollipop(API 21)以降、WebViewはデフォルトですべての混合コンテンツをブロックします

この動作を変更するには、APIレベル21以上をターゲットにしている場合、次を使用します:

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

このモードでは、WebViewは混合コンテンツに関して最新のWebブラウザのアプローチとの互換性を保とうとします。一部の安全でないコンテンツは、安全なOriginによってロードされることが許可され、他のタイプのコンテンツはブロックされます。許可またはブロックされるコンテンツのタイプは、リリースごとに変更される場合があり、明示的に定義されていません。

実際には、これにより画像、ビデオ、音楽などの読み込みが可能になります-悪意のある第三者によって改ざん/交換された場合、重大なセキュリティ脅威になる可能性が低いすべてのコンテンツ。


または、(強く推奨)を使用します:

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

このモードでは、WebViewは、Originが安全でない場合でも、他のOriginからコンテンツをロードすることを許可します。これはWebViewの最も安全性の低い動作モードであり、可能であればアプリはこのモードを設定しないでください。

37
user11153

最小APIが21未満で、setMixedContentModeを直接呼び出すことができない場合、リフレクションを使用できます。

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

Androidパイ)で、混合コンテンツモードの設定に加えて、AndroidManifestAndroid:usesCleartextTraffic属性も設定する必要があります。

AndroidManifest.xmlで:

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

そして、ウェブビューを設定するとき、次のことを行います。

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

aPI> = 21で条件付きでロードするには、リフレクションを使用する必要はありません

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

最近、CrosswalkからネイティブWebViewを使用するように移行しました。

この問題で数時間戦わなければなりませんでした。修正は、設定を設定する前にclearCache()を実行することでした。

webView.clearCache(false);  // <-- DO THIS FIRST
webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);
1
Luffy