Android 8: открытый HTTP-трафик не разрешен


у меня были отчеты от пользователей с 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 51

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 может быть проблема тоже -

по данным Manifest Docs -

android:targetSandboxVersion

целевая песочница для этого приложения, чтобы использовать. Чем выше версия песочницы число, тем выше уровень безопасности. Его значение по умолчанию-1; Вы также можете установить его на 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

хорошо,я понял это. Это связано с параметром Манифеста 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 to HTTPS;

Это работает!!!

только menifest добавить это свойство

  <manifest ...>
  <uses-permission android:name="android.permission.INTERNET" />
  <application
    ...
    android:usesCleartextTraffic="true"
    ...>
    ...
  </application>
  </manifest>