Android实现快递单号查询快递状态信息

今天介绍一个自己做的快递单号查询的简单APP,供大家参考。由于需要使用http和json,本文在build.gradle(module:app)添加了okhttp3依赖和gson依赖。

dependencies {
 compile fileTree(include: ['*.jar'], dir: 'libs')
 androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
  exclude group: 'com.android.support', module: 'support-annotations'
 })
 compile 'com.android.support:appcompat-v7:24.1.1'
 testCompile 'junit:junit:4.12'
 compile 'com.squareup.okhttp3:okhttp:3.6.0'
 compile 'com.google.code.gson:gson:2.2.4'
} 

看一下布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:paddingBottom="@dimen/activity_vertical_margin"
 android:paddingLeft="@dimen/activity_horizontal_margin"
 android:paddingRight="@dimen/activity_horizontal_margin"
 android:paddingTop="@dimen/activity_vertical_margin"
 android:orientation="vertical"
 tools:context="com.yjp.deliverynoquerydemo.MainActivity"> 

 <Spinner
  android:id="@+id/delivery_company_spinner"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_margin="5dp"
  android:entries="@array/delivery_company"/> 

 <EditText
  android:id="@+id/delivery_no_edit_text"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_margin="5dp"
  android:hint="@string/please_enter_delivery_no"
  android:inputType="number"/> 

 <Button
  android:id="@+id/query_button"
  android:layout_gravity="center"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_margin="5dp"
  android:text="@string/query"/> 

 <ListView
  android:id="@+id/messages_list_view"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_margin="5dp"
  android:listSelector="@android:color/transparent"/>
</LinearLayout> 

ListView使用的item的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="match_parent"
 android:layout_height="match_parent"> 

 <TextView
  android:id="@+id/time_text_view"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:textStyle="bold"
  android:textAppearance="?android:textAppearanceMedium"
  android:typeface="monospace"/> 

 <TextView
  android:id="@+id/context_text_view"
  android:layout_width="match_parent"
  android:layout_height="50dp"
  android:textAppearance="?android:textAppearanceSmall"
  android:typeface="monospace"/> 

</LinearLayout> 

资源文件,首先是strings.xml

<resources>
 <string name="app_name">快递查询</string>
 <string name="please_enter_delivery_no">请输入快递单号</string>
 <string name="query">查询</string>
 <string name="query_url">http://www.kuaidi100.com/query</string>
</resources>

这里我们使用了快递100的接口,然后看看arrays.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
 <string-array name="delivery_company">
  <item>顺丰</item>
  <item>EMS</item>
  <item>快捷</item>
 </string-array> 

 <string-array name="delivery_company_id">
  <item>shunfeng</item>
  <item>ems</item>
  <item>kuaijiesudi</item>
 </string-array>
</resources>

只做了3个快递公司的查询,还有很多其他的支持,界面如图所示

下面看看代码,我们自定义一个Application类,主要通过资源,使用表驱动法动态构建一个快递公司中文名与请求时候的公司编码的映射表。

package com.yjp.deliverynoquerydemo.global; 

import android.app.Application; 

import com.yjp.deliverynoquerydemo.R; 

import java.util.HashMap;
import java.util.Map; 

public class MyApplication extends Application { 

 private Map<String, String> mDeliveryCompanyTable = new HashMap<>(); 

 public String getDeliveryCompanyNo(String deliveryCompanyName) throws RuntimeException { 

  if (mDeliveryCompanyTable.isEmpty()) {
   String[] names = getResources().getStringArray(R.array.delivery_company);
   String[] ids = getResources().getStringArray(R.array.delivery_company_id); 

   if (names.length != ids.length) {
    throw new RuntimeException();
   } 

   for (int i = 0; i < names.length; i++) {
    mDeliveryCompanyTable.put(names[i], ids[i]);
   }
  } 

  return mDeliveryCompanyTable.get(deliveryCompanyName);
 }
}

然后是模型,用来记录获取回来的快递状态信息

package com.yjp.deliverynoquerydemo.modal; 

import java.util.List; 

public class DeliveryMessages { 

 //派送单号
 private String nu; 

 //快递公司名称
 private String com; 

 //快递信息
 private List<Message> data; 

 //消息类
 public static class Message { 

  //时间,格式为年-月-日 时:分:秒
  private String time; 

  //详细信息内容
  private String context; 

  public String getTime() {
   return time;
  } 

  public void setTime(String time) {
   this.time = time;
  } 

  public String getContext() {
   return context;
  } 

  public void setContext(String context) {
   this.context = context;
  }
 } 

 public String getNu() {
  return nu;
 } 

