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$2.call(AsyncTask.java:333)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.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 об Android O, но безуспешно.


person david.s    schedule 29.08.2017    source источник
comment
Проверьте эту CodeLab, но используйте cleartextTrafficPermitted="true"   -  person ArtiomLK    schedule 06.03.2018
comment
Это происходит в приложении, которое я поддерживаю, потому что сервер в некоторых случаях перенаправляет с HTTPS на HTTP.   -  person Big McLargeHuge    schedule 03.05.2019
comment
проверьте здесь https://codechacha.com/en/android-cleartext-http-traffic-issue/   -  person Mikaware    schedule 25.04.2021


Ответы (33)


Согласно конфигурации сетевой безопасности -

Начиная с Android 9 (уровень API 28), поддержка открытого текста по умолчанию отключена.

Также ознакомьтесь с Android M и войной с открытым текстовым трафиком < / а>

Объяснение Codelabs от Google

Вариант 1 -

Сначала попробуйте ввести URL-адрес с https: // вместо http: //

Вариант 2 -

Создайте файл res / xml / network_security_config.xml -

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">api.example.com(to be adjusted)</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>

Вариант 3 -

android: usesCleartextTraffic Doc

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 запрещено.

Итак, вариант 4 -

Если у вас 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>
person Hrishikesh Kadam    schedule 13.06.2018
comment
Как ни странно, эта проблема все еще появляется, и ваше решение все еще исправляет ее. Но ссылка Google, которую вы предоставили, больше не упоминает об этом - person avalancha; 07.08.2018
comment
@avalancha Ссылка на документ и цитата обновлены. Спасибо за сообщение. - person Hrishikesh Kadam; 07.08.2018
comment
Правильно, они вытащили это в документации по сетевой безопасности, хорошо, спасибо - person avalancha; 07.08.2018
comment
@HrishikeshKadam, ваш ответ очень ценен, но кажется, что в самой последней версии P? См. Мой вопрос stackoverflow.com/questions/51770323/ - person spartygw; 09.08.2018
comment
Может ли кто-нибудь сказать мне, как применить версии, указанные в этом ответе, только для отладки типа сборки? - person vkelman; 08.10.2018
comment
Но что, если это произойдет? Я не могу установить minSdkversion на 23 .. - person Jonas Borggren; 15.10.2018
comment
Означает ли ClearText HTTP, что они просто использовали http-сайт вместо https? - person Tom Hammond; 31.10.2018
comment
@vkelman вам не нужно устанавливать минимум 23, чтобы использовать атрибуты в манифесте, которые будут представлены позже. Более ранние версии игнорируют их. И вы можете подавить предупреждение с помощью tools:ignore="UnusedAttribute"> - person Brendon Whateley; 08.11.2018
comment
запись этой строки ‹base-config cleartextTrafficPermitted = true /› в конфигурации сетевой безопасности решила мою проблему ... Я попытался написать это в манифесте, но не работал .. спасибо :) - person Atif AbbAsi; 17.12.2018
comment
Почему у op проблема с открытым текстом, если он на Android 8? По умолчанию он отключен только в android 9. - person mco; 04.01.2019
comment
Изменение варианта 1 с domain-config на base-config исправило это для меня - person GregM; 05.01.2019
comment
В чем смысл этой функции безопасности Android, если каждый разработчик собирается добавить android:usesCleartextTraffic="true"? - person Fruit; 24.01.2019
comment
Здесь даже не упоминается лучшее решение этой проблемы: использовать HTTPS. Варианты, упомянутые в этом ответе, должны использоваться только в крайнем случае. - person Christian Brüggemann; 29.01.2019
comment
Первый вариант был единственным, который действительно сработал для нас. Вариант 2 работал с перерывами, но не был последовательным. Нам это нужно для среды разработки, но для производства нам нужен ssl. - person kingargyle; 05.02.2019
comment
@ 林果 皞 в конечном итоге для Google Play Store будет легко просто запретить приложения, использующие этот флаг - person kkarakk; 08.02.2019
comment
Если вам это нужно для вашей среды разработки, используйте для него заполнитель манифеста (см .: stackoverflow.com/questions/37470850/). Для вашей производственной среды используйте HTTPS. - person beetstra; 18.02.2019
comment
Ваш ответ был полезен. Вариант 1 был применен к моему Android 9. После этого соединение через HTTP работает отлично. Мое приложение получает данные с собственного HTTP-сервера, который был определен в поле домена, содержащемся в res / XML-файле. Спасибо. - person Orlov Const; 29.05.2019
comment
Может ли кто-нибудь помочь мне обойти проверку https для WebViews, мои WebViews содержат так много URL-адресов перенаправления, и эти URL-адреса неизвестны приложению (не субдомену). Я не хочу обходить эти проверки для всех URL-адресов - person Bytecode; 14.06.2019
comment
Мне также пришлось добавить 10.0.2.2 в качестве прокси в эмуляторе (Google), чтобы это (вариант 1) работало. - person Reezy; 12.07.2019
comment
У всего есть другие решения, так почему его добавили в 28? @HrishikeshKadam - person Topsy; 13.07.2019
comment
@ 林果 皞 Это только помогло мне обнаружить уязвимость, которая в противном случае попала бы в Play Store. Всегда лучше отказаться от функций безопасности, чем подключиться, потому что все делают ошибки. Вот почему мы должны это сделать - и для нас, и для наших пользователей. - person tillsanders; 26.07.2019
comment
Пытаюсь запустить учебное приложение Sunshine на Udacity. Вариант 2 дает мне: AAPT: error: attribute android: usesCleartextTraffic не найден. - person Androidcoder; 07.08.2019
comment
@ 林果 皞 Какая альтернатива этому, если безопасность тоже работает? - person suv; 22.08.2019
comment
Это сработало для меня, но с ним мне также пришлось обновить версию OkHttp до последней (4.1.1) ..... - person Ashiq; 06.09.2019
comment
Безопасен ли вариант 2? - person Sachin Tanpure; 06.09.2019
comment
Как говорит @ ChristianBrüggemann, используйте HTTPS. Вероятно, вы можете сделать это, просто изменив свой URL-адрес с http: // ... на https: // ... - person niico; 17.10.2019
comment
Вариант 1 решил мою проблему, это было связано только с субдоменами, возвращаясь с вкладки субдомена на вкладку основного сайта, я получал эту ошибку net :: ERR_CLEARTEXT_NOT_PERMITTED, которая теперь решена. Спасибо - person Ataul Haque; 30.11.2019
comment
@ZeeshanAyaz, что мне нужно здесь упомянуть: ‹domain includeSubdomains = true› api.example.com (подлежит корректировке) ‹/domain› - person k_kumar; 03.02.2020
comment
@kingargyle Вы упомянули, что вариант 2 периодически работал на вас. Может быть, вы использовали более раннюю версию API, чем API 23? Поскольку android: usesCleartextTraffic поддерживается API 23 - person Reed; 17.02.2020
comment
Ни один из этих вариантов мне не подходит. ‹Использует-разрешение android: name = android.permission.INTERNET /› ‹application android: networkSecurityConfig = @ xml / network_security_config /› ‹/manifest› И ‹? Xml version = 1.0 encoding = utf-8?› ‹Network-security- config ›‹ domain-config cleartextTrafficPermitted = true ›‹ domain includeSubdomains = true ›MYapi.azurewebsites.net ‹/domain› ‹/domain-config› ‹/network-security-config› - person Rob L; 07.03.2020
comment
@HrishikeshKadam Я работаю в аосп. Где именно поддержка открытого текста отключена по умолчанию? Потому что, если я перейду на вершину класса aosp, я смогу заставить работать все остальные приложения. Потому что я не могу изменить все тысячи приложений, разработанных в 6, чтобы разрешить это. Так где именно или в каком классе в aosp я могу это изменить? - person Shadow; 11.03.2020
comment
Он также работает с nativescript, используя решение № 2, установленное на 10.0.2.2 (хост-компьютер эмулятора), позволяющее использовать http только в режиме разработки. - person funder7; 13.03.2020
comment
У меня есть вопрос, как добавить URL-адрес, который не начинается с https; //, например, Whatsapp и телеграмма, которые начинаются с Whatsapp: // send. - person Ifwat Ibrahim; 02.05.2020
comment
Также вам нужно установить действие сборки network_security_config.xml на AndroidResource. В противном случае вы получите ошибку компиляции: ресурс xml / network_security_config (он же com.companyname.sample: xml / network_security_config) не найден. - person Максим Кошевой; 23.05.2020
comment
Вы можете настроить его так, чтобы в отладочных сборках использовался только открытый текстовый трафик. См. Здесь: stackoverflow.com/a/53732801/716237 - person Tyler; 03.11.2020
comment
Мне действительно нужно было подключить интеграционные тесты к моему локальному http-серверу, работающему в другой службе, конечно, вы не должны использовать это в производственном коде или коде приложения. - person Luiz Felipe; 20.11.2020
comment
@ ChristianBrüggemann Вы абсолютно правы в принципе, но тогда почему последние версии Ionic / Angular включают http? Вот только пример, который я нашел по умолчанию в различных файлах schemas.android.com/apk/res / android, schemas.android.com/aapt, xmlns: android = schemas.android.com/apk/res/android xmlns: app = schemas.android.com/apk/res-auto xmlns: tools = schemas.android.com/tools, gradle.org/docs/current/userguide/multi_project_builds.html и так далее и тому подобное. Похоже, нам нужно одно из промежуточных решений в этом ответе. - person Chiwda; 20.11.2020
comment
Вариант 2 был бы идеальным, но я должен поддерживать API 19, который его не поддерживает. Даже вариант 3 требует как минимум API 23. так что нам делать? - person Houman; 22.12.2020
comment
Вариант 1 сработал для меня .. на самом деле он все еще отлично работает со ссылками, имеющими http: //, но не выше Android 8 (API 27), поэтому изменение URL-адреса с http: // на https: // работает на Android 11 API 30 и ниже все! - person Moeed Ahmed; 21.04.2021
comment
@HrishikeshKadam: сэр, я попробовал второй вариант, но после сборки Android все мои изменения были заменены, вы можете сказать мне, почему? - person Kapil soni; 01.05.2021
comment
В моем случае пробная версия API, которую я пробовал, позволяла выполнять только запросы по HTTP. Мне пришлось заплатить за использование HTTPS, чтобы android:usesCleartextTraffic="true" решить мою проблему. - person Jcorretjer; 05.07.2021

