Android P 网络请求相关总结

 
   

code小生,一个专注 Android 领域的技术平台

公众号回复 Android 加入我的安卓技术群

作者:Jeremy_Ji
链接:https://www.jianshu.com/p/67bfd401327f
声明:本文已获
Jeremy_Ji授权发表,转发等请联系原作者授权


这上半年几家手机厂商可以堪称神仙打架,小米9,iqoo,华为,oppo,三星等等都首发Android P系统。咱也是几经考虑终于换上了新手机,也体验一下这Android9.0(原来是Android6的一台nubia)。然后迫不及待跑了一下自己写的几个app,这一跑然后就出问题了。

Android 9 wifi传输

在Android9上面连接到Pentax相机的wifi时候,但是无法传输文件,无法获取单反sd卡的缩略图等,会报如下错:

No Network Security Config specified, using platform defaultdefault

后来通过查阅官网,发现Google在Android P上面禁止了明文http传输,也就是默认的是使用https而不是http。而且官方也是给出了解决方案。可以参考官方详情,我在这里简单总结一下

1. 添加安全配置文件
首先在res/xml文件夹下创建文件network_security_config.xml文件,然后添加可以信任的域名或者ip。

            example.com    
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">example.comdomain>
    domain-config>
network-security-config>

或者添加默认可以使用明文传输。之后在AndroidMainfest.xml中application下添加下面属性

android:networkSecurityConfig="@xml/network_security_config"
  1. 降低api版本,在27或者以下都可以使用明文http传输。但是作为开发者这样是没有太大意义的。

访问自己搭建的后台

另一个项目是通过Android访问自己搭建的web服务器。同样会出现报错,通过上面的两种方法是可以解决问题的。这里还有第三种方法,那就是手动添加ssl证书

  1. spring boot配置ssl证书实现https访问
    可以使用java自带的证书生成工具来实现,首先打开cmd终端,输入命令来产生ssl证书

keytool -list -keystore server.p12

之后会提示输入不少于六位的密码,之后还需要重复输入,以及填写其他信息等。按照步骤来就行,关键就是要记住密码。spring boot中在配置文件application.properties中添加几条配置

#需吧生成的文件放在与配置文件相同目录下#server.ssl.key-store=classpath:keystore.p12#配置证书密码#server.ssl.key-store-password=111111 ##server.ssl.keyStoreType=PKCS12#可以手动指定端口,否则使用默认的8443端口#server.ssl.keyAlias:tomcat需吧生成的文件放在与配置文件相同目录下
#server.ssl.key-store=classpath:keystore.p12
#配置证书密码
#server.ssl.key-store-password=111111 
##server.ssl.keyStoreType=PKCS12
#可以手动指定端口,否则使用默认的8443端口
#server.ssl.keyAlias:tomcat

之后重启项目可以看见服务端!

Android P 网络请求相关总结_第1张图片 image.png

由于证书是自己创建的所以肯定为无效证书

Android P 网络请求相关总结_第2张图片 image.png

添加证书的信任

之后我使用java跑测试时候又报了这样的错误

avax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names present.net.ssl.SSLHandshakeExceptionjava.security.cert.CertificateExceptionNo subject alternative names present

这样是因为添加完https之后如果使用java.net或者Android进行访问的话还是需要添加信任。java应用的话需要将证书添加到支持。可以从网站下载二进制文件。首先点击上图的证书之后点击复制到文件

Android P 网络请求相关总结_第3张图片 image.png

之后点击下一步,选择der文件格式的证书。使用该命令可以导入到本地的cacerts证书库

keytool -import -alias vbooking -keystore cacerts -file ${JAVA_HOME}/jre/lib/security/vbooking.cer${JAVA_HOME}/jre/lib/security/vbooking.cer

之后不管是在本地跑java测试还是,用到java.net.HttpURLConnection本地是不会报错的。Android端的话在网络安全配置文件中res/raw/my_ca中添加刚才生成的DER格式证书。

            example.com                                
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">example.comdomain>
        <trust-anchors>
            <certificates src="@raw/my_ca"/>
        trust-anchors>
    domain-config>
network-security-config>

其中需要注意的一点就是,在Android端使用网路请求时候不能在ui主线程中使用网络请求,应该在AsyncTask中来调用,关于AsyncTask的使用之前也总结过。另外一点是需要在添加网络请求权限。

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


推荐阅读

Android 一起来看看 7.0 的新特性 FileProvider

Android 系统各个版本上https的抓包

640?wx_fmt=jpeg

程序设计的关键思维是

逻辑和实现

你可能感兴趣的:(Android P 网络请求相关总结)