 public void setNu(String nu) {
  this.nu = nu;
 } 

 public String getCom() {
  return com;
 } 

 public void setCom(String com) {
  this.com = com;
 } 

 public List<Message> getData() {
  return data;
 } 

 public void setData(List<Message> data) {
  this.data = data;
 }
}

一个用来通过http获取快递信息的工具类,这里我们使用了okHttp3和gson

package com.yjp.deliverynoquerydemo.tools; 

import com.google.gson.Gson;
import com.yjp.deliverynoquerydemo.modal.DeliveryMessages; 

import java.io.IOException;
import java.net.SocketTimeoutException;
import java.util.Map;
import java.util.concurrent.TimeUnit; 

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response; 

public class DeliveryMessageGetter { 

 //异步请求监听接口
 public interface DeliveryMessageGetterListener {
  void onSuccess(DeliveryMessages deliveryMessages);
  void onFailure(String errorStr);
 } 

 //okHttp
 private OkHttpClient mOkHttpClient = new OkHttpClient.Builder()
   .readTimeout(10, TimeUnit.SECONDS)
   .writeTimeout(10, TimeUnit.SECONDS)
   .connectTimeout(10, TimeUnit.SECONDS)
   .build(); 

 //异步GET请求
 public void getAsync(final String url,
       final Map<String, String> params,
       final DeliveryMessageGetterListener listener) { 

  //构建请求URL
  String requestString = url;
  if (!params.isEmpty()) {
   requestString += "?";
   for (Map.Entry<String, String> entry : params.entrySet()) {
    requestString += entry.getKey() + "=" + entry.getValue() + "&";
   }
   requestString = requestString.substring(0, requestString.length() - 1);
  } 

  //创建一个Request
  final Request request = new Request.Builder()
    .url(requestString)
    .build(); 

  //请求加入调度
  Call call = mOkHttpClient.newCall(request);
  call.enqueue(new Callback() {
   @Override
   public void onFailure(Call call, IOException e) {
    if(e.getCause().equals(SocketTimeoutException.class)) {
     listener.onFailure("查询超时");
    } else {
     listener.onFailure("查询失败");
    }
   } 

   @Override
   public void onResponse(Call call, Response response) throws IOException {
    String messages = response.body().string();
    Gson gson = new Gson();
    DeliveryMessages deliveryMessages = gson.fromJson(messages, DeliveryMessages.class); 

    if (deliveryMessages != null) {
     listener.onSuccess(deliveryMessages);
    } else {
     listener.onFailure("查询失败");
    }
   }
  });
 } 

}

最后是我们的MainActivity

package com.yjp.deliverynoquerydemo; 

import android.app.ProgressDialog;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Spinner;
import android.widget.Toast; 

import com.yjp.deliverynoquerydemo.global.MyApplication;
import com.yjp.deliverynoquerydemo.modal.DeliveryMessages;
import com.yjp.deliverynoquerydemo.tools.DeliveryMessageGetter; 

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; 

import static com.yjp.deliverynoquerydemo.modal.DeliveryMessages.Message; 

public class MainActivity extends AppCompatActivity implements DeliveryMessageGetter.DeliveryMessageGetterListener { 

 private List<Map<String, String>> mQueryData = new ArrayList<>();
 private SimpleAdapter mQueryAdapter; 

 private Spinner mDeliveryCompanySpinner;
 private EditText mDeliveryNoEditText; 

