Android使用Okhttp3报错java.net.UnknownServiceException

今天使用OkHttp库开发安卓网络编程这一块。

然后,先尝试一个简单的获取服务器XML数据,然后进行解析,代码如下:

private void requestXml(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                try{
                    OkHttpClient client = new OkHttpClient();
                    Request request = new Request.Builder()
                            .url("http://url/android/get_data.xml").build();

                    Response response = client.newCall(request).execute();
                    String responseData = response.body().string();
                    parseXml(responseData);

                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }).start();
    }

    private void parseXml(String xmlData){
        try{
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            XmlPullParser xmlPullParser = factory.newPullParser();
            xmlPullParser.setInput(new StringReader(xmlData));
            int eventType = xmlPullParser.getEventType();
            String id = "";
            String name = "";
            String version = "";
            while(eventType != XmlPullParser.END_DOCUMENT){
                String nodeName = xmlPullParser.getName();
                switch (eventType){
                    //开始解析节点
                    case XmlPullParser.START_TAG:{

                        if("id".equals(nodeName)){
                            id= xmlPullParser.nextText();
                        }else if("name".equals(nodeName)){
                            name = xmlPullParser.nextText();
                        }else if("version".equals(nodeName)){
                            version = xmlPullParser.nextText();
                        }
                        break;
                    }
                    //完成解析某个节点
                    case XmlPullParser.END_TAG:{
                        if("app".equals(nodeName)){
                            Log.d(TAG, "id is"+id);
                            Log.d(TAG, "name is"+name);
                            Log.d(TAG, "version is"+version);
                        }
                        break;
                    }
                    default:
                        break;
                }

                eventType = xmlPullParser.next();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

本来以为应该很轻松就能成功,可是,当我开始运行的时候,OkHttp总是会报一个错误,如下:

W/System.err: java.net.UnknownServiceException: CLEARTEXT communication to 10.128.249.120 not permitted by network security policy

这个错误,我在网上查到这个主要是由于,我们的OkHttp3会默认使用密文传输,而我们的代码中使用Http协议,也就是使用明文传输,所以OkHttp3会主动的报错,然后阻止线程的运行。所以我们现在就是要修改配置文件,使OkHttp3允许使用明文传输,或者我们直接使用Https协议。

下面,我就如何允许使用明文传输,说明一下方法:

1:在 res 下新建一个 xml 目录,然后创建一个名为:network_security_config.xml 文件 ,该文件内容如下:

<?xml version="1.0" encoding="utf-8"?>

<network-security-config>

    <base-config cleartextTrafficPermitted="true" />

</network-security-config>
然后在 AndroidManifest.xml application 标签内应用上面的xml配置:
<application

    android:name=".App"

    android:icon="@mipmap/ic_launcher"

    android:label="@string/app_name"

    android:networkSecurityConfig="@xml/network_security_config"

    android:roundIcon="@mipmap/ic_launcher_round"

    android:theme="@style/AppTheme">
</application>

2:服务器和本地应用都改用 https (推荐)

3:targetSdkVersion 降级回到 27

 

猜你喜欢

转载自blog.csdn.net/AlexYoung28/article/details/82728946