Моя проблема в Android 9 заключалась в навигации в веб-просмотре по доменам с http. Решение от этот ответ

<application 
    android:networkSecurityConfig="@xml/network_security_config"
    ...>

а также:

res / xml / network_security_config.xml

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>
person Pablo Cegarra    schedule 19.01.2019
comment
Можно как-нибудь переписать это в gradle? - person Morozov; 06.11.2019
comment
У меня не работает. Я не могу заставить свой эмулятор подключиться к 10.0.2.2 - person Gilboot; 02.05.2020
comment
Это не самое безопасное решение для релизных сборок. - person Murciegalo84; 09.06.2020
comment
Что, если я хочу соединить номер порта вместе? - person Panadol Chong; 25.01.2021

В 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

person byOnti    schedule 21.03.2018
comment
Perfetct. Дополнительная информация здесь: codelabs.developers.google. ru / codelabs / - person 1x2x3x4x; 06.04.2020
comment
Переустановите приложение после изменений - person Gilboot; 02.05.2020

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

В build.gradle:

// Put this in your buildtypes debug section:
manifestPlaceholders = [usesCleartextTraffic:"true"]

// Put this in your buildtypes release section
manifestPlaceholders = [usesCleartextTraffic:"false"]

В теге приложения в AndroidManifest.xml

