Как разрешить все типы сетевых соединений HTTP и HTTPS в Android (9) Pie?

С Android 9 Pie теперь запросы без шифрования никогда не будут работать. И по умолчанию Система будет ожидать, что вы будете использовать TLS по умолчанию. Вы можете прочитать эту функцию здесь. Поэтому, если вы делаете запросы только через HTTPS, вы в безопасности. Но как насчет приложений, которые отправляют запросы через разные сайты, например, приложения, похожие на браузер?

Как включить запросы ко всем типам соединений HTTP и HTTPS в Android 9 Pie?

Ответ 1

Самый простой способ реализовать это - использовать этот атрибут в вашем AndroidManifest.xml где вы разрешаете все http для всех запросов:

android:usesCleartextTraffic="true"

Но в случае, если вам нужно больше конфигураций для разных ссылок, например, разрешив http для некоторых доменов, но не для других доменов, вы должны предоставить файл networkSecurityConfig.

Чтобы сделать это в Android 9 Pie, вам нужно установить networkSecurityConfig в теге application Manifest следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:networkSecurityConfig="@xml/network_security_config">




    </application>
</manifest>

Затем в вашей папке xml вы должны создать файл с именем network_security_config точно так же, как вы назвали его в манифесте, и оттуда содержимое вашего файла должно быть таким, чтобы разрешить все запросы без шифрования:

<?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>

Оттуда вам хорошо идти. Теперь ваше приложение будет делать запросы на все типы соединений. Для получения дополнительной информации по этой теме читайте здесь.

Ответ 2

Полностью работающее решение для пользователей Android или React-native пользователей, сталкивающихся с этой проблемой, просто добавьте этот android:usesCleartextTraffic="true" в файл AndroidManifest.xml, например так:

android:usesCleartextTraffic="true"
tools:ignore="GoogleAppIndexingWarning">
<uses-library
    android:name="org.apache.http.legacy"
    android:required="false" />

между <application>.. </application> вот так:

<application
      android:name=".MainApplication"
      android:label="@string/app_name"
      android:icon="@mipmap/ic_launcher"
      android:allowBackup="false"
      android:theme="@style/AppTheme"
        android:usesCleartextTraffic="true"
        tools:ignore="GoogleAppIndexingWarning">
        <uses-library
            android:name="org.apache.http.legacy"
            android:required="false" />
      <activity
        android:name=".MainActivity"
        android:label="@string/app_name"/>
 </application>

Ответ 3

Простой способ установить android:usesCleartextTraffic="true" на вашем AndroidManifest.xml

android:usesCleartextTraffic="true"

Ваш AndroidManifest.xml выглядит

<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.dww.drmanar">
   <application
       android:icon="@mipmap/ic_launcher"
       android:label="@string/app_name"
       android:usesCleartextTraffic="true"
       android:theme="@style/AppTheme"
       tools:targetApi="m">
       <activity
            android:name=".activity.SplashActivity"
            android:theme="@style/FullscreenTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
       </activity>
    </application>
</manifest>

Я надеюсь, что это поможет вам.

Ответ 4

Просто установите usesCleartextTraffic в теге приложения в файле AndroidManifest.xml. Нет необходимости создавать конфигурационный файл для Android.

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

Ответ 5

Для приложений React Native во время работы в режиме отладки добавьте xml block упомянутый @Xenolion, в react_native_config.xml расположенный в <project>/android/app/src/debug/res/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>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>

Ответ 6

Вы можете проверить, отправляете ли вы clearText через HTTP Fix: https://medium.com/@son.rommer/fix-cleartext-traffic-error-in-android-9-pie-2f4e9e2235e6
ИЛИ ЖЕ
В случае устаревания HTTP-клиента Apache (от Google): в Android 6.0 мы убрали поддержку HTTP-клиента Apache. Начиная с Android 9, эта библиотека удаляется из пути загрузки и по умолчанию недоступна для приложений. Чтобы продолжить использовать HTTP-клиент Apache, приложения, ориентированные на Android 9 и выше, могут добавить в свой AndroidManifest.xml следующее:

Источник https://developer.android.com/about/versions/pie/android-9.0-changes-28

Ответ 7

Я пробовал то же самое

Но это не работает,

На этом этапе происходит исключение

Ответ 8

Легкий путь

Добавьте usesCleartextTraffic в manifest.xml

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

Указывает, намерено ли приложение использовать сетевой трафик в виде открытого текста, например HTTP в виде открытого текста. Значением по умолчанию для приложений, ориентированных на API уровня 27 или ниже, является "true". Приложения, для которых API уровня 28 или выше, по умолчанию имеют значение "false"