Android studio使用OKGO的POST请求访问http失败的解决方法

前几天在旧手机(版本是Android7)上调试一个app,用OKGO的post请求连接服务器登录一直很正常。今天旧手机不在身边,用自己的手机调试,就出现网络请求失败的问题,弹onError()里自己写的Toast提示。反复检查了手机确实没有对app关闭网络权限,USB调试都打开了。于是在网上搜索了一些方法,尝试后问题得到解决。在这记录一下这两种解决方案。

1.targetSdkVersion 降到27以下

在build.gradle中把targetSdkVersion版本从30降为27以下(也就是Android8.0以下),Sync Now一下或者在File中点击Sync project with Gradle files同步引用库,再重新启动app,发现网络请求可以了,问题解决。

2.允许http请求

也可以选择不降targetSdkVersion版本,直接在 res 下新增一个 xml 文件,创建一个名为:network_security_config.xml 文件(名字随便起),内容是:

<?xml version="1.0" encoding="utf-8"?>
<!--Android9以上机型 https请求适配-->
<network-security-config>
    base-config cleartextTrafficPermitted="true" />
</>

然后在AndroidManifest.xml文件下的application标签增加属性

android:networkSecurityConfig="@xml/network_security_config

实例如下图所示:

application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher_round"
        android:label="@string/app_name"
        android:roundIcon
        android:supportsRtl
        android:theme="@style/AppTheme"
        android:networkSecurityConfig="@xml/network_security_config">
        activity =".LoginActivity">
            intent-filter>
                action ="android.intent.action.MAIN" />
                category ="android.intent.category.LAUNCHER" />
            activity=".HomeActivity"></application>

再次运行程序,网络请求成功,问题解决。

3.引起问题的原因

在Android 8加强了系统安全权限之后,Android P 又限制了明文流量的网络请求,非加密的流量请求都会被系统直接禁止掉,目前网络访问基本都从原来的http替换成https也是为了加强安全性。如果当前应用的请求是 HTTP 请求,而非 HTTPS,这样系统就会禁止当前应用进行该请求,如果 WebView 的 URL 用 HTTP 协议,同样会出现加载失败,将无法显示WebView的内容,HTTPS 则不受影响。

相关文章

Android 如何解决dialog弹出时无法捕捉Activity的back事件 在...
Android实现自定义带文字和图片的Button 在Android开发中经常...
Android 关于长按back键退出应用程序的实现最近在做一个Andr...
android自带的时间选择器只能精确到分,但是对于某些应用要求...