您的位置:首页 > 其它

利用快递100api查询快递信息

2013-12-31 00:32 246 查看
同时也分享一个火车票查询的:

接口估计不能用了,新的接口php写的,可以研究下。

http://www.widuu.com/archives/01/919.html

,欢迎吐槽。

火车余票查询源码地址(接口已经不可用):http://download.csdn.net/detail/xxm282828/6811635

快递查询源码地址:http://download.csdn.net/detail/xxm282828/6811617

获取快递信息的部分内容参考了网上的一个代码。

1、利用快递100提供的免费api查询快递相关信息。这里是解析返回来的网页。快递100需要申请key,但是个人app只提供了这个,so。。。。。。。

http://www.kuaidi100.com/openapi/mobileapi.shtml

2、我在子线程里面去获取信息,处理,然后利用handler更新Ui,

最后的结果中,用了两个List<String> 一个用于存放时间,另外一个对应,存放快递物流信息,因为考虑到在后面显示的时候,时间和内容分开(原本打算,做个界面类似于淘宝里面的效果,但后来放弃了,。有时间再做个demo。请看图方框部分:



)。

处理数据,通过将网页元素里面的<p></p>结点里面的内容拿出来,取出需要的东西就行。但是有个地方我好像随便了点,不靠谱的做法,

else if (tempStr.startsWith("建议操作")) {

					msg = new Message();
					msg.what = 10;
					mHandler.sendMessage(msg);

					return;
				}




org.jsoup.nodes.Document doc = Jsoup.parse(result);// 7409440775
Elements element = doc.body().getElementsByTag("p");
Object[] objArr = element.toArray();
Pattern p = Pattern.compile("<.+?>|\\>|\\·",
Pattern.DOTALL);

String tempStr = null;
ArrayList<String> timeList = new ArrayList<String>();// 存放快递的时间
ArrayList<String> infoList = new ArrayList<String>();// 存放快递的对应时间点的信息

for (int i = 3; i < objArr.length - 2; i++) {
Matcher m = p.matcher(objArr[i].toString());
tempStr = m.replaceAll("");
if (TextUtils.isEmpty(tempStr)) {

continue;
}else if (tempStr.startsWith("建议操作")) { msg = new Message(); msg.what = 10; mHandler.sendMessage(msg); return; }
// 2013-11-17 00:25:57 福建省泉州市石狮市公司 已收件 操作员:包叶明
timeList.add(new String(tempStr.substring(0, 19)));
infoList.add(new String(tempStr.substring(20)));
}


/**
* 子线程联网获取数据
*
* @author xiangxm
*
*/
class MyThread extends Thread {

private HashMap<String, String> threadMap = null;

public MyThread(HashMap<String, String> map) {

threadMap = new HashMap<String, String>();
this.threadMap = map;

}

@Override
public void run() {

int rand = (int) Math.random() * 1000 + 1000;
String strurl = "http://wap.kuaidi100.com/q.jsp?rand=" + rand
+ "&id=" + threadMap.get("companyId") + "&postid="
+ threadMap.get("order_num") + "&fromWeb=null";
Message msg = new Message();
msg.what = WAITTING;
mHandler.sendMessage(msg);// http://wap.kuaidi100.com/q.jsp?rand=1000&id=aae&postid=987654321&fromWeb=null String result = getData(strurl);// http://m.kuaidi100.com/index_all.html?type=yuantong&postid=7409440775 if (result.equals("")) {

msg = new Message();
msg.what = 10;
mHandler.sendMessage(msg);

return;
}

org.jsoup.nodes.Document doc = Jsoup.parse(result);// 7409440775
Elements element = doc.body().getElementsByTag("p");
Object[] objArr = element.toArray();
Pattern p = Pattern.compile("<.+?>|\\>|\\·",
Pattern.DOTALL);

String tempStr = null;
ArrayList<String> timeList = new ArrayList<String>();// 存放快递的时间
ArrayList<String> infoList = new ArrayList<String>();// 存放快递的对应时间点的信息

for (int i = 3; i < objArr.length - 2; i++) {
Matcher m = p.matcher(objArr[i].toString());
tempStr = m.replaceAll("");
if (TextUtils.isEmpty(tempStr)) {

continue;
}else if (tempStr.startsWith("建议操作")) { msg = new Message(); msg.what = 10; mHandler.sendMessage(msg); return; }
// 2013-11-17 00:25:57 福建省泉州市石狮市公司 已收件 操作员:包叶明
timeList.add(new String(tempStr.substring(0, 19)));
infoList.add(new String(tempStr.substring(20)));
}

Log.e("----------时间---------最后结果", timeList.toString());
Log.e("----------物流的详细信息---------最后结果", infoList.toString());
msg = new Message();
msg.what = FINISHED;
mHandler.sendMessage(msg);

if (timeList.isEmpty() || infoList.isEmpty()) {

msg = new Message();
msg.what = 10;
mHandler.sendMessage(msg);

return;
}

Intent intent = new Intent();
intent.setClass(MainActivity.this, PackageDetailInfoActivity.class);
intent.putStringArrayListExtra("timeList", timeList);
intent.putStringArrayListExtra("infoList", infoList);

Bundle bundle = new Bundle();
bundle.putString("companyName", infoMap.get("companyName"));// 公司名称
bundle.putString("companyId", infoMap.get("companyId"));
bundle.putString("order_num", infoMap.get("order_num"));// 运单号
intent.putExtras(bundle);
startActivity(intent);
overridePendingTransition(R.anim.push_left_in, R.anim.push_left_out);

}

}


