WebViewでアプリを作成しようとしていますが、ウェブサイトはhttps
を使用していますが、コンテンツ(例:mp3ファイル)はhttp
を使用しているため、Android = Lollipopは「混合コンテンツ」であるためロードできません。onReceivedSslError
handler.proceed();
を使用しようとしましたが、何もロードされません。修正する方法はありますか?ロードされたすべてのウェブサイトにhttp
を使用させるだけで、エラーは表示されませんか?
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の最も安全性の低い動作モードであり、可能であればアプリはこのモードを設定しないでください。
最小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);
}
Androidパイ)で、混合コンテンツモードの設定に加えて、AndroidManifest
のAndroid:usesCleartextTraffic
属性も設定する必要があります。
AndroidManifest.xml
で:
<application
....
Android:usesCleartextTraffic="true"
...>
そして、ウェブビューを設定するとき、次のことを行います。
webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);
aPI> = 21で条件付きでロードするには、リフレクションを使用する必要はありません。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);
}
最近、CrosswalkからネイティブWebViewを使用するように移行しました。
この問題で数時間戦わなければなりませんでした。修正は、設定を設定する前にclearCache()を実行することでした。
webView.clearCache(false); // <-- DO THIS FIRST
webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);