android:usesCleartextTraffic="${usesCleartextTraffic}"
person Tyler    schedule 11.12.2018
comment
он используется только на api 23+. Если вам нужно решение, независимое от API, одобренное по адресу: stackoverflow.com/questions/46302058/ - хороший вариант ... - person Rik van Velzen; 01.03.2019
comment
Вопрос: когда приложение использует веб-серверы, которые могут быть http или https по дизайну, будет ли usingCleartextTraffic: false даже иметь значение, если URL-адреса http должны иметь возможность использовать веб-службы? Значит, установка значения true означает, что службы https по умолчанию все равно не отправляют открытый текст? - person whyoz; 01.06.2019

Если возможно, измените свой URL с HTTP на HTTPS;

Получается !!!

person eli    schedule 04.10.2018
comment
как за это проголосовали? вы получите исключение рукопожатия, если URL-адрес вашего сервера не https - person kkarakk; 08.02.2019
comment
проголосовали за, потому что это правильно (в производственной среде). По умолчанию должен быть HTTPS, а не HTTP. - person beetstra; 18.02.2019
comment
@beetsta Вы предполагаете, что полностью контролируете то, что обслуживает контент. Поэтому этот ответ наивен или легкомыслен по своей природе. - person Martin Price; 22.02.2019
comment
@beetstra Почему во время отладки на ЛОКАЛЬНОЙ машине должен быть установлен HTTPS по умолчанию? Это так глупо, просто еще один пример патернализма Google. К счастью, это можно обойти для режима отладки с помощью решения Тайлера. - person Bevor; 23.02.2019
comment
@MartinPrice, я согласен, что ответ слишком короткий и применим не ко всем ситуациям. Однако и большинство других ответов, если предположить, что разрешение HTTP-трафика - правильный путь. Разрешение трафика открытого текста во всех ситуациях для всех хостов полностью игнорирует причины, по которым Google изменил это в первую очередь. Для производственных сред HTTPS - почти всегда правильный путь. Разрешение HTTP в средах отладки, конечно, не проблема, как я уже упоминал в комментарии. - person beetstra; 25.02.2019
comment
Ответ игнорирует вопрос. В отличие от людей в небольших компаниях, иногда у вас нет SSL для каждого промежуточного сервера. Ответ так же плох, как если бы кто-то исправлял грамматику в сообщении Facebook, и это вообще не отвечает на вопрос и не исправляет его. - person Nick Turner; 27.08.2019
comment
Хорошо, если вы подключаетесь только к серверу, который контролируете. Любые внешние веб-сайты, на которых есть ссылки, использующие HTTP, по-прежнему не работают. Правильным общим решением является файл конфигурации сетевой безопасности, как указано в других ответах. Пока мир полностью не перейдет на HTTPS, мерой безопасности Google будет просто PIA, требующая их эффективного отключения. - person cbn; 10.09.2019
comment
Я пробовал все другие решения, но это был правильный ответ. Мне пришлось изменить сертификат домена моего веб-сайта (api) на https. Затем я изменил свой URL-адрес API в приложении, и сейчас все работает как шарм! :) - person setare maghari; 21.09.2019
comment
Этот ответ хорош просто потому, что отладочные сборки можно настраивать по-разному. - person Martin Zeitler; 17.11.2019
comment
Там написано, если возможно. Это правильный ответ. Открытие и использование ваших сервисов через HTTPS решает проблему? да. Есть ли другие варианты? да. Подойдет ли это каждому на каждом этапе? Нет. - person Federico Alvarez; 12.03.2021
comment
@NickTurner, если у вас нет сертификата на вашем сервере, это не имеет никакого отношения к ответу. Ответ был не за нарушение протоколов безопасности, извините, если вы его искали. Спасибо - person eli; 16.03.2021
comment
На самом деле он по-прежнему отлично работает со ссылками, имеющими http: //, но не выше Android 8 (API 27), поэтому изменение URL-адреса с http: // на https: // работает на Android 11 API 30 и ниже! - person Moeed Ahmed; 21.04.2021

