Android APP测试可修改接口访问链接,无需重装apk

来源:互联网 发布:心理咨询知乎 编辑:程序博客网 时间:2024/05/18 23:14

APP项目开发的时候,我都是用一个全局变量来存放接口访问链接的前缀的。一般起初开发的过程都是在局域网,这个是有就是http://192.168.0.xx这种的。如果发布版本的时候就是http://www.xx.xx,然后某些时候又要改成其他网址,这样一来老是需要重新运行app生成新的apk,那怎么做到无需重装apk就可以修改网址前缀呢?

在你手机上新建一个xml配置文件,效果如下


我们可以通过编辑工具打开xml文件,对其进行修改path的路径然后进行保存、替换。然后我们写个方法每次调用接口的时候,就获取path+/.../...进行拼接。

1、PathXmlConfig.class :是xml文件的创建,写入,读取数据的配置类

/** * @author SoBan * @create 2017/6/2 14:53. */public class PathXmlConfig {    private static String filePath = Environment.getExternalStorageDirectory() + "/gpinfo/";    private static String xmlName = "facerecognition.xml";    private static String PATH = "path";    private static String IMGPATH = "imgpath";    public static class PathBean {        private String path;        private String imgpath;        public PathBean() {        }        public String getPath() {            return path;        }        public void setPath(String path) {            this.path = path;        }        public String getImgpath() {            return imgpath;        }        public void setImgpath(String imgpath) {            this.imgpath = imgpath;        }    }    /**     * 生成文件夹 gpinfo     */    public static void makeRootDirectory(String filePath) {        File file = null;        try {            file = new File(filePath);            if (!file.exists()) {                file.mkdir();            }        } catch (Exception e) {            Log.i("error:", e + "");        }    }    /**     * 生成xml     */    public static File makeFilePath(String filePath, String fileName) {        File file = null;        makeRootDirectory(filePath);        try {            file = new File(filePath + fileName);        } catch (Exception e) {            e.printStackTrace();        }        return file;    }    /**     * xml是否存在     * @return     */    public static boolean isExistsXml() {        File file = makeFilePath(filePath, xmlName);        if (file.exists()) {            return true;        }        return false;    }    /**     * 向xml写入数据     *     * @param bean     */    public static void createXML(PathBean bean) {        try {            // 获取外部存储路径,并创建文件            File file = makeFilePath(filePath, xmlName);            if (file.exists()) {                return;            }            // 创建一个文件输出流            FileOutputStream os = new FileOutputStream(file);            String enter = System.getProperty("line.separator");//换行            XmlSerializer serializer = Xml.newSerializer();            // 设置输出的编码格式            serializer.setOutput(os, "UTF-8");            // 设置文档的编码格式,这个会在xml中显示出来            serializer.startDocument("UTF-8", true);            // 添加            // 注释//            serializer.comment("comment, xml file test");            changeLine(serializer, enter);            serializer.startTag(null, PATH);            serializer.text(bean.getPath());            serializer.endTag(null, PATH);            changeLine(serializer, enter);            serializer.startTag(null, IMGPATH);            serializer.text(bean.getImgpath());            serializer.endTag(null, IMGPATH);            serializer.endDocument();        // 文档结束            serializer.flush();            os.close();                    // 关闭输出流        } catch (Exception e) {            e.printStackTrace();        }    }    /**     * tag标签换行     *     * @param serializer     * @param enter     */    public static void changeLine(XmlSerializer serializer, String enter) {        try {            serializer.text(enter);        } catch (IOException e) {            System.out.println(e.getMessage());        }    }    /**     * Pull方式,解析 XML     */    public static PathBean pullParseXML() {        File file = new File(filePath, xmlName);        PathBean bean = null;//        StringWriter xmlWriter = new StringWriter();        try {//          // 方式一:使用Android提供的实用工具类android.util.Xml//          XmlPullParser xpp = Xml.newPullParser();            // 方式二:使用工厂类XmlPullParserFactory的方式            InputStream is = new FileInputStream(file);            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();            XmlPullParser xpp = factory.newPullParser();            xpp.setInput(is, "utf-8");            StringBuffer xmlHeader = null;          // 保存xml头部            String ele = null;      // Element flag            int eventType = xpp.getEventType();            while (XmlPullParser.END_DOCUMENT != eventType) {                switch (eventType) {                    case XmlPullParser.START_DOCUMENT:                        xmlHeader = new StringBuffer();             // 初始化xmlHeader                        bean = new PathBean();                        break;                    case XmlPullParser.START_TAG:                        if (PATH.equals(xpp.getName())) {//                            eventType = xpp.next();//                            xmlHeader.append(xpp.getText());                            bean.setPath(xpp.nextText());                        } else if (IMGPATH.equals(xpp.getName())) {//                            eventType = xpp.next();//                            xmlHeader.append(xpp.getText());                            bean.setImgpath(xpp.nextText());                        }                        break;                    case XmlPullParser.TEXT:                        if (null != ele) {                            /*if("id".equals(ele)) {                                person.setId(Integer.parseInt(xpp.getText()));                            } else if("name".equals(ele)) {                                person.setName(xpp.getText());                            } else if("blog".equals(ele)) {                                person.setBlog(xpp.getText());                            }*/                        }                        break;                    case XmlPullParser.END_TAG:                        /*if("person".equals(xpp.getName())){                            personsList.add(person);                            person = null;                        }*/                        ele = null;                        break;                }                eventType = xpp.next();     // 下一个事件类型            }//            xmlWriter.append(xmlHeader);        } catch (XmlPullParserException e) {        // XmlPullParserFactory.newInstance            e.printStackTrace();        } catch (Exception e) {            e.printStackTrace();        }//        return xmlWriter.toString();        return bean;    }}

2、CommonConfig.class:调用接口是需要的公用配置类

public class CommonConfig {//是否打开本地配置链接文件(要给别人测试并支持修改path的时候是true)public static final boolean isOpenConfig = false;public static String PATH = "http://192.168.0.100/gpa/";public static String IMGPATH = "http://192.168.0.100/";/*** 这里写的url指的是,访问接口链接的后缀*/public static String getPath(boolean isIMG, String url) {if (!PathXmlConfig.isExistsXml()) {            PathXmlConfig.PathBean bean = new PathXmlConfig.PathBean();            bean.setPath(API.PATH);            bean.setImgpath(API.IMGPATH);            PathXmlConfig.createXML(bean);        }        PathXmlConfig.PathBean pathBean = PathXmlConfig.pullParseXML();    if (!url.startsWith("http://") && !url.startsWith("https://") && !TextUtils.isEmpty(url)) {        if (isIMG) {            if (!TextUtils.isEmpty(pathBean.getImgpath())) {                url = pathBean.getImgpath() + formatImageUrl(url);            } else {                url = IMGPATH + url;            }        } else {            if (!TextUtils.isEmpty(pathBean.getPath())) {                url = pathBean.getPath() + url;            } else {                url = PATH + url;            }        }    }    return url;}public static String getCommonURL(String url) {    if (isOpenConfig) {        return getPath(false, url);    }    if (!url.startsWith("http://") && !url.startsWith("https://") && !TextUtils.isEmpty(url)) {        url = PATH + url;    }    return url;}}

3、使用方式:

例如现在要调用登录的接口,链接假设:http://192.168.0.100/gpa/login
这个时候我们调用方法就是getCommonURL("login");
4、适用情况:

用这种情况最好是在测试的时候,不要发布版本的时候用,所以上面多了一个CommonConfig->isOpenConfig的配置,true是指打开xml配置,默认是false。

如果测试有这么多个地址:

http://192.168.0.100/gpa/login

http://127.22.0.100/gpa/login

http://www.baidu.com/gpa/login

不想重新安装apk,只是想改变网址前缀,可以通过这种方式配置