快递查询,快递100上有更多接口信息
1.快递查询的接口是 快递公司的code值+快递单号 进行的网络查询。第一步,怎么将快递公司的名字转换成code值,传递给接口。下面是快递公司以及对应的code值得xml文件。
<?xml version="1.0" encoding="utf-8"?> <resources> <!-- 快递公司对应代码 --> <string-array name="ems_code"> <item>yuantong</item> <item>yunda</item> <item>shentong</item> <item>shunfeng</item> <item>zhongtong</item> <item>ems</item> <item>zhaijisong</item> <item>quanfengkuaidi</item> <item>rufengda</item> </string-array> <!-- 快递公司名称 --> <string-array name="ems_company"> <item>圆通速递</item> <item>韵达快运</item> <item>申通快递</item> <item>顺丰快递</item> <item>中通速递</item> <item>EMS</item> <item>宅急送</item> <item>全峰快递</item> <item>如风达</item> </string-array> </resources>
2.解析xml文件,将获得的公司名变成code值传递给接口连接。
private String[] emsCommpany;//公司名称 private String[] emsCode; // 公司编码名称 private String mCompany_Name;// 公司名称 private String mCompany_Code;// 公司的编码:圆通快递----yuantong emsCommpany = getResources().getStringArray(R.array.ems_company); emsCode = getResources().getStringArray(R.array.ems_code); mCompany_Code = emsCode[position].toString().trim();// 公司编号 mCompany_Name = emsCommpany[position].toString().trim();// 公司名称
3.对网络进行连接,获取网络数据
/* * 请加入: 查询前的网络判断 如果手机没有接入网络提示打开网络 如果网络正常再去进行查询 查询的时候 如果getResponseResult */ public static String getResponseResult(String httpurl, String format) throws IOException { URL geturl = new URL(httpurl); HttpURLConnection connection = (HttpURLConnection) geturl .openConnection(); connection.setConnectTimeout(3000);// 连接服务器的超时时间 connection.setReadTimeout(3000);// 从服务器读取数据的超时时间 connection.connect();// 默认是GET请求 int code = connection.getResponseCode(); StringBuffer result = new StringBuffer(); if (code == 200) {// 如果连接成功 BufferedReader reader = new BufferedReader(new InputStreamReader( connection.getInputStream(), "UTF-8")); String lines; while ((lines = reader.readLine()) != null) { result.append(lines); } reader.close(); System.out.println("网络连接正常"); connection.disconnect(); } else { System.out.println("网络连接异常"); connection.disconnect(); } connection.disconnect(); return result.toString(); }
3.快递信息进行json数据解析
/** * 2 解析JSON 得到ExpressInfo对象 * * @param jsonStr * @return */ public ExpressBean parseJSON(String jsonStr) { ExpressBean express = new ExpressBean(); // 根据字符串得到JSON对象 try { JSONObject jsonObj = new JSONObject(jsonStr); // 取出快递状态 data JSONArray data = jsonObj.getJSONArray("data"); // 循环取出JSON数组中的对象 得到每一条 快递状态 StringBuffer sb = new StringBuffer(); for (int i = 0; i < data.length(); i++) { sb.append( data.getJSONObject(i).getString("time") .replace(" ", " ")) .append(":") .append(data.getJSONObject(i).getString("context") .replace(" ", " ")).append("\n"); } express.setOpt_message(sb.toString());// 把取出的快递状态赋值 String nu = jsonObj.getString("nu"); express.setPost_id(nu);// 把取出的快递单号赋值 String company = jsonObj.getString("com"); express.setCompany(company);// 把取出的快递公司赋值 System.out.println("查询到的信息:" + express.toString()); // 设置一个快递查询的默认查询结果 默认为网络连接失败 express.setRequestCode(Constants.NET_LINK_ERROR); // 3508999734 } catch (JSONException e) { System.out.println("JSON解析异常"); } return express; }
快递查询中Spinner的使用
除了常规的定义,注册绑定以外,最终要的操作就是在spinner列表中适配数据,以及重写onItemSelectedListener的监听事件
// 实例化spinner private void initSpinner() { ArrayAdapter<CharSequence> adapter = ArrayAdapter .createFromResource(this, R.array.ems_company, android.R.layout.simple_spinner_item); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); spinner.setPrompt(getResources().getString( R.string.input_express_company)); spinner.setOnItemSelectedListener(new SpinnerOnSelectedListener()); } // 创建一个内部类通过公司名字找到对应的编号 class SpinnerOnSelectedListener implements OnItemSelectedListener { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { // 根据点击的位置找到公司编码的位置 mCompany_Code = emsCode[position].toString().trim();// 公司编号 mCompany_Name = emsCommpany[position].toString().trim();// 公司名称 Log.i("Info", "ems_code:" + mCompany_Code+mCompany_Name); } /** * 没有选择的时候,默认圆通快递 */ @Override public void onNothingSelected(AdapterView<?> parent) { mCompany_Code = "yuantong"; } }