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。

<?xml version="1.0" encoding="utf-8"?><network-security-config>    <domain-config>        <domain includeSubdomains="true">example.com</domain>    </domain-config></network-security-config><network-security-config>    <domain-config>        <domain includeSubdomains="true">example.com</domain>    </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

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

image.png

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

image.png

添加证书的信任

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

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

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

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格式证书。

<?xml version="1.0" encoding="utf-8"?><network-security-config>    <domain-config>        <domain includeSubdomains="true">example.com</domain>        <trust-anchors>            <certificates src="@raw/my_ca"/>        </trust-anchors>    </domain-config></network-security-config><network-security-config>    <domain-config>        <domain includeSubdomains="true">example.com</domain>        <trust-anchors>            <certificates src="@raw/my_ca"/>        </trust-anchors>    </domain-config></network-security-config>

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

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

推荐阅读

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

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

程序设计的关键思维是

逻辑和实现

Android P 网络请求相关总结相关推荐

  1. http请求过程 Android,android HTTP网络请求回顾

    1.HTTP协议了解 http是一种应用层的协议,底层通过TCP来进行可靠的数据传输.HTTP是基于TCP的应用层协议,它在更高的层次封装了TCP的使用细节,使网络请求更加易用,TCP连接是因特网基于 ...

  2. Android okHttp网络请求之缓存控制Cache-Control

    前言: 前面的学习基本上已经可以完成开发需求了,但是在项目中有时会遇到对请求做个缓存,当没网络的时候优先加载本地缓存,基于这个需求我们来学习一直okHttp的Cache-Control. okHttp ...

  3. android之网络请求 -- 获取RecyclerView的列表项(图片 + 文字)

    android之网络请求 -- 获取RecyclerView的列表项 示意图,网络请求的地址,插件及依赖 代码架构 代码内容 MainActivity.java activity_main.xml R ...

  4. 【小王的安卓之路】Android原生网络请求

    Android原生网络请求 一. 网络请求的必要性 二. 网络请求分类 三. 网络请求实现方法 四. 注意事项 一.网络请求的必要性: 如今单机APP早已经接近消失就连最简单的时钟日期等软件都需要去请 ...

  5. 『Android』网络请求数据与JSON解析

    『Android』网络请求数据与JSON解析

  6. 利用Fiddler对Android手机网络请求进行抓包

    在Android的开发调试过程中,特别是针对网络编程的情况,很多时候我们希望能够对Android的网络请求进行抓包,用来定位以及分析我们程序的问题.下面我介绍使用Fiddler对Android模拟器的 ...

  7. fiddler 只监听模拟器_利用Fiddler对Android模拟器网络请求进行抓包【转】

    在Android的开发调试过程中,特别是针对网络编程的情况,很多时候我们希望能够对Android的网络请求进行抓包,用来定位以及分析我们程序的问题.下面我介绍使用Fiddler对Android模拟器的 ...

  8. android okgo 网络请求框架

    OkGo - OkHttpUtils-2.0.0升级后改名 OkGo,全新完美支持RxJava 项目地址:https://github.com/jeasonlzy,欢迎star,欢迎issue 该库是 ...

  9. android封装网络请求界面,轻松搞定 android MVP 架构、okHttp 网络模块封装 的 项目...

    CommonMvp commonMvp 能做什么? 1.mvp 实现 model view presenter 业务和界面解耦 2.整合 网络 请求 3.简化网络调用流程 4.整合状态栏和标题栏 实现 ...

  10. android自定义网络请求框架,安卓快速开发框架(十九)XBaseAndroid Http网络请求

    网络请求 XBaseAndroid网络请求内置模块是采用hongyangAndroid的工具类二次开发. 目前对应okhttp版本3.3.1. 用法 目前对以下需求进行了封装 一般的get请求 一般的 ...

最新文章

  1. UA OPTI512R 傅立叶光学导论7 线性平移不变系统简介
  2. mybatis默认的数据源连接池(PooledDataSource和UnPooledDataSource)
  3. 无重复字符的最长子串—leetcode3
  4. 理解C++中拷贝构造函数
  5. 一份清华大佬的代码模版,简洁易懂!
  6. 2017-06-23
  7. 修改oracle数据库的编码为utf-8
  8. mysql workbench uml_Ubuntu 16.04下UML建模PowerDesigner的替代ERMaster和MySQL Workbench
  9. 跨平台的移动Web应用开发平台 PhoneGap 1.6 发布
  10. 【转】IE内嵌google chrome frame解决浏览器兼容问题
  11. 行情数据接口-美股版
  12. Linux安装pyaudio
  13. WAP1 X/WAP2 0以及WAP浏览器的协议版本
  14. vue使用lodop打印控件实现浏览器兼容打印
  15. 计算机网络(5.13)运输层- TCP的拥塞控制方法
  16. 支付宝网关支付模式详细解答
  17. yzy的欢乐膜你赛后,一份迟来的个人(蒟蒻)思路解析
  18. 基于ssm整合的网上书城
  19. 宏碁公司再次遭遇入侵,160GB敏感数据泄露
  20. KSO - docker部署Rabbitmq的详细讲解以及各种隐藏坑

热门文章

  1. 淘宝优惠券(高省)那些套路,我已经看穿了
  2. Win10怎么设置不进入屏保也不关闭显示器
  3. rabbitMq入门
  4. openGL中的抗锯齿实现
  5. 深入浅出HashMap
  6. php简单匿名聊天室
  7. Linux Cannot assign requested address
  8. 济南市全国计算机二级,济南市2020年3月计算机二级报名时间|网上报名入口【12月20日9:00开通】...
  9. excel多个工作表汇总怎么做?
  10. 储存卡数据怎么恢复?恢复靠它