Android WebView не загружает смешанный контент

Я пытаюсь создать приложение с WebView, но на веб-сайте используется https, но контент (например, mp3 файл) использует http, поэтому Android Lollipop не загрузит его, потому что это "Смешанный контент". Я попытался использовать onReceivedSslError handler.proceed(); , но он ничего не загружает. Есть ли способ исправить это? или я могу просто заставить все загруженные сайты использовать http, поэтому он не показывает никаких ошибок?

Ответы

Ответ 1

Начиная с 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 будет пытаться быть совместимым с подходом современного веб-браузера в отношении смешанного контента. Некоторый незащищенный контент может быть разрешен для загрузки безопасным источником, а другие типы контента будут заблокированы. Типы контента, которые разрешены или заблокированы, могут изменить выпуск на выпуск и не определены явно.

На практике это должно позволять загружать изображения, видео, музыку и т.д. - весь контент, который с низкой вероятностью представляет собой серьезную угрозу безопасности, подделан/заменен злонамеренным сторонним лицом.


В качестве альтернативы используйте (настоятельно не рекомендуется):

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

В этом режиме WebView позволит защищенному источнику загружать контент из любого другого источника, даже если этот источник небезопасен. Это наименее безопасный режим работы для WebView, и, где это возможно, приложения не должны устанавливать этот режим.

Ответ 2

Если ваш минимальный 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);
}

Ответ 3

В android pie в дополнение к настройке режима смешанного контента, вам также необходимо установить атрибут android:usesCleartextTraffic в AndroidManifest.

В вашем AndroidManifest.xml сделайте:

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

и при настройке веб-просмотра выполните:

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

Ответ 4

чтобы загрузить его условно на API> = 21, вам не нужно использовать отражение.

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

Ответ 5

Я недавно мигрировал из Crosswalk, чтобы использовать нативный WebView.

Пришлось бороться с этим вопросом несколько часов. Исправление состояло в том, чтобы запустить clearCache() до установки параметров.

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