1. 程式人生 > >通過呼叫第三方API,查詢身份證資訊

通過呼叫第三方API,查詢身份證資訊



//介面XML檔案


<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="wrap_content"
    android:layout_marginTop="30dp"
    android:orientation="vertical"
    android:padding="10dp"
    tools:context="com.imooc.searchforid.MainActivity" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:maxLines="1"
            android:text="@string/IDnum"
            android:textSize="20sp" />

        <EditText
            android:id="@+id/edt_IDnum"
            android:layout_width="match_parent"
            android:layout_height="45dp"
            android:singleLine="true"
            android:background="@drawable/white_bg"
            android:gravity="center_vertical"
            android:hint="@string/tips"
            android:maxLines="1" />
    </LinearLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/btn_search"
            android:layout_width="100dp"
            android:layout_height="50dp"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:layout_marginLeft="30dp"
            android:background="@drawable/orange_selector"
            android:text="@string/btn_search"
            android:textSize="25sp" />

        <Button
            android:id="@+id/btn_clear"
            android:layout_width="100dp"
            android:layout_height="50dp"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:layout_marginRight="30dp"
            android:background="@drawable/orange_selector"
            android:text="@string/btn_clear"
            android:textColor="#ff0000"
            android:textSize="25sp" />
    </RelativeLayout>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="5dp"
        android:layout_marginTop="20dp"
        android:background="@color/black" />

    <TextView
        android:id="@+id/show_sex"
        android:layout_width="match_parent"
        android:layout_height="35dp"
        android:background="@color/gray"
        android:gravity="bottom"
        android:textColor="@color/orange"
        android:textSize="22sp" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="5dp"
        android:background="@color/black" />

    <TextView
        android:id="@+id/show_birthday"
        android:layout_width="match_parent"
        android:layout_height="35dp"
        android:background="@color/gray"
        android:gravity="bottom"
        android:textColor="@color/orange"
        android:textSize="22sp" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="5dp"
        android:background="@color/black" />

    <TextView
        android:id="@+id/show_address"
        android:layout_width="match_parent"
        android:layout_height="35dp"
        android:background="@color/gray"
        android:gravity="bottom"
        android:textColor="@color/orange"
        android:textSize="22sp" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="5dp"
        android:background="@color/black" />

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="20dp" >

        <ProgressBar
            android:id="@+id/progressBar1"
            style="?android:attr/progressBarStyleLarge"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:visibility="gone" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="180dp"
            android:ellipsize="marquee"
            android:marqueeRepeatLimit="marquee_forever"
            android:focusable="true"
            android:focusableInTouchMode="true"
            android:maxLines="1"
            android:scrollHorizontally="true"
            android:singleLine="true"
            android:text="@string/authorInfo"
            android:textColor="@color/sivler"
            android:textSize="17sp" />
    </RelativeLayout>

</LinearLayout>


  效果圖

//MainActivity

package com.imooc.searchforid;

import java.util.regex.Matcher;
import java.util.regex.Pattern;


import android.app.Activity;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {
	// 佈局元素
	private EditText edt_IDinput;
	private Button btn_search, btn_clear;
	private TextView tv_sex, tv_birthday, tv_address;
	private String edtStr;
	private ProgressBar pb;

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

		edt_IDinput = (EditText) findViewById(R.id.edt_IDnum);
		btn_search = (Button) findViewById(R.id.btn_search);
		btn_clear = (Button) findViewById(R.id.btn_clear);
		tv_sex = (TextView) findViewById(R.id.show_sex);
		tv_birthday = (TextView) findViewById(R.id.show_birthday);
		tv_address = (TextView) findViewById(R.id.show_address);
		pb = (ProgressBar) findViewById(R.id.progressBar1);
		// 設定監聽事件
		btn_search.setOnClickListener(this);
		btn_clear.setOnClickListener(this);

	}
	
	public boolean isConnected(){
		ConnectivityManager manager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
		NetworkInfo mInfo = manager.getActiveNetworkInfo();
		if(mInfo!=null){
			return mInfo.isAvailable();
		}else{
			return false;
		}
	}


	@Override
	public void onClick(View v) {
		edtStr = edt_IDinput.getText().toString();
		if (v.getId() == R.id.btn_search) {
			if (isIDcode()) {
				//檢測網路及驗證
				if(isConnected()){
					new MyAsyncTask(tv_sex, tv_birthday, tv_address, edtStr, pb)
					.execute();
				}else{
					Toast.makeText(MainActivity.this, "網路未連線", 2500).show();
					return;
				}
			} else {
				tv_sex.setText("請輸入正確的身份證號碼!");
				tv_address.setText("");
				tv_birthday.setText("");
				return;
			}
		} else if (v.getId() == R.id.btn_clear) {
			edt_IDinput.setText("");
			tv_sex.setText("");
			tv_address.setText("");
			tv_birthday.setText("");
		}
	}

	/**
	 * 匹配是否是正確的身份證號碼
	 * 
	 * @return
	 */
	private boolean isIDcode() {
		Pattern p = Pattern.compile("^\\d{17}\\w$");
		Matcher m = p.matcher(edtStr);
		if (m.find()) {
			return true;
		}
		return false;
	}

}

