1、原因
Google表示,为保证用户数据和设备的安全,针对下一代 Android 9.0(Android P) 的应用程序,将要求默认使用加密连接,这意味着 Android P 将禁止 App 使用所有未加密的连接,因此运行 Android P 系统的安卓设备无论是接收或者发送流量,未来都不能明码传输,需要使用下一代(Transport Layer Security)传输层安全协议;
2、解决
不要使用http协议;替换为使用https协议即可;
在使用https协议的过程中,可能会报https证书不可被信任的错误;我们需要在程序中信任所有https证书;
package com.kingbright.myapplication6;
import android.util.Log;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
/**
- user
- 2023/3/10
/
public class SSLAgent {
private final static String TAG = “SSLAgent”;
private final static boolean DEBUG = true;
private static SSLAgent mSSLAgent;
public static SSLAgent getInstance(){
if(mSSLAgent == null){
mSSLAgent = new SSLAgent();
}
return mSSLAgent;
}
/*- 信任所有的https证书
- */
public void trustAllHttpsCertificates() {
try{
TrustManager[] trustAllCerts = new TrustManager[1];
TrustManager tm = new MyTrustManager();
trustAllCerts[0] = tm;
SSLContext sc = SSLContext.getInstance(“SSL”);
sc.init(null, trustAllCerts, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(mHostnameVerifier);
}catch (Exception e){
e.printStackTrace();
}
}
private HostnameVerifier mHostnameVerifier = new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
log(“hostname:” + hostname);
return true;
}
};
private static class MyTrustManager implements TrustManager, X509TrustManager {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public boolean isServerTrusted(X509Certificate[] certs) {
return true;
}
public boolean isClientTrusted(X509Certificate[] certs) {
return true;
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
return;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {
return;
}
}
private void log(String msg){
if(DEBUG){
Log.i(TAG, msg);
}
}
}
3、在使用https协议之前信任所有https证书
//信任所有https证书
SSLAgent.getInstance().trustAllHttpsCertificates();