Android网络请求报错(直接请求http)

这个报错的原因是:Android 9.0 (API 28) 及更高版本默认禁止使用明文 HTTP 请求(只允许 HTTPS)。

根据之前的代码, BASE_URLhttp://... 开头的,所以被系统拦截了。

这里有 三种解决方法,推荐按顺序尝试:

方法一:最快解决(全局允许 HTTP)

直接修改 AndroidManifest.xml 文件,在 <application> 标签中添加 android:usesCleartextTraffic="true"

位置: app/src/main/AndroidManifest.xml

xml 复制代码
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.joygem.demo">

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        
        <!-- 添加这一行 -->
        android:usesCleartextTraffic="true" 
        >
        
        <activity android:name=".MainActivity">
            <!-- ... -->
        </activity>
    </application>
</manifest>

添加完后,卸载 App 重新安装(有时直接运行配置不生效),再次尝试即可。


方法二:更规范的做法(配置网络安全文件)

如果你只想允许特定的域名使用 HTTP,而不是全局允许,可以这样做(这在正式上架应用商店时更安全):

  1. res/xml 目录下新建一个文件 network_security_config.xml (如果 xml 目录不存在就创建它)。

  2. 填入以下内容:

    xml 复制代码
    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <!-- 允许该域名的 HTTP 请求 -->
        <domain-config cleartextTrafficPermitted="true">
            <domain includeSubdomains="true">test.xdf.cn</domain>
        </domain-config>
    </network-security-config>
  3. AndroidManifest.xml<application> 标签中引用这个配置:

    xml 复制代码
    <application
        ...
        android:networkSecurityConfig="@xml/network_security_config"
        ...>

方法三:修改服务器地址(如果有 HTTPS)

如果你的测试服务器支持 HTTPS,最简单的办法是修改 NetworkApi 中的 BASE_URL

把: http://testmedia-vod-lan-roombox.test.xdf.cn 改为: https://testmedia-vod-lan-roombox.test.xdf.cn

(前提是服务端配置了 SSL 证书,否则会报证书握手错误)。


建议

对于测试环境(Test Server),直接使用 方法一 是最省事的。

相关推荐
_小马快跑_39 分钟前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android
_小马快跑_40 分钟前
Kotlin | 从SparseArray、ArrayMap的set操作符看类型检查的不同
android
_小马快跑_42 分钟前
Android | 为什么有了ArrayMap还要再设计SparseArray?
android
_小马快跑_44 分钟前
Android TextView图标对齐优化:使用LayerList精准控制drawable位置
android
_小马快跑_1 小时前
Kotlin协程并发控制:多线程环境下的顺序执行
android
_小马快跑_1 小时前
Kotlin协程异常捕获陷阱:try-catch捕获异常失败了?
android
_小马快跑_1 小时前
Android | 权限申请与前置说明弹窗同时展示的优雅方案
android
_小马快跑_1 小时前
Android | Channel 与 Flow的异同点
android
_小马快跑_1 小时前
Android | 文本测量:从 Paint.measureText 到 StaticLayout 的替换
android
树獭非懒2 小时前
告别繁琐多端开发:DivKit 带你玩转 Server-Driven UI!
android·前端·人工智能