這上半年幾家手機(jī)廠商可以堪稱神仙打架茉稠,小米9,iqoo卿吐,華為旁舰,oppo,三星等等都首發(fā)Android P系統(tǒng)但两。咱也是幾經(jīng)考慮終于換上了新手機(jī)鬓梅,也體驗(yàn)一下這Android9.0(原來是Android6的一臺(tái)nubia)。然后迫不及待跑了一下自己寫的幾個(gè)app谨湘,這一跑然后就出問題了绽快。
Android 9 wifi傳輸
在Android9上面連接到Pentax相機(jī)的wifi時(shí)候,但是無法傳輸文件紧阔,無法獲取單反sd卡的縮略圖等坊罢,會(huì)報(bào)如下錯(cuò):
No Network Security Config specified, using platform default
后來通過查閱官網(wǎng),發(fā)現(xiàn)Google在Android P上面禁止了明文http傳輸擅耽,也就是默認(rèn)的是使用https而不是http活孩。而且官方也是給出了解決方案」猿穑可以參考官方詳情憾儒,我在這里簡單總結(jié)一下
- 添加安全配置文件
首先在res/xml文件夾下創(chuàng)建文件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>
或者添加<base-config cleartextTrafficPermitted = "true" />默認(rèn)可以使用明文傳輸。之后在AndroidMainfest.xml中application下添加下面屬性
android:networkSecurityConfig="@xml/network_security_config"
- 降低api版本起趾,在27或者以下都可以使用明文http傳輸诗舰。但是作為開發(fā)者這樣是沒有太大意義的。
訪問自己搭建的后臺(tái)
另一個(gè)項(xiàng)目是通過Android訪問自己搭建的web服務(wù)器训裆。同樣會(huì)出現(xiàn)報(bào)錯(cuò)眶根,通過上面的兩種方法是可以解決問題的。這里還有第三種方法边琉,那就是手動(dòng)添加ssl證書
- spring boot配置ssl證書實(shí)現(xiàn)https訪問
可以使用java自帶的證書生成工具來實(shí)現(xiàn)属百,首先打開cmd終端,輸入命令來產(chǎn)生ssl證書
keytool -list -keystore server.p12
之后會(huì)提示輸入不少于六位的密碼变姨,之后還需要重復(fù)輸入族扰,以及填寫其他信息等。按照步驟來就行钳恕,關(guān)鍵就是要記住密碼别伏。spring boot中在配置文件application.properties中添加幾條配置
#需吧生成的文件放在與配置文件相同目錄下
#server.ssl.key-store=classpath:keystore.p12
#配置證書密碼
#server.ssl.key-store-password=111111
##server.ssl.keyStoreType=PKCS12
#可以手動(dòng)指定端口,否則使用默認(rèn)的8443端口
#server.ssl.keyAlias:tomcat
之后重啟項(xiàng)目可以看見服務(wù)端!
由于證書是自己創(chuàng)建的所以肯定為無效證書
添加證書的信任
之后我使用java跑測試時(shí)候又報(bào)了這樣的錯(cuò)誤
avax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names present
這樣是因?yàn)樘砑油阧ttps之后如果使用java.net或者Android進(jìn)行訪問的話還是需要添加信任忧额。java應(yīng)用的話需要將證書添加到支持厘肮。可以從網(wǎng)站下載二進(jìn)制文件睦番。首先點(diǎn)擊上圖的證書之后點(diǎn)擊復(fù)制到文件
之后點(diǎn)擊下一步类茂,選擇der文件格式的證書。使用該命令可以導(dǎo)入到本地的cacerts證書庫
keytool -import -alias vbooking -keystore cacerts -file ${JAVA_HOME}/jre/lib/security/vbooking.cer
之后不管是在本地跑java測試還是托嚣,用到j(luò)ava.net.HttpURLConnection本地是不會(huì)報(bào)錯(cuò)的巩检。Android端的話在網(wǎng)絡(luò)安全配置文件中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>
其中需要注意的一點(diǎn)就是示启,在Android端使用網(wǎng)路請求時(shí)候不能在ui主線程中使用網(wǎng)絡(luò)請求兢哭,應(yīng)該在AsyncTask中來調(diào)用,關(guān)于AsyncTask的使用之前也總結(jié)過夫嗓。另外一點(diǎn)是需要在添加網(wǎng)絡(luò)請求權(quán)限迟螺。
<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" />