Android 8: открытый HTTP-трафик не разрешен
у меня были отчеты от пользователей с https://over.wiki/android/" class="blnk">Android 8, что мое приложение (которое использует фоновый канал) не показывает контент. После расследования я обнаружил следующее исключение, происходящее на Android 8:
08-29 12:03:11.246 11285-11285/ E/: [12:03:11.245, main]: Exception: IOException java.io.IOException: Cleartext HTTP traffic to * not permitted
at com.android.okhttp.HttpHandler$CleartextURLFilter.checkURLPermitted(HttpHandler.java:115)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:458)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:127)
at com.deiw.android.generic.tasks.AbstractHttpAsyncTask.doConnection(AbstractHttpAsyncTask.java:207)
at com.deiw.android.generic.tasks.AbstractHttpAsyncTask.extendedDoInBackground(AbstractHttpAsyncTask.java:102)
at com.deiw.android.generic.tasks.AbstractAsyncTask.doInBackground(AbstractAsyncTask.java:88)
at android.os.AsyncTask.call(AsyncTask.java:333)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)
(Я удалил имя пакета, URL и другие возможные идентификаторы)
на Android 7 и ниже все работает, я не устанавливаю android:usesCleartextTraffic
в манифесте (и установка true
не помогает, это значение по умолчанию в любом случае), и я не использую информацию о безопасности сети. если я звоните NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted()
возвращает false
для Android 8, true
для более старой версии, используя тот же файл apk.
Я попытался найти упоминание об этом в Google info об Android O, но безуспешно.
7 ответов
по данным конфигурация сетевой безопасности -
начиная с Android 9.0 (уровень API 28), поддержка открытого текста по умолчанию отключено.
также взгляните на - https://koz.io/android-m-and-the-war-on-cleartext-traffic/
Вариант 1 -
создать файл res / xml / network_security_config.в XML -
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">Your URL(ex: 127.0.0.1)</domain>
</domain-config>
</network-security-config>
AndroidManifest.XML -
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<application
...
android:networkSecurityConfig="@xml/network_security_config"
...>
...
</application>
</manifest>
Вариант 2:
AndroidManifest.в XML -
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<application
...
android:usesCleartextTraffic="true"
...>
...
</application>
</manifest>
и как @david.s ' ответ указал android:targetSandboxVersion
может быть проблемой тоже -
по данным Манифест Документы -
android:targetSandboxVersion
целевая песочница для этого приложения для использования. Чем выше версия песочницы число, тем выше уровень безопасности. Его значение по умолчанию-1; you также можно установить значение 2. Установка этого атрибута на 2 переключает приложение на другая песочница SELinux. Следующие ограничения применяются к Уровень 2 песочницы:
- значение по умолчанию
usesCleartextTraffic
в конфигурации сетевой безопасности false.- обмен Uid не разрешен.
Так Вариант 3 -
если у вас android:targetSandboxVersion
на <manifest>
затем уменьшить его до 1
AndroidManifest.в XML -
<?xml version="1.0" encoding="utf-8"?>
<manifest android:targetSandboxVersion="1">
<uses-permission android:name="android.permission.INTERNET" />
...
</manifest>
в AndroidManifest я нашел этот параметр:
android:networkSecurityConfig="@xml/network_security_config"
и @xml / network_security_config определяется в network_security_config.xml как:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<!--Set application-wide security config using base-config tag.-->
<base-config cleartextTrafficPermitted="false"/>
</network-security-config>
просто я изменил cleartextTrafficPermitted на true
это может быть полезно для кого-то.
недавно у нас была такая же проблема для Android 9, но нам нужно было только отобразить некоторые URL-адреса в WebView, ничего особенного. Итак, добавление android:usesCleartextTraffic="true"
Манифест работал, но мы не хотели ставить под угрозу безопасность всего приложения для этого.
Таким образом, исправление состояло в изменении ссылок с http
to https
хорошо,я понял это. Это связано с параметром Manifest android:targetSandboxVersion="2"
, что я добавил, Потому что у нас также есть мгновенная версия приложения - он должен убедиться, что, как только пользователь обновляет из мгновенного приложения в обычное приложение, он не потеряет свои данные с передачей. Однако, как подсказывает расплывчатое описание:
указывает целевую песочницу, которую хочет использовать это приложение. Более высокие версии sanbox будут иметь повышенный уровень безопасности.
значение по умолчанию этот атрибут 1.
Это, очевидно, также добавляет новый уровень политики безопасности, по крайней мере на Android 8.
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">***Your URL(ex: 127.0.0.1)***</domain>
</domain-config>
</network-security-config>
в предложении, приведенном выше, я предоставлял свой URL как http://xyz.abc.com/mno/
Я изменил это на xyz.abc.com затем он начал работать.
У меня такая же проблема, и я попробовал все вышеперечисленные решения, но ничего из этого не получится.
для меня я решил это, изменив свой url-адрес с HTTP к HTTPS;
Это работает!!!
только menifest добавить это свойство
<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<application
...
android:usesCleartextTraffic="true"
...>
...
</application>
</manifest>