 private ProgressDialog mQueryWaitDialog; 

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main); 

  mDeliveryCompanySpinner = (Spinner) findViewById(R.id.delivery_company_spinner);
  mDeliveryNoEditText = (EditText) findViewById(R.id.delivery_no_edit_text);
  Button queryButton = (Button) findViewById(R.id.query_button);
  ListView messagesListView = (ListView) findViewById(R.id.messages_list_view); 

  queryButton.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) { 

    //没有输入快递单号
    if (0 == mDeliveryNoEditText.getText().length()) {
     Toast.makeText(MainActivity.this, "请输入快递单号", Toast.LENGTH_SHORT).show();
     return;
    } 

    //创建ProgressDialog对象
    mQueryWaitDialog = new ProgressDialog(MainActivity.this);
    mQueryWaitDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    mQueryWaitDialog.setMessage("正在查询...");
    mQueryWaitDialog.show(); 

    //准备请求参数
    int selectedPosition = mDeliveryCompanySpinner.getSelectedItemPosition();
    String deliveryCompanyName =
      getResources().getStringArray(R.array.delivery_company)[selectedPosition];
    Map<String, String> params = new HashMap<>();
    params.put("type",
      ((MyApplication)getApplication()).getDeliveryCompanyNo(deliveryCompanyName));
    params.put("postid", mDeliveryNoEditText.getText().toString()); 

    //清空数据
    mQueryData.clear(); 

    //发送请求
    DeliveryMessageGetter getter = new DeliveryMessageGetter();
    getter.getAsync(getResources().getString(R.string.query_url),
      params, MainActivity.this);
   }
  }); 

  mQueryAdapter = new SimpleAdapter(this,
    mQueryData,
    R.layout.query_list_item_layout,
    new String[] {"time", "context"},
    new int[] {R.id.time_text_view, R.id.context_text_view});
  messagesListView.setAdapter(mQueryAdapter);
 } 

 @Override
 public void onSuccess(DeliveryMessages deliveryMessages) {
  List<Message> messages = deliveryMessages.getData(); 

  for (Message message : messages) {
   Map<String, String> map = new HashMap<>();
   map.put("time", message.getTime());
   map.put("context", message.getContext());
   mQueryData.add(map);
  } 

  queryComplete("查询完成");
 } 

 @Override
 public void onFailure(String errorStr) {
  final String hint = errorStr;
  queryComplete("查询失败");
 } 

 private void queryComplete(final String toast) {
  MainActivity.this.runOnUiThread(new Runnable() {
   @Override
   public void run() {
    mQueryAdapter.notifyDataSetChanged();
    mQueryWaitDialog.dismiss();
    Toast.makeText(MainActivity.this, toast, Toast.LENGTH_SHORT).show();
   }
  });
 }
} 

主要是调用接口,实现功能,代码比较好理解,不再赘述。最后给出Manifest文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="com.yjp.deliverynoquerydemo"> 

 <uses-permission android:name="android.permission.INTERNET" /> 

 <application
  android:name=".global.MyApplication"
  android:allowBackup="true"
  android:icon="@mipmap/ic_launcher"
  android:label="@string/app_name"
  android:supportsRtl="true"
  android:theme="@style/AppTheme">
  <activity android:name=".MainActivity"
   android:windowSoftInputMode="stateHidden">
   <intent-filter>
    <action android:name="android.intent.action.MAIN" /> 

    <category android:name="android.intent.category.LAUNCHER" />
   </intent-filter>
  </activity>
 </application> 

</manifest>

