安卓原生在4.4.4版本通过域名访问服务器被拒绝
解决方案:
使用OkHttp进行服务器的访问,安卓4.4.4不支持OKhttp,在安卓5.1版本以后开始支持,所以要自己集成jar包,在项目libs目录下加入jar包。
写OKhttp工具类
package com.saicmotor.xyxshreturn.utils;
import android.annotation.SuppressLint;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import java.io.IOException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.concurrent.TimeUnit;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.X509TrustManager;
import org.json.JSONObject;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Request.Builder;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.ResponseBody;
public class OkHttpUtils {
@SuppressLint("TrulyRandom")
private static OkHttpClient getClient() {
try{
OkHttpClient.Builder builder = new OkHttpClient.Builder()
.connectTimeout(20 * 1000, TimeUnit.MILLISECONDS)
.readTimeout(20 * 1000, TimeUnit.MILLISECONDS);
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, null, null);
SSLSocketFactory socketFactory = new Tls12SocketFactory(sslContext.getSocketFactory());
builder.sslSocketFactory(socketFactory, new X509TrustManager() {
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[]{};
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
});
return builder.build();
}catch(Exception e) {
e.printStackTrace();
}
return null;
}
public static String get(String url) {
return get(url, new JSONObject());
}
// get请求
public static String get(String url, JSONObject params) {
OkHttpClient okHttpClient = OkHttpUtils.getClient();
Builder builder = new Request.Builder();
// 添加请求Header
if(UserUtil.getUser().token !=null){
builder.addHeader("token", UserUtil.getUser().token);
}
Request request = builder.url(url).get().build();
Call call = okHttpClient.newCall(request);
try {
Response response = call.execute();
if (response.isSuccessful()) {
ResponseBody body = response.body();
if (body != null) {
return body.string();
}
} else {
return String.valueOf(response.code());
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public static String post(String url, String json) {
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), json);
return post(url, requestBody);
}
// post请求
public static String post(String url, RequestBody formBody) {
OkHttpClient okHttpClient = OkHttpUtils.getClient();
Builder builder = new Request.Builder();
if(UserUtil.getUser().token !=null){
builder.addHeader("token", UserUtil.getUser().token);
}
Request request = builder.url(url).post(formBody).build();
Call call = okHttpClient.newCall(request);
try {
Response response = call.execute();
if (response.isSuccessful()) {
ResponseBody body = response.body();
if (body != null) {
String str = body.string();
return str;
}
} else {
return String.valueOf(response.code());
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
// 服务器返回图片
public static void getBitmap(String url, final Handler handler, final int what) {
asynGet(url, "bitmap", handler, what);
}
public static void asynGet(String url, final String respType, final Handler handler, final int what) {
OkHttpClient okHttpClient = OkHttpUtils.getClient();
Request request = new Request.Builder().url(url).get().build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d("lc", "请求失败: " + e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Message message = handler.obtainMessage();
if("bitmap".equals(respType)) {
byte[] bytes = response.body().bytes();
message.obj = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
} else {
message.obj = response.body().string();
}
message.what = what;
handler.sendMessage(message);
}
});
}
}
这里注意报文返回格式是String,具体格式自己定