参考书目《第一行代码》第二版
AndroidStudio版本:3.5.2
SDK版本:Android9.0
在尝试访问网络时使用Okhttp(4.1.0)代码如下:
private void sendRequestWithOkHttp(){
new Thread(new Runnable(){
@Override
public void run() {
try {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("http://www.baidu.com")
.build();
Response response = client.newCall(request).execute();
String responseData = response.body().string();
showResponse(responseData);
}catch (Exception e){
e.printStackTrace();
}
}
}).start();
}
void showResponse(final String response) {
runOnUiThread(new Runnable() {
@Override
public void run() {
reponseTest.setText(response);
}
});
}
按钮点击事件触发sendRequestWithOkHttp();创建网络访问线程,GET服务器的数据,返回为字符串调用showResponse();显示在文本框中。运行程序无法拿到数据。
查看运行信息,发现:
/System.err: java.net.UnknownServiceException: CLEARTEXT communication to www.baidu.com not permitted by network security policy
System.err: at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.kt:35)
不允许进行通信?????
我明明已经在AndroidManifest.xml中声明网络权限了,
<uses-permission android:name="android.permission.INTERNET"/>
上网搜索发现:
为保证用户数据和设备的安全,Google针对下一代 Android 系统(Android P) 的应用程序,将要求默认使用加密连接,这意味着
Android P 将禁止 App 使用所有未加密的连接,因此运行 Android P
系统的安卓设备无论是接收或者发送流量,未来都不能明码传输。
诶,巧了。刚好我是Android9.0的SDK,查看解决办法,发现可以通过更改网络安全配置解决。
解决步骤:
首先,在res文件夹下创建一个xml文件夹,然后创建一个network_security_config.xml文件,文件内容如下:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
然后,在AndroidManifest.xml文件下的application标签增加以下属性
<application
…
android:networkSecurityConfig="@xml/network_security_config"
…
</application>
重新运行:成功拿到服务器数据。