<?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, и он начал работать.

person Lorence    schedule 16.09.2018
comment
Домен! = URL. http - это протокол. Протокол никогда не является частью домена. - person The incredible Jan; 22.11.2018
comment
Это правильно, там поддерживается только полное доменное имя, а не IP-адреса (исправлено выше). - person Martin Zeitler; 17.11.2019
comment
Не работает для домена 10.0.2.2. Стоит ли добавить номер порта? - person Gilboot; 02.05.2020
comment
Как, если я использую IP-адрес вместо домена? - person Panadol Chong; 25.01.2021

Хорошо, это ⇒⇒ НЕ ⇐⇐ тысячи повторений добавить его в свой манифест, но подсказка, которая основывается на этом, но дает вам дополнительную выгоду < / strong> (и, возможно, некоторая справочная информация).

В Android есть функция перезаписи src-Directory.

По умолчанию у вас есть

/ app / src / main

Но вы можете добавить дополнительные каталоги, чтобы перезаписать файл AndroidManifest.xml. Вот как это работает:

  • Создайте каталог / app / src / debug
  • Внутри создайте AndroidManifest.xml

Внутри этого файла вам не нужно помещать все правила, а только те, которые вы хотите перезаписать из вашего / app / src / main /AndroidManifest.xml

Вот пример того, как это выглядит для запрошенного разрешения CLEARTEXT:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.yourappname">

    <application
            android:usesCleartextTraffic="true"
            android:name=".MainApplication"
            android:label="@string/app_name"
            android:icon="@mipmap/ic_launcher"
            android:allowBackup="false"
            android:theme="@style/AppTheme">
    </application>

</manifest>

С этими знаниями теперь легко как 1,2,3 перегрузить свои разрешения в зависимости от отладки | главная | выпуск Enviroment.

Большое преимущество в этом ... у вас нет отладочного материала в вашем производственном манифесте, и вы сохраняете прямую и легкую в обслуживании структуру

person suther    schedule 24.01.2019
comment
Это определенно правильное решение. Android не зря добавил эти настройки безопасности, так что они должны стоять. Ваши решения позволяют нам тестировать локальные небезопасные среды, в то время как производственные сборки по-прежнему будут иметь рекомендуемые настройки безопасности. Спасибо! - person Coo; 23.04.2019

Это могло быть кому-то полезно.

Недавно у нас была такая же проблема для Android 9, но нам нужно было только отобразить некоторые URL-адреса в WebView, ничего особенного. Итак, добавление android:usesCleartextTraffic="true" в Manifest сработало, но мы не хотели ставить под угрозу безопасность всего приложения для этого. Итак, исправление заключалось в изменении ссылок с http на https.

person sparkly_frog    schedule 17.09.2018
comment
Если я хочу отображать только некоторые URL-адреса, мне не нужен WebView. Я просто использую TextView. ;) Я полагаю, вы имеете в виду, что показываете какие-то html-страницы. Ваше исправление работает только в том случае, если ваш сервер предлагает SSL. Вы не можете просто изменить ссылки. - person The incredible Jan; 22.11.2018
comment
Это, безусловно, лучший вариант, когда это возможно, но его не всегда можно выбрать - либо по соображениям производительности, либо просто потому, что ресурс может быть недоступен в открытом тексте HTTP. - person Dakatine; 24.01.2019
comment
мы не хотели ставить под угрозу безопасность всего приложения, какие риски безопасности это может вызвать? В моем случае нет одного URL-адреса, поэтому я не могу добавить их в манифест. - person Robert Williams; 06.05.2019
comment
Привет @RobertWilliams, это просто означает, что чистый трафик будет разрешен. Вот сообщение в блоге medium.com /@son.rommer/ - person sparkly_frog; 11.06.2019

Для проектов React Native

Он уже был установлен на RN 0.59. Вы можете найти на обновить diff с 0.58.6 до 0.59 Вы можете применить его, не обновляя версию RN, просто выполните следующие действия:

Создать файлы:

android / app / src / debug /res/xml/react_native_config.xml -

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
  <domain-config cleartextTrafficPermitted="true">
    <domain includeSubdomains="false">localhost</domain>
    <domain includeSubdomains="false">10.0.2.2</domain>
    <domain includeSubdomains="false">10.0.3.2</domain>
  </domain-config>
</network-security-config>

-

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools">

  <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

  <application tools:targetApi="28"
      tools:ignore="GoogleAppIndexingWarning" 
      android:networkSecurityConfig="@xml/react_native_config" />
</manifest>

Проверьте принятый ответ, чтобы узнать основную причину.

