错误 :Cleartext HTTP traffic to xxx not permitted
出现原因 :在Android P系统(Android API >= 28)的设备上,如果应用使用的是非加密的明文流量的http网络请求,则会导致该应用无法进行网络请求,https则不会受影响,同样地,如果应用嵌套了webview,webview也只能使用https请求。
以下两者解决方式是从APP触发的,不过最好还是web端配置好受信任的证书
解决方式1 : 采用Android OKHttp进行https访问(限制 : Android8.0以上)
①.在build.gradle添加
implementation "com.squareup.okhttp3:okhttp:3.10.0"
等待下载完成
②.进行Post异步请求
public void postDataWithParame(String uri) {
String[] t = uri.split("%");
key = t[0];
uri = t[1];
OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。
FormBody.Builder formBody = new FormBody.Builder();//创建表单请求体
formBody.add("username", "zhangsan");//传递键值对参数
Request request = new Request.Builder()//创建Request 对象。
.url(uri)
.post(formBody.build())//传递请求体
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d("kwwl", "获取数据失败");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
// Log.d("kwwl", "获取数据成功了:"+response.body().string());
//calldata.setText("获取数据为:" + response.body().string());
final String data = response.body().string();
mainHandler.post(new Runnable() {
@Override public void run() {
//已在主线程中,可以更新UI
UnityPlayer.UnitySendMessage("ScriptHolder","RequestBack",key +"%"+ data);
}
});
}
});//回调方法的使用与get异步请求相同,此时略。
}
请注意由于需求,我在传进来的地址前增加了key
③.打包成aar包及依赖包放入unity
调用如下 :
public void HttpsRequest(string key, string uri, WebRequestTextEvent webRequestGetEvent)
{
if (KeyToWebEvent.ContainsKey(key))
{
KeyToWebEvent[key] = webRequestGetEvent;
}
else
KeyToWebEvent.Add(key, webRequestGetEvent);
#if UNITY_ANDROID && !UNITY_EDITOR
jo.Call("postDataWithParame", key + "%" + uri);
#endif
}
unity与Android相互调用可参考这里:Unity功能记录(五)------ Android studio打包aar包后与unity互相通信
解决方式2 : AndroidManifest.xml文件中增加支持明文请求(但是在某些设备上使用WiFi还是会出现无法请求的问题)
android:usesCleartextTraffic="true"
参考列表 :
Cleartext HTTP traffic to xxx not permitted解决办法
Android高版本联网失败报错:Cleartext HTTP traffic to xxx not permitted解决方法