我收到使用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也无济于事,反正这是默认值),我也不使用网络安全信息(Network Security Information).如果我调用NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted(),它返回false(适用于Android 8),true(适用于旧版本),使用相同的apk文件. 我试图在谷歌关于Android O的信息中找到一些关于这方面的信息,但没有成功.

推荐答案

根据Network security configuration-

从Android 9(API级别28)开始,明文支持被禁用 默认情况下.

也看看Android M and the war on cleartext traffic

Codelabs explanation来自谷歌

Option 1 -

首先try 用"https://"而不是"http://"点击URL

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

Option 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

此应用程序要使用的目标Sandbox .Sandbox 版本越高

  • 网络安全配置中的默认值usesCleartextTraffic为false.
  • 不允许共享UID.

So Option 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相关问答推荐

Kotlin中的类型参数不在其范围内

如何在Android Room中使用@Relation多对一查询

有没有办法知道每台安卓设备上的通知限制?

Android Gradle/Groovy,如何将文件复制到APK

Android库中的kotlinCompilerExtensionVersion

Jetpack创作动画断断续续变化的观点

Android-交叉引用表中的ForeignKey用于什么?

如何共享没有';t是否存在?(仅信息)在Android?

android crashlytics 显示崩溃但不显示我的课程中的位置

如何将 Room Persistence 依赖项正确添加到我的 Jetack Compose Android 应用程序

使用 Gadle kotlin 为多模块 Android 代码库设置 jacoco

如何在我的sqlite数据库中获取某个玩家的分数

Jetpack Compose - 在屏幕外偏移绘制形状并使用非常大的尺寸

java.lang.ExceptionInInitializerError -- 原因:java.lang.NullPointerException

在 Jetpack Compose 中对齐行项目

在 Jetpack Compose 中使用 ViewModel 实现 startActivity 的最佳实践

如何在 Compose 中使用合并的单元格创建网格视图?

Jetpack compose 为网络检索视频帧导致延迟

组合 - 重新组合图像

如何在不使用 NestedScrollView 的情况下使用带有 CollapsingToolbar 的 ViewPager?