person Erick M. Sprengel    schedule 13.03.2019
comment
Я использую response-native 0.59.5, и у меня такая же проблема, мы должны вручную настроить AndroidManifest.xml, как вы предлагаете. - person Cristian Mora; 06.05.2019
comment
Спасибо. Это помогло. Из-за политики Google мне пришлось сделать android: usesCleartextTraffic = false, тогда у меня возникла проблема с запуском response-native из локального в симуляторе. Я применил вышеуказанные шаги, и это сработало для меня. - person Hidayat Arghandabi; 04.05.2021

Я удалил эту строку из файла манифеста Android, который уже существует

 android:networkSecurityConfig="@xml/network_security_config" 

и добавил

android:usesCleartextTraffic="true"

это в тег приложения в манифесте

<application
    android:usesCleartextTraffic="true"
    android:allowBackup="true"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"
    >

то эта ошибка Открытый текст HTTP-трафика на overlay.openstreetmap.nl не разрешена для меня в Android 9 и 10. Я надеюсь, что это сработает и для Android 8, если вам поможет, не забудьте голосование спасибо

person creativecoder    schedule 27.01.2020

Хорошо, я понял это. Это связано с параметром манифеста android:targetSandboxVersion="2", который я добавил, потому что у нас также есть версия мгновенного приложения - он должен быть уверен, что после того, как пользователь обновится с мгновенного приложения до обычного приложения, он не потеряет свои данные при передаче. Однако, как следует из расплывчатого описания:

Задает целевую песочницу, которую хочет использовать это приложение. Более высокие версии sanbox будут иметь повышенный уровень безопасности.

Значение этого атрибута по умолчанию - 1.

Очевидно, это также добавляет новый уровень политики безопасности, по крайней мере, на Android 8.

person david.s    schedule 30.08.2017

Добавление ... android: usesCleartextTraffic = "true" ... в ваш файл манифеста может решить проблему, но это создает угрозу целостности данных.

По соображениям безопасности я использовал заполнители манифеста с android: usesCleartextTraffic внутри файла манифеста (например, в Вариант 3 принятого ответа, т.е. ответ @ Хришикеш Кадам), чтобы разрешить только открытый текст в среде отладки.

Внутри моего файла build.gradle (: app) я добавил заполнитель манифеста следующим образом:

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }

        debug {
            manifestPlaceholders.cleartextTrafficPermitted ="true"
        }
    }

Обратите внимание на название заполнителя cleartextTrafficPermitted в этой строке выше.

            manifestPlaceholders.cleartextTrafficPermitted ="true"

Затем в моем манифесте Android я использовал тот же заполнитель ...

AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        ...
        android:usesCleartextTraffic="${cleartextTrafficPermitted}"
        ...>
        ...
    </application>
</manifest>

При этом трафик в открытом виде разрешен только в среде отладки.

person Sam Shaba    schedule 23.05.2020

Простое и легкое решение [Xamarin Form]

Для Android

  1. Перейти к Android Project, затем нажмите Properties,

введите описание изображения здесь

  1. Open AssemblyInfo.cs and paste this code right there:

    [assembly: Application(UsesCleartextTraffic =true)]

введите описание изображения здесь

Для iOS

Используйте NSAppTransportSecurity:

Введите здесь описание изображения

Вы должны установить для ключа NSAllowsArbitraryLoads значение YES в NSAppTransportSecurity словаре вашего info.plist файла.

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
  <true/>
</dict>

Конфигурация Plist

person Hemant Ramphul    schedule 28.05.2020
comment
это работает как шарм, превосходный @Hemant Ramphul - person Raj K; 26.01.2021

Чтобы применить эти различные ответы к Xamarin.Android, вы можете использовать атрибуты уровня класса и сборки вместо ручного редактирования AndroidManifest.xml

Интернет-разрешение конечно необходимо (да ..):

[assembly: UsesPermission(Android.Manifest.Permission.Internet)]

Примечание. Обычно атрибуты уровня сборки добавляются в ваш AssemblyInfo.cs файл, но любой файл ниже using и выше namespace работает.

Затем в подклассе приложения (при необходимости создайте его) вы можете добавить NetworkSecurityConfig со ссылкой на файл Resources/xml/ZZZZ.xml:

#if DEBUG
[Application(AllowBackup = false, Debuggable = true, NetworkSecurityConfig = "@xml/network_security_config")]
#else
[Application(AllowBackup = true, Debuggable = false, NetworkSecurityConfig = "@xml/network_security_config"))]
#endif
public class App : Application
{
    public App(IntPtr javaReference, Android.Runtime.JniHandleOwnership transfer) : base(javaReference, transfer) { }
    public App() { }

    public override void OnCreate()
    {
        base.OnCreate();
    }
}

Создайте файл в папке Resources/xml (при необходимости создайте папку xml).

Пример файла xml/network_security_config, при необходимости отрегулируйте (см. Другие ответы)

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
          <domain includeSubdomains="true">www.example.com</domain>
          <domain includeSubdomains="true">notsecure.com</domain>
          <domain includeSubdomains="false">xxx.xxx.xxx</domain>
    </domain-config>
</network-security-config>

Вы также можете использовать параметр UsesCleartextTraffic в ApplicationAttribute:

#if DEBUG
[Application(AllowBackup = false, Debuggable = true, UsesCleartextTraffic = true)]
#else
[Application(AllowBackup = true, Debuggable = false, UsesCleartextTraffic = true))]
#endif
person SushiHangover    schedule 06.05.2019
comment
Как это работает, если вы не в домене и на локальном адресе хоста 192.168 приложение будет работать не в Интернете, а в локальной сети - person csharpdudeni77; 13.06.2019
comment
и каков синтаксис ксамрианских форм - person csharpdudeni77; 13.06.2019
comment
@ rogue39nin Используйте последнюю часть моего ответа: UsesCleartextTraffic = true - person SushiHangover; 13.06.2019

Обновление, декабрь 2019, ionic - 4.7.1

<manifest xmlns:tools=“http://schemas.android.com/tools”>

<application android:usesCleartextTraffic=“true” tools:targetApi=“28”>

Добавьте указанное выше содержимое в XML-файл манифеста Android.

Предыдущие версии ionic

  1. Убедитесь, что в вашем config.xml в Ionic Project есть следующее:

    <edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application" xmlns:android="http://schemas.android.com/apk/res/android">
                <application android:networkSecurityConfig="@xml/network_security_config" />
                <application android:usesCleartextTraffic="true" />
            </edit-config>
    
  2. Запускаем ionic Cordova build android. Он создает папку Android под платформами

  3. Откройте Android Studio и откройте папку Android, присутствующую в нашем проекте project-platform-android. Оставьте его на несколько минут, чтобы он построил градиент

  4. После завершения gradle build мы получаем несколько ошибок для включения minSdVersion в manifest.xml. Теперь мы просто удаляем <uses-sdk android:minSdkVersion="19" /> из manifest.xml.

    Убедитесь, что он удален из обоих мест:

    1. app → manifests → AndroidManifest.xml.
    2. CordovaLib проявляет AndroidManifest.xml.

    Теперь попробуйте снова построить градиент, и теперь он успешно строится.

  5. Убедитесь, что в теге приложения в манифесте приложения Androidmanifest.xml указано следующее:

    <application
    android:networkSecurityConfig="@xml/network_security_config"  android:usesCleartextTraffic="true" >
    
  6. Откройте network_security_config (приложение res xml network_security_config.xml).

    Добавьте следующий код:

    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <domain-config cleartextTrafficPermitted="true">
            <domain includeSubdomains="true">xxx.yyyy.com</domain>
        </domain-config>
    </network-security-config>
    

Здесь xxx.yyyy.com - ссылка на ваш HTTP API. Убедитесь, что вы не включили HTTP перед URL-адресом.