获取数据方法:

/**
	 * 
	 * @param strurl
	 * @return
	 */
	public String getData(String strurl) {
		String output = "";
		URL url;
		try {
			url = new URL(strurl);
			InputStream is = url.openStream();

			BufferedReader buffer = new BufferedReader(new InputStreamReader(
					is, "UTF-8"));

			String tem = "";
			while ((tem = buffer.readLine()) != null) {
				output += tem;
			}
			return output;

		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return "";
	}




3、handler用于刷新Ui

private static final int WAITTING = 0;
	private static final int FINISHED = 1;
	private static final int ERROR = 2;
	private ProgressDialog progressDialog;

	private Handler mHandler = new Handler() {

		@Override
		public void handleMessage(Message msg) {

			switch (msg.what) {

			case WAITTING:
				progressDialog.show();

				break;
			case ERROR:
				if (progressDialog != null && progressDialog.isShowing()) {
					progressDialog.dismiss();

				}
				break;
			case FINISHED:
				if (progressDialog != null && progressDialog.isShowing()) {
					progressDialog.dismiss();

				}

				Common.closeKeyboardCommAct(MainActivity.this);// 关闭键盘
				break;

			case 10:
				if (progressDialog != null && progressDialog.isShowing()) {
					progressDialog.dismiss();

				}
				Toast.makeText(MainActivity.this, "未获取到相关信息,请验证查询条件!",
						Toast.LENGTH_SHORT).show();
				break;
			}

			super.handleMessage(msg);
		}

	};


4、整个画面代码:MainActivity.java 包含:

检查网络,离线使用时候,提醒.....
选择快递公司,输入订单号,否则提醒,动画效果抖动文本框.....
利用正则表达式检查输入的单据号是否符合标准,主要是放置输入汉字等字符。因为各个快递公司,单据号包含的不一样,有的有字母有的没有。
再按一次退出程序

long waitTime = 2000;
	long touchTime = 0;

	@Override
	public void onBackPressed() {
		long currentTime = System.currentTimeMillis();
		if ((currentTime - touchTime) >= waitTime) {
			Toast.makeText(this, "再按一次退出", Toast.LENGTH_SHORT).show();
			touchTime = currentTime;
		} else {
			finish();
		}
	}


package com.xiangxm.checkpackage;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.jsoup.Jsoup;
import org.jsoup.select.Elements;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.Window;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.xiangxm.cls.cls_companyinfo;
import com.xiangxm.cls.cls_savehistory;
import com.xiangxm.myapp.MyApplication;
import com.xiangxm.utils.Common;

public class MainActivity extends Activity implements
android.view.View.OnClickListener {

private LinearLayout selectCompanyLayout;
private Button searchBtn;
private Button historyBtn;
private EditText order_numTxt;
private TextView companynameTxt;
private TextView helpinfotext;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setUiOptions(
ActivityInfo.UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW);
setContentView(R.layout.activity_main);

myApplication = MyApplication.getInstance();
initView();
Common.closeWhenOncreate(MainActivity.this);// 进入界面关闭软键盘

}

/**
* 初始化界面
*/
public void initView() {

title = (TextView) findViewById(R.id.title);
phonenumber = (TextView) findViewById(R.id.phonenumbertxt);
helpinfotext = (TextView) findViewById(R.id.helpinfotext);
companynameTxt = (TextView) findViewById(R.id.companynametxt);
companynameTxt.setText("");
selectCompanyLayout = (LinearLayout) findViewById(R.id.companyname_layout);
searchBtn = (Button) findViewById(R.id.searchbtn);
historyBtn = (Button) findViewById(R.id.historybtn);
order_numTxt = (EditText) findViewById(R.id.order_numtxt);

selectCompanyLayout.setOnClickListener(this);
searchBtn.setOnClickListener(this);
historyBtn.setOnClickListener(this);

progressDialog = new ProgressDialog(this);
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.setMessage("正在为您查询...");
progressDialog.setCancelable(true);
progressDialog.setTitle("提示信息");

changeBtnBackground();
if (!Common.hasShortcut(this)) { // 创建快捷方式
Common.addShortcut(this);
}

if (!Common.onlineFlag(MainActivity.this)) {

Toast.makeText(this, "离线使用中,非联网状态不能查询订单信息!", Toast.LENGTH_SHORT)
.show();

}
}

private MyApplication myApplication;

@Override
public void onClick(View v) {
// TODO Auto-generated method stub

Intent intent = null;
if (v.getId() == R.id.searchbtn) {

if (TextUtils.isEmpty(companynameTxt.getText())) {

Animation shakeAnim = AnimationUtils.loadAnimation(
MainActivity.this, R.anim.shake_x);
this.companynameTxt.startAnimation(shakeAnim);

Toast.makeText(MainActivity.this, "您还未选择快递公司!",
Toast.LENGTH_SHORT).show();
return;
} else if (TextUtils.isEmpty(order_numTxt.getText())) {

Animation shakeAnim = AnimationUtils.loadAnimation(
MainActivity.this, R.anim.shake_x);
this.order_numTxt.startAnimation(shakeAnim);

Toast.makeText(MainActivity.this, "您还未输入订单号!",
Toast.LENGTH_SHORT).show();
return;
}
String order_num = order_numTxt.getText().toString().trim();
Pattern p = Pattern.compile("[\\da-zA-Z]+?");
Matcher m = p.matcher(order_num);
if (!m.matches()) {
Toast.makeText(MainActivity.this, "您的订单号不符合标准,请检查!",
Toast.LENGTH_SHORT).show();
return;
}

infoMap.put("order_num", order_num);
infoMap.put("mark", "");// 备注信息暂时存为空

new MyThread(infoMap).start();

} else if (v.getId() == R.id.companyname_layout) {

intent = new Intent();
intent.setClass(MainActivity.this, SelectCompanyActivity.class);
startActivityForResult(intent, 6);
overridePendingTransition(R.anim.push_left_in, R.anim.push_left_out);
} else if (v.getId() == R.id.historybtn) {

boolean bol = cls_savehistory.checkHasDataOrNot(Common.dbh);
if (bol) {
// 可伸缩的listview
intent = new Intent();
intent.setClass(MainActivity.this,
CheckPackageHisActivity.class);
overridePendingTransition(R.anim.slide_left, R.anim.slide_right);
startActivity(intent);
} else {

Toast.makeText(MainActivity.this, "暂无历史记录!", Toast.LENGTH_SHORT)
.show();
}

}

}

HashMap<String, String> infoMap = new HashMap<String, String>();

// @Override
// public boolean onCreateOptionsMenu(Menu menu) {
// // MenuItem item = menu.add(0, SETTINGS_ID, 0, "settings");
// // item.setIcon(R.drawable.ic_setting);
// // item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
// // return true;
// MenuInflater inflater = getMenuInflater();
// inflater.inflate(R.menu.activity_main, menu);
//
// return super.onCreateOptionsMenu(menu);
// }

// @Override
// public boolean onOptionsItemSelected(MenuItem item) {// 处理点击事件 最下面
// switch (item.getItemId()) {
// /*
// * case R.id.menu_settings: startActivity(new Intent(this,
// * SettingActivity.class)); break;
// */
//
// case R.id.menu_delete:
//
// new AlertDialog.Builder(this).setTitle("Action Menu Item")
// .setPositiveButton("确认", null)
// .setNegativeButton("取消", null).show();
//
// break;
// default:
// break;
// }
//
// return super.onOptionsItemSelected(item);
// }

/**
* 修改按钮背景图片
*/
public void changeBtnBackground() {

class MyBtnOnTouch implements OnTouchListener {

int drawable[] = null;

@Override
public boolean onTouch(View v, MotionEvent event) {

if (v.getId() == R.id.searchbtn) {
drawable = new int[] { R.drawable.searchbtn,
R.drawable.searchbtn_pressed };

} else if (v.getId() == R.id.historybtn) {

drawable = new int[] { R.drawable.history_btn_normal,
R.drawable.history_btn_pressed };

}

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:

v.setBackgroundResource(drawable[1]);

break;
case MotionEvent.ACTION_UP:
v.setBackgroundResource(drawable[0]);
break;
}

return false;
}

}

searchBtn.setOnTouchListener(new MyBtnOnTouch());
historyBtn.setOnTouchListener(new MyBtnOnTouch());
}

