Android网络访问不同版本的差异,看完这篇文章你就茅厕顿开了。

网络
安卓开发
网络安全
http
网络配置
同学们遇到的问题
最近好多小朋友私信告诉我在android27上可以访问网络,在29上就不可以访问了。
在这些api的版本网络访问到底存在什么差异呢?
我看到这些问题又是如何去解决的呢?
官方文档
android版本的发布,会有一个说明文档,同学们可以去查阅这些文档来了解版本的变化。
Android27里的网络配置更新
android27是什么版本呢?看表吧:
在android9的变更说明中有提到:
也就是说,android28以前的版本,比如说27可以使用明文(http)访问,28(包括28)以上,则需要配置
cleartextTrafficPermitted 设置为 true
才可以使用明文流量
是不是这样子的呢?
验证
private void loadData() {
try {
URL url = new URL("https://www.sunofbeach.net");
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
int responseCode = httpURLConnection.getResponseCode();
if(responseCode == 200) {
httpURLConnection.setConnectTimeout(1000);
InputStream inputStream = httpURLConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
String line;
while((line = bufferedReader.readLine()) != null) {
Log.d(TAG,line);
}
bufferedReader.close();
}
} catch(Exception e) {
e.printStackTrace();
}
}
android27运行起来的结果
改成28
W/System.err: java.io.IOException: Cleartext HTTP traffic to www.sunofbeach.net not permitted
W/System.err: at com.android.okhttp.HttpHandler$CleartextURLFilter.checkURLPermitted(HttpHandler.java:115)
W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:458)
W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:407)
W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:538)
W/System.err: at com.sunofbeaches.javanetdemo.MainActivity.loadData(MainActivity.java:39)
W/System.err: at com.sunofbeaches.javanetdemo.MainActivity.access$000(MainActivity.java:15)
W/System.err: at com.sunofbeaches.javanetdemo.MainActivity$1.run(MainActivity.java:30)
W/System.err: at java.lang.Thread.run(Thread.java:764)
这应该是同学们看到了熟悉的报错了吧
那怎么改呢?按官方文档说法,我们添加一个属性
cleartextTrafficPermitted 设置为 true
再进行访问测试:
又可以了,看来官方文档没有骗人。
网络安全配置
官方文档也可以访问,这里就不累赘了,直接把连接发给大家吧。