Примечание. Теперь создайте приложение с помощью Android Studio (Build - Build Bundle's / APK - Build APK), и теперь вы можете использовать это приложение, и оно отлично работает в Android Pie. Если вы попытаетесь создать приложение с помощью ionic Cordova build android, оно переопределит все эти настройки, поэтому убедитесь, что вы используете Android Studio для сборки проекта.

Если у вас установлены какие-либо более старые версии приложения, удалите их и попробуйте, иначе вы останетесь с некоторой ошибкой:

Приложение не установлено

person Gvs Akhil    schedule 07.11.2019
comment
ионный? Кордова? Так что это не обычная сборка Android, а фреймворк для создания собственных приложений с использованием интерфейсных технологий. . - person Weekend; 15.11.2019
comment
Ionic предоставляет реализацию webivew в приложении для Android, а Cordova помогает получить доступ к встроенным функциям Android, таким как микрофон, камера. - person Gvs Akhil; 15.11.2019

Я также получаю ту же ошибку «HTTP-трафик открытого текста не разрешен» при разработке моего приложения. Я использую Retrofit2 для сетевых вызовов в своем приложении, и у меня есть две среды проекта (разработка и производство). В моем рабочем домене есть сертификат SSL с вызовами HTTPS, а у разработчика не будет https. Конфигурация добавляется в варианты сборки. Но когда я перейду на разработчика, эта проблема возникнет. Поэтому я добавил для этого решение ниже.

Я добавил открытый текстовый трафик в манифест

 android:usesCleartextTraffic="true"

Затем я добавил спецификацию подключения во время создания класса конфигурации модификации OKHttp.

 .connectionSpecs(CollectionsKt.listOf(ConnectionSpec.MODERN_TLS, ConnectionSpec.CLEARTEXT))

Полное создание OkHttpClient приведено ниже.

OkHttpClient okHttpClient = new OkHttpClient.Builder()
        .readTimeout(10, TimeUnit.SECONDS)
        .connectTimeout(10, TimeUnit.SECONDS)
        .cache(null)
        .connectionSpecs(CollectionsKt.listOf(ConnectionSpec.MODERN_TLS, ConnectionSpec.CLEARTEXT))
        .addInterceptor(new NetworkInterceptor(context))
        .addInterceptor(createLoggingInterceptor())
        .addInterceptor(createSessionExpiryInterceptor())
        .addInterceptor(createContextHeaderInterceptor())
        .build();
person Nithinjith    schedule 18.06.2019

Создать файл - res / xml / network_security.xml

В network_security.xml ->

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">192.168.0.101</domain>
    </domain-config>
</network-security-config>

Откройте AndroidManifests.xml:

 android:usesCleartextTraffic="true" //Add this line in your manifests

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:usesCleartextTraffic="true"
        android:theme="@style/AppTheme">
person HandyPawan    schedule 23.10.2019

В то время как рабочий ответ для меня был от @PabloCegarra:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>

Вы можете получить предупреждение системы безопасности относительно cleartextTrafficPermitted="true"

Если вы знаете, что домены внесены в «белый список», вам следует смешать принятый ответ и приведенный выше:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="false">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">books.google.com</domain>
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </domain-config>
</network-security-config>

Этот код у меня работает, но моему приложению нужно получать данные только с books.google.com. Таким образом исчезает предупреждение системы безопасности.

person Steve Rogers    schedule 26.01.2020

Просто добавьте android: usesCleartextTraffic = "true" в файл AndroidManifest.xml.

person Manoj Alwis    schedule 17.10.2019

Поместите в свой resources/android/xml/network_security_config.xml следующее:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

Это решает Failed to load resource: net::ERR_CLEARTEXT_NOT_PERMITTED проблему на Android для Cordova / Ionic.

person Jarda Pavlíček    schedule 17.06.2020

В моем случае этот URL-адрес также не работает в браузере.

Я проверяю с помощью https://www.google.com/

webView.loadUrl("https://www.google.com/")

И у меня это сработало.

person Mayuresh Deshmukh    schedule 14.08.2019
comment
myWebView.loadUrl (www.site.com); также работает для веб-мастеров, у которых нет SSL в качестве HTTPS, а есть только HTTP. Может получиться пустая страница, но. - person Bay; 06.09.2019
comment
если указанный URL-адрес работает в вашем веб-браузере, вы можете использовать его в своем веб-просмотре. в противном случае вы можете увидеть эту ошибку. - person Mayuresh Deshmukh; 06.09.2019
comment
Я знаю, что иногда это дает ошибку, но в большинстве случаев я вижу пустую страницу даже при запуске. Javascript верен, и я могу правильно получить доступ к веб-сайту. Я не знаю, почему я вижу пустую страницу, также я установил масштабирование true. - person Bay; 07.09.2019

Для разработчиков Xamarin.Android убедитесь, что для реализации HttpClient и SSL / TLS установлено значение По умолчанию.

Его можно найти в разделе «Параметры Andorid» -> «Дополнительные параметры Android».

введите здесь описание изображения

person chaosifier    schedule 19.11.2019

Это сделано из соображений безопасности, вы всегда должны предпочитать использовать HTTPS (HTTP Secure), где это возможно.
Подробнее об этом можно прочитать на здесь

Есть несколько решений этой проблемы в зависимости от вашего состояния.

Если вы пытаетесь связаться со сторонней службой, IE: ваш собственный веб-сервер.

На стороне сервера: вы должны добавить поддержку HTTPS к этому серверу и использовать HTTPS вместо HTTP. В наши дни это можно сделать даже бесплатно с помощью таких сервисов, как LetsEncrypt и другие
На стороне клиента: если вы используя HttpURLConnection из пакета java.net, вы можете переключиться на HttpsURLConnection пакета java.net.ssl, он имеет похожий, если не идентичный API, поэтому переключение должно быть легким.

Если вы используете сторонний сервис, такой как Google, Facebook, погодный сервис и т. Д.

В случае, если служба, с которой вы общаетесь, поддерживает HTTPS (что, скорее всего, поддерживает), вы можете просто изменить URL-адрес своего запроса с http://abc.xyz на https://abc.xyz.

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

person Rosenpin    schedule 22.12.2019

 cleartext support is disabled by default.Android in 9 and above

 Try This one I hope It will work fine

1 Step:->  add inside android build gradle (Module:App)
            useLibrary 'org.apache.http.legacy'

  android {
               compileSdkVersion 28
              useLibrary 'org.apache.http.legacy'

          }

Затем 2 шага: -> манифест добавить внутри тега манифеста приложения

<application
    android:networkSecurityConfig="@xml/network_security_config">//add drawable goto Step 4

   // Step --->3  add to top this line  
     <uses-library
        android:name="org.apache.http.legacy"
        android:required="false" />

</application>

// Шаг 4 - >> Создать Drawable >> Xml файл >> назовите как >> network_security_config.xml

   <?xml version="1.0" encoding="utf-8"?>
   <network-security-config>
      <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
           <certificates src="system" />
        </trust-anchors>
      </base-config>
    </network-security-config>
person Ashif    schedule 18.02.2020
comment
Можно ли это в аосп поменять? - person Shadow; 11.03.2020
comment
@Shadow Да, вы можете это изменить. - person Ashif; 14.03.2020
comment
Могу ли я узнать, где именно я могу это изменить? - person Shadow; 16.03.2020
comment
@Shadow ‹base-config cleartextTrafficPermitted = true› ‹trust-anchors› ‹сертификаты src = system /› ‹/trust-anchors› ‹/base-config› ‹domain-config cleartextTrafficPermitted = true› ‹domain includeSubdomains =› true www. yourwebsidedomain.com ‹/domain› ‹/domain-config› - person Ashif; 16.03.2020
comment
Нет!! Вы снова говорите в стороне приложения. Я спрашиваю, как изменить класс папки framework / ‹›? - person Shadow; 18.03.2020

Обновитесь до React Native 0.58.5 или более поздней версии. У них есть includeSubdomain в их файлах конфигурации в RN 0.58.5.

ChangeLog

В Rn 0.58.5 они объявили network_security_config со своим доменом сервера. Конфигурация сетевой безопасности позволяет приложению разрешать открытый текстовый трафик из определенного домена. Поэтому не нужно прилагать дополнительных усилий, объявляя android:usesCleartextTraffic="true" в теге приложения вашего файла манифеста. Это будет разрешено автоматически после обновления версии RN.

person Dishant Walia    schedule 26.03.2019

После изменения API версии 9.0 получение сообщения об ошибке «Открытый текст» HTTP-трафик на YOUR-API.DOMAIN.COM не разрешен (targetSdkVersion = "28"). в студии xamarin, xamarin.android и android.

Два шага для решения этой ошибки в xamarin, xamarin.android и android studio.

Шаг 1. Создайте файл resources / xml / network_security_config.xml

В network_security_config.xml

<?xml version="1.0" encoding="utf-8" ?>
<network-security-config>
  <domain-config cleartextTrafficPermitted="true">
    <domain includeSubdomains="true">mobapi.3detrack.in</domain>
  </domain-config>
</network-security-config>

Шаг 2: обновите AndroidManifest.xml -

Добавьте android: networkSecurityConfig = "@ xml / network_security_config" в тег приложения. например:

<application android:label="your App Name" android:icon="@drawable/icon" android:networkSecurityConfig="@xml/network_security_config">
person Ripdaman Singh    schedule 03.08.2019

добавление этого параметра в заголовок решило мою проблему в apiSauce React Native

"Content-Type": "application/x-www-form-urlencoded",
  Accept: "application/json"
person Waleed Arshad    schedule 16.09.2019

Если вы используете ionic и получаете эту ошибку во время использования собственного плагина http, необходимо сделать следующее исправление:

goto resources/android/xml/network_security_config.xml Измените его на -

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">localhost</domain>
        <domain includeSubdomains="true">api.example.com(to be adjusted)</domain>
    </domain-config>
</network-security-config>

Это сработало для меня!

person Leena Bhandari    schedule 01.04.2020

Я использую Cordova 8 с cordova-plugin-whitelist 1.3.4, и это конфигурация по умолчанию, у моего приложения нет доступа к Интернету, и я только добавляю параметр в manifest.xml -> android: usesCleartextTraffic = "true"

Путь к mainfest изменился в Cordova 8: platform / android / app / src / main / AndroidManifest.xml.

 <?xml version='1.0' encoding='utf-8'?>
    <manifest android:hardwareAccelerated="true" android:versionCode="10000" android:versionName="1.0.0" package="io.cordova.hellocordova" xmlns:android="http://schemas.android.com/apk/res/android">
        <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" />
        <application 
android:hardwareAccelerated="true" 
android:icon="@mipmap/ic_launcher" 
android:label="@string/app_name" 
android:supportsRtl="true" 
android:usesCleartextTraffic="true">
            <activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode" android:label="@string/activity_name" android:launchMode="singleTop" android:name="MainActivity" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize">
                <intent-filter android:label="@string/launcher_name">
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    </manifest>

это действительно глупо, потому что очевидно, что вашему приложению нужен доступ в Интернет ....

person Chevelle    schedule 17.05.2020

Открытый текст - это любая переданная или сохраненная информация, которая не зашифрована или не предназначена для шифрования.

Когда приложение взаимодействует с серверами, используя сетевой трафик в открытом виде, например HTTP (не https), это может повысить риск взлома и подделки содержимого. Третьи стороны могут вводить несанкционированные данные или утечку информации о пользователях. Вот почему разработчикам рекомендуется использовать только защищенный трафик, например HTTPS. Вот реализация и ссылка на то, как решить эту проблему.

person Gk Mohammad Emon    schedule 07.04.2020

Попробуйте ввести в URL-адрес https: // вместо http: //.

person Jose A. de los Santos    schedule 05.05.2020
comment
Эта проблема полностью связана с безопасным протоколом? - person Nelles; 05.05.2020
comment
@Nelles Но менять протоколы - не лучшее решение. Сервер может не поддерживать SSL-соединения. - person Farid; 24.12.2020

videoView не может открыть это видео Онлайн-видео

Создайте файл res / xml / network_security_config.xml

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>

Новое в файле AndroidManifest.xml в приложении:

android:networkSecurityConfig="@xml/network_security_config"

https://techprogrammingideas.blogspot.com/2021/02/android-code-for-displaying-video-with.html

https://youtu.be/90hWWAqfdUU
person Shaneesh P    schedule 24.02.2021

Один лайнер для решения вашей проблемы. Я предполагаю, что вы сохраните свой URL-адрес в строке myURL. Добавьте эту строку, и все готово. myURL = myURL.replace ("http", "https");

person Pallav Chaudhari    schedule 16.04.2020