//網路載入,通過AsyncTask來實現後臺載入,呼叫的是百度API市集提供的免費API
package com.imooc.searchforid;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import org.json.JSONException;
import org.json.JSONObject;

import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;

public class MyAsyncTask extends AsyncTask<Void, Void, String> {

    private static String apiKey = "be2fffdb29cbf44b3777bea792a5462f";
    private String httpUrl = "http://apis.baidu.com/apistore/idservice/id";
    private TextView sex, birth, address;
    private String idCode;
    private ProgressBar progressBar;
    public static String WARNNING = "輸入的資訊有誤或無相關資料,請檢查身份證號碼";

    public MyAsyncTask(TextView sex, TextView birth, TextView address,
            String edtStr, ProgressBar pb) {
        super();
        this.sex = sex;
        this.birth = birth;
        this.address = address;
        this.idCode = edtStr;
        this.progressBar = pb;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        progressBar.setVisibility(View.VISIBLE);
    }

    @Override
    protected String doInBackground(Void... params) {
        String str = request(httpUrl, "id=" + idCode);
        return str;
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        json4String(result);
    }
    

    /**
     * 解析JSON資料
     *
     * @param result
     */
    private void json4String(String result) {
        String sexStr = null, addStr = null, birthStr = null;
        try {
            JSONObject jsonObj = new JSONObject(result);
            JSONObject jsData = jsonObj.getJSONObject("retData");
            sexStr = jsData.getString("sex");
            addStr = jsData.getString("address");
            birthStr = jsData.getString("birthday");
            // 設定文字給View
            setTextToView(sexStr, addStr, birthStr);
        } catch (JSONException e) {
            e.printStackTrace();
            setTextToView(WARNNING," "," ");
        }
    }

    public void setTextToView(String sexStr, String addressStr, String birthStr) {
        if ("M".equals(sexStr)) {
            sex.setText("性別:  男");
        } else if("F".equals(sexStr)){
            sex.setText("性別:  女");
        }else{
            sex.setText(sexStr);
            address.setText("");
            birth.setText("" );
            progressBar.setVisibility(View.GONE);
            return;
        }
        birth.setText("出生年月:" + birthStr); // 生日
        address.setText("籍貫:" + addressStr); // 籍貫
        progressBar.setVisibility(View.GONE);
    }

    /**
     * 獲取JSON資料
     *
     * @param httpUrl
     * @param httpArg
     * @return
     */
    public String request(String httpUrl, String httpArg) {
        BufferedReader reader = null;
        String result = null;
        StringBuffer sbf = new StringBuffer();
        httpUrl = httpUrl + "?" + httpArg;

        try {
            URL url = new URL(httpUrl);
            HttpURLConnection connection = (HttpURLConnection) url
                    .openConnection();
            connection.setRequestMethod("GET");
            // 填入apikey到HTTP header
            connection.setRequestProperty("apikey", apiKey);
            connection.connect();
            InputStream is = connection.getInputStream();
            reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
            String strRead = null;
            while ((strRead = reader.readLine()) != null) {
                sbf.append(strRead);
                sbf.append("\r\n");
            }
            reader.close();
            result = sbf.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return result;
    }

}