我收到来自 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 及更低版本上一切正常,我没有在 Manifest 中设置 android:usesCleartextTraffic
(并且将其设置为 true
并没有帮助,无论如何这都是默认值),我也没有使用网络安全信息。如果我调用 NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted()
,它会使用相同的 apk 文件返回 Android 8 的 false
,旧版本的 true
。我试图在有关 Android O 的 Google 信息中找到一些提及,但没有成功。
根据Network security configuration -
从 Android 9(API 级别 28)开始,明文支持默认禁用。
也看看Android M and the war on cleartext traffic
Codelabs explanation 来自 Google
选项1 -
首先尝试使用 https://
而不是 http://
访问 URL
选项 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' answer 指出的那样,android:targetSandboxVersion
也可能是一个问题 -
根据Manifest Docs -
android:targetSandboxVersion 此应用使用的目标沙箱。沙盒版本号越高,安全级别越高。它的默认值为 1;您也可以将其设置为 2。将此属性设置为 2 会将应用程序切换到不同的 SELinux 沙箱。以下限制适用于 2 级沙箱: 网络安全配置中 usesCleartextTraffic 的默认值为 false。不允许 Uid 共享。
所以选项4 -
如果您在 <manifest>
中有 android:targetSandboxVersion
,则将其减少为 1
AndroidManifest.xml
-
<?xml version="1.0" encoding="utf-8"?>
<manifest android:targetSandboxVersion="1">
<uses-permission android:name="android.permission.INTERNET" />
...
</manifest>
我在 Android 9 中的问题是在使用 http 的域上浏览网页视图 this answer 的解决方案
<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>
gradle
中以某种方式重写它吗?
在 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
您可能只想在调试时允许明文,但保留在生产中拒绝明文的安全优势。这对我很有用,因为我针对不支持 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}"
好的,那是 ⇒⇒ 不是 ⇐⇐ add it to your Manifest
的数千次重复,而是基于此的提示,但会给您额外的好处(也许还有一些背景信息) .
以下解决方案允许您为每个环境设置协议(HTTP / HTTPS)。
这样,您就可以将 http
用于您的 DEV-Environment,将 https
用于您的 PRODUCTION-Environment,而无需一直更改它!这是必需的,因为通常您没有本地或开发环境的 https 证书,但它是生产环境(也可能是暂存环境)的必备条件。
Android 有一种覆盖 src-Directory 的功能。
默认情况下,您有
/app/src/main
但是您可以添加其他目录来覆盖您的 AndroidManifest.xml。下面是它的工作原理:
创建目录 /app/src/debug
在里面创建 AndroidManifest.xml
在此文件中,您不必将所有规则放入其中,而只需将您喜欢从 /app/src/main/AndroidManifest.xml 覆盖的规则放入其中
这是请求的 CLEARTEXT-Permission 的示例:
<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。主要 |释放环境。
最大的好处...您的生产清单中没有调试内容,并且您保持了一个直截了当且易于维护的结构
如果可能,将您的网址从 HTTP
更改为 HTTPS
;
成功了!!!
<?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>
在上面提供的建议中,我将我的网址提供为 http://xyz.abc.com/mno/
我将其更改为 xyz.abc.com 然后它开始工作。
它可能对某人有用。
我们最近在 Android 9 上遇到了同样的问题,但我们只需要在 WebView 中显示一些 Url,没什么特别的。因此,将 android:usesCleartextTraffic="true"
添加到 Manifest 是可行的,但我们不想为此损害整个应用程序的安全性。所以解决方法是将链接从 http
更改为 https
对于 React Native 项目
它已经在 RN 0.59 上修复。您可以在 upgrade diff from 0.58.6 to 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>
android/app/src/debug/AndroidManifest.xml -
<?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>
检查接受的答案以了解根本原因。
我已经从已经存在的 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"
>
那么这个错误 Cleartext HTTP traffic to overlay.openstreetmap.nl not allowed 在 android 9 和 10 中对我来说已经消失了。我希望这也适用于 android 8 如果它有帮助你不要忘记投票谢谢
添加 ... android:usesCleartextTraffic="true" ... 到您的清单文件似乎可以解决问题,但它会对数据完整性造成威胁。
出于安全原因,我在清单文件中使用了 manifest placeholders 和 android:usesCleartextTraffic(就像在 Option 3 of the accepted answer 中,即@Hrishikesh Kadam 的响应)只允许在调试环境中使用明文。
在我的 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 Manifest 中,我使用了相同的占位符......
AndroidManifest.xml -
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<application
...
android:usesCleartextTraffic="${cleartextTrafficPermitted}"
...>
...
</application>
</manifest>
这样,仅在调试环境下才允许明文流量。
最简单最简单的解决方案 [Xamarin Form]
安卓版
转到 Android 项目,然后单击属性,
https://i.stack.imgur.com/oVc2y.png
打开 AssemblyInfo.cs 并在此处粘贴此代码:[assembly: Application(UsesCleartextTraffic =true)]
https://i.stack.imgur.com/npJHb.png
对于 iOS
使用 NSAppTransportSecurity
:
https://i.stack.imgur.com/xD7n9.png
您必须在 info.plist
文件中的 NSAppTransportSecurity
字典下将 NSAllowsArbitraryLoads
键设置为 YES
。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
https://i.stack.imgur.com/Fh3GC.png
好的,我已经想通了。这是由于我添加了 Manifest 参数 android:targetSandboxVersion="2"
,因为我们也有 Instant App 版本 - 它应该确保一旦用户从 Instant App 升级到常规应用程序,他不会在传输过程中丢失他的数据。然而,正如模糊的描述所暗示的那样:
指定此应用要使用的目标沙箱。更高的 sanbox 版本将具有更高的安全级别。此属性的默认值为 1。
它显然还增加了新级别的安全策略,至少在 Android 8 上是这样。
要将这些不同的答案应用于 Xamarin.Android
,您可以使用类和程序集级属性而不是手动编辑 AndroidManifest.xml
当然需要互联网许可(duh ..):
[assembly: UsesPermission(Android.Manifest.Permission.Internet)]
注意:通常程序集级属性会添加到您的 AssemblyInfo.cs
文件中,但 using
下方和 namespace
上方的任何文件都可以使用。
然后在您的 Application 子类(如果需要,创建一个)上,您可以添加 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>
您还可以在 ApplicationAttribute
上使用 UsesCleartextTraffic
参数:
#if DEBUG
[Application(AllowBackup = false, Debuggable = true, UsesCleartextTraffic = true)]
#else
[Application(AllowBackup = true, Debuggable = false, UsesCleartextTraffic = true))]
#endif
UsesCleartextTraffic = true
虽然对我来说有效的答案是@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 检索数据。通过这种方式,安全警告消失了。
2019 年 12 月更新 ionic - 4.7.1
<manifest xmlns:tools=“http://schemas.android.com/tools”>
<application android:usesCleartextTraffic=“true” tools:targetApi=“28”>
请在 android manifest .xml 文件中添加以上内容
离子的以前版本
确保 Ionic 项目的 config.xml 中有以下内容:
这里的 xxx.yyyy.com
是您的 HTTP API 的链接。确保在 URL 之前不包含任何 Http。
注意:现在使用 Android Studio (Build -- Build Bundle's/APK -- Build APK) 构建应用程序,现在您可以使用该应用程序,它在 Android Pie 中运行良好。如果您尝试使用 ionic Cordova build android 构建应用程序,它会覆盖所有这些设置,因此请确保您使用 Android Studio 构建项目。
如果您安装了任何旧版本的应用程序,请卸载它们并尝试一下,否则您将遇到一些错误:
未安装应用
在开发我的应用程序时,我也遇到了相同的“不允许明文 HTTP 流量”错误。我在我的应用程序中使用 Retrofit2 进行网络调用,并且我有两个项目环境(开发和生产)。我的生产域具有带有 HTTPS 调用的 SSL 证书,而 dev 将没有 https。该配置已添加到构建风味中。但是当我更改为 dev 时,会触发此问题。所以我为此添加了以下解决方案。
我在清单中添加了明文流量
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();
创建文件 - 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">
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 Step:-> manifest add inside manifest application tag
<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>
//Step 4-->> Create Drawable>>Xml file>>name as>> 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>
将以下内容放入您的 resources/android/xml/network_security_config.xml
:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
这解决了 Android for Cordova / Ionic 上的 Failed to load resource: net::ERR_CLEARTEXT_NOT_PERMITTED
问题。
只需在 AndroidManifest.xml 文件中添加 android:usesCleartextTraffic="true"
在我的情况下,该 URL 在浏览器中也不起作用。
webView.loadUrl("https://www.google.com/")
它对我有用。
对于 Xamarin.Android 开发人员,请确保 HttpClient 实现和 SSL/TLS 设置为默认值。
它可以在 Andorid 选项 -> 高级 Android 选项下找到。
https://i.stack.imgur.com/wEmUs.png
这样做是出于安全原因,您应该始终尽可能使用 HTTPS(HTTP 安全)。
您可以阅读有关它的更多信息here
根据您的情况,此问题有多种解决方案。
如果您尝试与第一方服务通信,即:您自己的 Web 服务器
服务器端:您应该为该服务器添加 HTTPS 支持并使用 HTTPS 而不是 HTTP。如今,您甚至可以免费使用 LetsEncrypt 和 others
客户端: 如果您使用 java.net
软件包中的 HttpURLConnection
,您可以切换到java.net.ssl
包中的 HttpsURLConnection
,它具有相似的 API(如果不相同),因此切换应该毫不费力。
如果您使用第三方服务,例如 Google、Facebook、天气服务等。
如果您正在与之通信的服务支持 HTTPS(它很可能支持),您只需将请求 URL 从 http://abc.xyz
更改为 https://abc.xyz
。
作为最后的手段,如果您要与之通信的第三方服务不支持 HTTPS 或任何其他形式的安全通信,您可以使用 this answer,但同样不建议这样做,因为它违背了这么多的目的需要的安全功能。
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
升级到 React Native 0.58.5 或更高版本。他们在 RN 0.58.5 的配置文件中有 includeSubdomain
。
在 Rn 0.58.5 中,他们用他们的服务器域声明了 network_security_config
。网络安全配置允许应用程序允许来自某个域的明文流量。因此,无需通过在清单文件的应用程序标记中声明 android:usesCleartextTraffic="true"
来付出额外的努力。升级RN版本后会自动解决。
更改 API 版本 9.0 后出现错误 Cleartext HTTP traffic to YOUR-API.DOMAIN.COM not allowed (targetSdkVersion="28")。在 xamarin、xamarin.android 和 android 工作室中。
在 xamarin、xamarin.android 和 android studio 中解决这个错误的两个步骤。
第一步:创建文件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">
在标头中添加此参数解决了我在 apiSauce React Native 中的问题
"Content-Type": "application/x-www-form-urlencoded",
Accept: "application/json"
如果您使用 ionic 并在本机 http 插件期间收到此错误,则需要完成以下修复 -
转到 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>
这对我有用!
明文是未加密或打算加密的任何传输或存储的信息。
当应用程序使用明文网络流量(例如 HTTP(not https))与服务器通信时,可能会增加内容被黑客入侵和篡改的风险。第三方可以注入未经授权的数据或泄露有关用户的信息。这就是为什么鼓励开发人员只保护流量,例如 HTTPS。 Here是如何解决这个问题的实现和参考。
android:usesCleartextTraffic="true"
,那么这个 Android 安全功能有什么意义?