主要是替换了默认的Application类,然后让MainActivity默认不弹出软键盘。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android快递物流信息布局开发

    本文实例为大家分享了Android快递物流信息布局展示的具体代码,供大家参考,具体内容如下 1. 思路介绍 效果图: 思路: 就一个ListView,每个item就是一条物流信息.然后每个item,分为左和右两边,左边是一个进度条的风格,右边是物流文字,适配器里面判断item,position为0 就设置为绿色,其他position就设置为灰色就行了. 2. 代码 item的布局 <?xml version="1.0" encoding="utf-8"?>

  • Android实现仿美团、顺丰快递数据加载效果

    我们都知道在Android中,常见的动画模式有两种:一种是帧动画(Frame Animation),一种是补间动画(Tween Animation).帧动画是提供了一种逐帧播放图片的动画方式,播放事先做好的图像,与gif图片原理类似,就像是在放电影一样.补间动画可以实现View组件的移动.放大.缩小以及渐变等效果. 今天我们主要来模仿一下美团中加载数据时小人奔跑动画的对话框效果,取个有趣的名字就是Running Man,奔跑吧,兄弟!话不多少,先上效果图,让各位大侠看看是不是你想要实现的效果,然

  • android实现快递跟踪进度条

    本文实例为大家分享了android快递跟踪进度条展示的具体代码,供大家参考,具体内容如下 activity.class import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.os.Bundle; import android.widget.ListView; publ

  • Android实现快递物流跟踪布局效果

    先看效果 首页Activity public class TraceActivity extends AppCompatActivity { private ListView lvTrace; private List<Trace> traceList = new ArrayList<>(10); private TraceListAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState

  • Android自定义view仿淘宝快递物流信息时间轴

    学了Android有一段时间了,一直没有时间写博客,趁着周末有点空,就把自己做的一些东西写下来. 一方面锻炼一下自己的写文档的能力,另一方面分享代码的同时也希望能与大家交流一下技术,共同学习,共同进步. 废话不多少说,我们先来看看我们自定义view要实现的效果: 效果图 自定义属性 <resources> <declare-styleable name="TimeLineView"> <attr name="timelineRadius"

  • Android实现快递物流时间轴效果

    本文实例为大家分享了Android实现快递物流时间轴效果展示的具体代码,供大家参考,具体内容如下 首先,这篇参考了别人的代码.根据自己的项目需求简单改造了一下,效果图如下 xml:代码 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:lay

  • Android实现快递单号查询快递状态信息

    今天介绍一个自己做的快递单号查询的简单APP,供大家参考.由于需要使用http和json,本文在build.gradle(module:app)添加了okhttp3依赖和gson依赖. dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group:

  • php快递单号查询接口使用示例

    通过本接口可以查询圆通快递.申通快递.ems快递.韵达快递等快递单号查询信息,无需其他额外开发,非常方便首先到www.aikuaidi.cn上注册个账号,使用key! 复制代码 代码如下: <?php/** * 查询物流信息 */define('IN_ECS', true); require(dirname(__FILE__) . '/includes/init.php'); if ($id = intval($_REQUEST['id'])) {    $sql_select = 'SELEC

  • mpvue实现微信小程序快递单号查询代码

    mpvue是什么? mpvue 是一套定位于开发小程序的前端开发框架,其核心目标是提高开发效率,增强开发体验.使用该框架,开发者只需初步了解小程序开发规范.熟悉 Vue.js 基本语法即可上手.框架提供了完整的 Vue.js 开发体验,开发者编写 Vue.js 代码,mpvue 将其解析转换为小程序并确保其正确运行.此外,框架还通过 vue-cli 工具向开发者提供 quick start 示例代码,开发者只需执行一条简单命令,即可获得可运行的项目. mpvue简介点击查看:http://mpv

  • JS模拟实现京东快递单号查询

    本文实例为大家分享了JS实现京东快递单号查询的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta h

  • JavaScript实现京东快递单号查询

    JavaScript网页制作–京东快递单号查询,供大家参考,具体内容如下 上篇讲到了京东网页的一个可能不被大多数人熟知的小功能,S键自动获得焦点,相比于那个功能,这个快递单号查询的功能可能更明了一点,虽然我也觉得很鸡肋.在网页搜索京东快递单号查询后,会出现这样的一个功能,当你在快递单号栏输入快递单号的时候,上方会出现一个较大的文本框,用较大的字体显示出你输入的快递单号.(虽然我觉得字号也没有差很多) 功能实现: 1.在输入快递单号的时候,上方出现一个盒子,这个盒子的字号更大. 2.表单检测用户输

  • 利用JavaScript模拟京东快递单号查询效果

    1.上面放大框开始是隐藏的,当输入单号后,就显示,并且里面的内容是输入框的内容的字体的放大 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="vi

  • js实现京东快递单号查询

    本文实例为大家分享了js实现京东快递单号查询的具体代码,供大家参考,具体内容如下 1.实现效果: 当文本框中输入文字时,上面有一个放大文字的框中显示文本框内容.失去焦点时,放大文字的框消失,获得焦点时,放大文字的框显示. 2.案例分析 3.代码实现 <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <meta http-e

  • javascript实现京东快递单号的查询效果

    案例:模拟京东快递单号的查询效果,供大家参考,具体内容如下 要求:当我们在文本框中输入内容时,文本框上面自动显示大字号的内容 分析: 输入内容时,上面的大盒子会自动显示出来(这里字号更大) 表单检测用户输入,给表单添加键盘事件 同时把快递单号里面的值(value)获取过来复制给大盒子作为内容 如果快递单号里面内容为空,就隐藏大盒子 当失去焦点,大盒子也隐藏 注意:keydown 和 keypress 在文本框里面的特点 : 他们两个事件触发的时候,文字还没有落入文本框中,keyup 事件触发的时

  • Python实现轻松识别数百个快递单号

    目录 前情提要 思考解决办法 遍历图片 识别条形码 小结 大家好,我是小五 这是Python改变生活系列的第三篇,也是一个与你们有关的问题案例. 前情提要 了解我的小伙伴可能都知道,小五经常给大家送书.最近一年,不算联合抽奖送书,单独我自购+出版社赞助已送出1000本书籍. 如果是自购的话,还需要自己联系快速小哥寄出书籍. 寄出后快递小哥会给我截图来反馈,然而我想要单号的时候就遇到问题了. 每次寄完书,我都只能得到n个截图(内含快递信息). 为了及时反馈大家物流信息,我需要尽快将快递单号提取出来

  • PHP查询快递信息的方法

    本文实例讲述了PHP查询快递信息的方法.分享给大家供大家参考.具体如下: 这里使用快递100物流查询 官方文档中只能返回html的接口 也可以返回json php代码如下: 复制代码 代码如下: /**  * @desc 获取快递信息  * @param string $code 快递编码  * @param string $invoice 快递单号  * @return mixed $result(       'status','info','state','data'    )  */ f

随机推荐