昨天我获得了Android N预览的新升级。自从我升级以来,我再也无法启动我的应用了。
java.io.IOException: Cleartext HTTP traffic to myserver.com not permitted
我尝试在清单中将usesCleartextTraffic
设置为true
或添加network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">myserver.com</domain>
</domain-config>
</network-security-config>
两者都没有奏效。关于那里发生了什么的任何想法?
当我尝试在清单中定义networkSecurityConfig时,我收到编译错误
Error:(35) No resource identifier found for attribute 'networkSecurityConfig' in package 'android'
不确定为什么。文件就在那里,一切都很好。
在Google的Android问题跟踪器中找到this建议。他们建议将network_security_config
定义移至meta-data
。我仍然得到同样的例外。
答案 0 :(得分:13)
Android N开发者预览版4中存在一个已知问题,即使应用修改其ApplicationInfo.flags
,它也会触发阻止来自应用的明文流量,即使该应用未请求明文流量被封锁修复程序位于下一个开发人员预览版中。因此,这与您的网络安全配置无关。实际上,您似乎甚至不需要声明自定义网络安全配置。
如果您不能等到下一个Android N开发者预览版,请检查您的应用是否有修改自己的ApplicationInfo.flags
的地方。通常,这采用getApplicationInfo().flags &= ApplicationInfo.FLAG_DEBUGGABLE
或getApplicationInfo().flags = ApplicationInfo.FLAG_DEBUGGABLE
的形式。这些用法的修正是(getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE)
。
或者,作为解决方法,尽可能早地在应用的生命周期中调用NetworkSecurityPolicy.isCleartextTrafficPermitted()
。如果在篡改ApplicationInfo.flags
的代码之前调用此解决方法,则此解决方法应该有效。
答案 1 :(得分:5)
仅在应用程序代码中尝试一行
android:usesCleartextTraffic =“ true”
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<application
...
android:usesCleartextTraffic="true"
...>
</application>
</manifest>
答案 2 :(得分:1)
android:usesCleartextTraffic="true"
将此行放入清单文件的应用程序标记中
答案 3 :(得分:1)
<?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
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:ignore="GoogleAppIndexingWarning"
android:networkSecurityConfig="@xml/network_security_config">
<activity android:name=".activity.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
答案 4 :(得分:1)
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<application
...
android:usesCleartextTraffic="true"
...>
</application>
</manifest>
这个对我来说很完美:)
答案 5 :(得分:1)
我在这里做出的最佳解决方案是清单中应包含以下代码
android:usesCleartextTraffic="true"
答案 6 :(得分:1)
从 API 级别 28 开始,usesCleartextTraffic
默认禁用。所以,如果你想启用它,然后像这样在 androidManifest 文件中将 usesCleartextTraffic
设置为 true,
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<application
...
android:usesCleartextTraffic="true"
...>
</application>
</manifest>
答案 7 :(得分:0)
创建XML res / xml / network_security_config.xml
func compressImage(img:UIImage) -> String {
Utill.showProgress()
var imageData = Data(UIImagePNGRepresentation(img)! )
print("***** Uncompressed Size \(imageData.description) **** ")
imageData = UIImageJPEGRepresentation(img, 0.025)!
print("***** Compressed Size \(imageData.description) **** ")
let image = UIImage(data: imageData)
let imagesData:NSData = UIImagePNGRepresentation(image!)! as NSData
let strBase64 = imagesData.base64EncodedString(options: .lineLength64Characters)
Utill.dismissProgress()
return strBase64
}
在AndroidManifest.xml中的标签应用程序中引用此文件。喜欢:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>