private static final int WAITTING = 0; private static final int FINISHED = 1; private static final int ERROR = 2; private ProgressDialog progressDialog; private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case WAITTING: progressDialog.show(); break; case ERROR: if (progressDialog != null && progressDialog.isShowing()) { progressDialog.dismiss(); } break; case FINISHED: if (progressDialog != null && progressDialog.isShowing()) { progressDialog.dismiss(); } Common.closeKeyboardCommAct(MainActivity.this);// 关闭键盘 break; case 10: if (progressDialog != null && progressDialog.isShowing()) { progressDialog.dismiss(); } Toast.makeText(MainActivity.this, "未获取到相关信息,请验证查询条件!", Toast.LENGTH_SHORT).show(); break; } super.handleMessage(msg); } };

/**
* 用于存放结果的map key:timeList value: infoList
* **/
private HashMap<List<String>, List<String>> resultMap = new HashMap<List<String>, List<String>>();

/**
* 子线程联网获取数据
*
* @author xiangxm
*
*/
class MyThread extends Thread {

private HashMap<String, String> threadMap = null;

public MyThread(HashMap<String, String> map) {

threadMap = new HashMap<String, String>();
this.threadMap = map;

}

@Override
public void run() {

int rand = (int) Math.random() * 1000 + 1000;
String strurl = "http://wap.kuaidi100.com/q.jsp?rand=" + rand
+ "&id=" + threadMap.get("companyId") + "&postid="
+ threadMap.get("order_num") + "&fromWeb=null";
Message msg = new Message();
msg.what = WAITTING;
mHandler.sendMessage(msg);// http://wap.kuaidi100.com/q.jsp?rand=1000&id=aae&postid=987654321&fromWeb=null String result = getData(strurl);// http://m.kuaidi100.com/index_all.html?type=yuantong&postid=7409440775 if (result.equals("")) {

msg = new Message();
msg.what = 10;
mHandler.sendMessage(msg);

return;
}

org.jsoup.nodes.Document doc = Jsoup.parse(result);// 7409440775
Elements element = doc.body().getElementsByTag("p");
Object[] objArr = element.toArray();
Pattern p = Pattern.compile("<.+?>|\\>|\\·",
Pattern.DOTALL);

String tempStr = null;
ArrayList<String> timeList = new ArrayList<String>();// 存放快递的时间
ArrayList<String> infoList = new ArrayList<String>();// 存放快递的对应时间点的信息

for (int i = 3; i < objArr.length - 2; i++) {
Matcher m = p.matcher(objArr[i].toString());
tempStr = m.replaceAll("");
if (TextUtils.isEmpty(tempStr)) {

continue;
}else if (tempStr.startsWith("建议操作")) { msg = new Message(); msg.what = 10; mHandler.sendMessage(msg); return; }
// 2013-11-17 00:25:57 福建省泉州市石狮市公司 已收件 操作员:包叶明
timeList.add(new String(tempStr.substring(0, 19)));
infoList.add(new String(tempStr.substring(20)));
}

Log.e("----------时间---------最后结果", timeList.toString());
Log.e("----------物流的详细信息---------最后结果", infoList.toString());
msg = new Message();
msg.what = FINISHED;
mHandler.sendMessage(msg);

if (timeList.isEmpty() || infoList.isEmpty()) {

msg = new Message();
msg.what = 10;
mHandler.sendMessage(msg);

return;
}

Intent intent = new Intent();
intent.setClass(MainActivity.this, PackageDetailInfoActivity.class);
intent.putStringArrayListExtra("timeList", timeList);
intent.putStringArrayListExtra("infoList", infoList);

Bundle bundle = new Bundle();
bundle.putString("companyName", infoMap.get("companyName"));// 公司名称
bundle.putString("companyId", infoMap.get("companyId"));
bundle.putString("order_num", infoMap.get("order_num"));// 运单号
intent.putExtras(bundle);
startActivity(intent);
overridePendingTransition(R.anim.push_left_in, R.anim.push_left_out);

}

}

