191

从现在的 Android 9 Pie 开始,没有加密的请求将永远无法工作。默认情况下,系统会期望您默认使用 TLS。您可以在此处阅读此功能因此,如果您只通过 HTTPS 发出请求,那么您是安全的。但是,通过不同站点发出请求的应用程序呢,例如类似浏览器的应用程序。

如何在 Android 9 Pie 中启用对所有类型连接 HTTP 和 HTTPS 的请求?

4

9 回答 9

364

实现这一点的简单方法是将此属性用于您AndroidManifest.xml允许http所有请求的位置:

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

但是,如果您想为不同的链接进行更多配置,例如,允许http某些域但不允许其他域,您必须提供res/xml/networkSecurityConfig.xmlfile.

要在 Android 9 Pie 中执行此操作,您必须networkSecurityConfig在 Manifestapplication标签中设置一个,如下所示:

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

从那里你很高兴。现在,您的应用将对所有类型的连接发出请求。有关此主题的更多信息,请阅读此处

于 2018-08-17T20:44:47.903 回答
47

双方或面临此问题的用户 的完全可行的解决方案只需将其添加 到AndroidManifest.xml文件中,如下所示:AndroidReact-nativeandroid:usesCleartextTraffic="true"

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>
于 2019-04-24T16:28:02.970 回答
22

一个简单的方法被设置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>

我希望这能帮到您。

于 2019-05-22T11:20:41.263 回答
15

简单的方法

添加usesCleartextTrafficAndroidManifest.xml

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

指示应用程序是否打算使用明文网络流量,例如明文 HTTP。面向 API级别 27或更低级别的应用的默认值为“true”。以 API级别 28或更高级别为目标的应用默认为“false”。

于 2019-10-20T08:45:30.890 回答
12

对于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>
于 2019-04-24T09:42:34.133 回答
11

只需usesCleartextTraffic在文件的应用程序标签中设置标志AndroidManifest.xml。无需为 Android 创建配置文件。

 <application
   android:usesCleartextTraffic="true"
   .
   .
   .>
于 2019-05-21T10:00:35.443 回答
3

我遇到了同样的问题,我注意到我的安全配置有不同的标签,就像@Xenolion 回答说

<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">localhost</domain>
    </domain-config>
</network-security-config>

所以我将标签“domain-config”更改为“base-config”并且可以正常工作,如下所示:

<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">localhost</domain>
    </base-config>
</network-security-config>
于 2019-11-12T14:42:53.543 回答
2

这对我有用,

将此 xml 文件添加到: andriod/app/src/main/res/xml/network_security_config.xml

network_security_config.xml

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>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">your_domain1</domain>
    </domain-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">your_domain2</domain>
    </domain-config>
</network-security-config>

然后将此代码添加到AndroidMenifest.xml

<application
    ...
      android:usesCleartextTraffic="true"
      android:networkSecurityConfig="@xml/network_security_config"
    ...
      >
      <!-- for http support-->
      <uses-library android:name="org.apache.http.legacy" android:required="false"/>
      ...
</application>
        
于 2021-05-05T13:45:43.943 回答
0

您可以检查您是否通过 HTTP Fix 发送明文:https
://medium.com/@son.rommer/fix-cleartext-traffic-error-in-android-9-pie-2f4e9e2235e6或
在 Apache HTTP 客户端的情况下弃用(来自 Google):在 Android 6.0 中,我们删除了对 Apache HTTP 客户端的支持。从 Android 9 开始,该库已从引导类路径中移除,并且默认情况下对应用程序不可用。要继续使用 Apache HTTP 客户端,面向 Android 9 及更高版本的应用可以将以下内容添加到其 AndroidManifest.xml 中:

来源 https://developer.android.com/about/versions/pie/android-9.0-changes-28

于 2019-05-06T14:06:59.013 回答