/** * * @param strurl * @return */ public String getData(String strurl) { String output = ""; URL url; try { url = new URL(strurl); InputStream is = url.openStream(); BufferedReader buffer = new BufferedReader(new InputStreamReader( is, "UTF-8")); String tem = ""; while ((tem = buffer.readLine()) != null) { output += tem; } return output; } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return ""; }

// 点击空白处 软键盘消失

@Override
public boolean onTouchEvent(MotionEvent event) {
InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
if (imm != null && imm.isActive()) {
return imm.hideSoftInputFromWindow(this.getCurrentFocus()
.getWindowToken(), 0);
}
return false;

}

long waitTime = 2000; long touchTime = 0; @Override public void onBackPressed() { long currentTime = System.currentTimeMillis(); if ((currentTime - touchTime) >= waitTime) { Toast.makeText(this, "再按一次退出", Toast.LENGTH_SHORT).show(); touchTime = currentTime; } else { finish(); } }

private TextView title;
private TextView phonenumber;

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub

if (resultCode == 8 && requestCode == 6) {

Bundle bundle = data.getExtras();
if (bundle == null) {

Toast.makeText(MainActivity.this, "获取数据失败!", Toast.LENGTH_SHORT)
.show();
return;
}
infoMap = new HashMap<String, String>();
String name = bundle.getString("companyName");
String str = bundle.getString("companyId");
String id = TextUtils.isEmpty(str) ? "" : str;
infoMap.put("companyName", name);
infoMap.put("companyId", id);

List<String> resultList = cls_companyinfo.getCompanyName(
Common.dbh, id);

if (resultList.get(0).equals("")) {

helpinfotext.setVisibility(View.GONE);
title.setVisibility(View.GONE);
title.setText("");
} else {
title.setText("温馨提示:");
helpinfotext.setText("查询须知:" + resultList.get(0));
}
if (resultList.get(1).equals("")) {
phonenumber.setVisibility(View.GONE);
title.setVisibility(View.GONE);
title.setText("");
} else {
title.setText("温馨提示:");
phonenumber.setText("查询电话:" + resultList.get(1));
}

companynameTxt.setText(TextUtils.isEmpty(name) ? "" : name);

}

super.onActivityResult(requestCode, resultCode, data);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: