package com.zzx.factorytest;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.hisign.AS60xSDK.IDCardDecodeAPI;
import com.ivsign.android.IDCReader.IDCReaderSDK;
import com.zzx.factorytest.bean.PlatformBean;
import com.zzx.factorytest.help.PlatformHelp;
import com.zzx.factorytest.manager.OTGManager;
import com.zzx.factorytest.view.JudgeView;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class IdentityCardActivity extends TestItemBaseActivity implements View.OnClickListener {
public static final String TAG = "IdentityCardActivity.cl";
private Button mRead;
private TextView mTxt;
private TextView mSAM;
private ImageView mImg;
private IDCReaderSDK mChatService;
private String mConnectedDeviceName = "/dev/ttyMT";
private PlatformBean mPlatform;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.identity_card_activity);
initView();
addListener();
init();
OTGManager.getInstance(this).startUART1();
}
private void init() {
mPlatform = PlatformHelp.getPlatform(this);
mConnectedDeviceName += mPlatform.IdentityCardPath;
Log.d(TAG, Environment.getExternalStorageDirectory().getPath() + File.separator + "wltlib");
if (mChatService == null) {
mChatService = new IDCReaderSDK(this, "/sdcard/wltlib");
}
}
private void addListener() {
mRead.setOnClickListener(this);
}
private void initView() {
((JudgeView) findViewById(R.id.judgeview)).setOnResultSelectedListener(this);
mRead = (Button) findViewById(R.id.read);
mTxt = (TextView) findViewById(R.id.information);
mSAM = (TextView) findViewById(R.id.sam);
mImg = (ImageView) findViewById(R.id.img);
}
@Override
protected void onResume() {
super.onResume();
switch (mChatService.getState()) {
case IDCReaderSDK.STATE_CONNECTED:
Toast.makeText(getApplicationContext(), "已连接", Toast.LENGTH_SHORT).show();
break;
case IDCReaderSDK.STATE_CONNECTING:
Toast.makeText(getApplicationContext(), "连接中", Toast.LENGTH_SHORT).show();
break;
case IDCReaderSDK.STATE_LISTEN:
Toast.makeText(getApplicationContext(), "STATE_LISTEN", Toast.LENGTH_SHORT).show();
break;
case IDCReaderSDK.STATE_NONE:
mTxt.setText("准备连接");
connect();
break;
}
}
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mChatService != null) {
mChatService.CVR_CloseComm();
mChatService = null;
}
OTGManager.getInstance(this).stopUART1();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.read:
certification();
break;
}
}
private void certification() {
if (mChatService.getState() == IDCReaderSDK.STATE_CONNECTED) {
int ret = mChatService.CVR_Authenticate(3000);
switch (ret) {
case IDCReaderSDK.CVR_RETCODE_SUCCESS:
mTxt.setText("认证成功,正在读取信息");
Read_1();
Read_2();
break;
case IDCReaderSDK.CVR_RETCODE_TIMEOUT:
case IDCReaderSDK.CVR_RETCODE_LICERROR:
case IDCReaderSDK.CVR_RETCODE_ERROR:
mTxt.setText("认证失败,正在重新认证");
ret = mChatService.CVR_Authenticate(3000);
if (IDCReaderSDK.CVR_RETCODE_SUCCESS == ret) {
mTxt.setText("认证成功,正在读取信息");
Read_1();
Read_2();
} else {
mTxt.setText("无法连接身份证模块,请检查硬件连接.");
}
break;
}
// if (IDCReaderSDK.CVR_RETCODE_SUCCESS == ret) {
// byte[] dataBuf = mChatService.CVR_GetSAMID();
// readMessage = "SAM信息: "
// + printSAMString(dataBuf, dataBuf.length);
// mTxt.setText(readMessage);
//
// } else {
//
// }
}
}
private static String printSAMString(byte[] b, int len) {
int[] data = new int[4];
data[0] = b[0];
data[1] = b[2];
data[2] = (b[4] & 0xFF) + (b[5] & 0xFF) * 256 + (b[6] & 0xFF) * 256 * 256 + (b[7] & 0xFF) * 256 * 256 * 256;
data[3] = (b[8] & 0xFF) + (b[9] & 0xFF) * 256 + (b[10] & 0xFF) * 256 * 256 + (b[11] & 0xFF) * 256 * 256 * 256;
String result = String.format("%02d%02d-%08d-%010d", data[0], data[1], data[2], data[3]);
return result;
}
private void Read_1() {
byte[] dataBuf = mChatService.CVR_GetSAMID();
String readMessage = "SAM信息: " + printSAMString(dataBuf, dataBuf.length);
mSAM.setText(readMessage);
}
private void Read_2() {
String readMessage = "";
int ret = 0;
boolean bRet = false;
if (mChatService.getState() == IDCReaderSDK.STATE_CONNECTED) {
mTxt.setText("开始读取信息:");
String FpInfo = "证件内指纹区域未注册!";
// 读取全部信息,包括指纹信息
ret = mChatService.CVR_Read_FPContent(1, 5000);
Log.i(TAG, "CVR_Read_Content ret = " + ret);
if (IDCReaderSDK.CVR_RETCODE_SUCCESS == ret) {
// byte[] dataBuf = mChatService.CVR_GetInfo();
// try {
// String TestStr = new String(dataBuf, "UTF16-LE");
// readMessage = new String(TestStr.getBytes("UTF-8"));
// } catch (UnsupportedEncodingException e) {
// e.printStackTrace();
// }
byte[] fp_data = mChatService.fingerInfo;
if (fp_data[0] == 0x0 && fp_data[512] == 0x0) {
FpInfo = "证件内指纹区域未注册!";
} else {
WriteBufferToFile("/sdcard/fpinfo.dat", fp_data);
FpInfo = "证件内指纹区域已经注册!";
}
} else if (IDCReaderSDK.CVR_RETCODE_TIMEOUT == ret) {
mTxt.setText(mConnectedDeviceName + ": " + "操作超时 ");
return;
} else {
mTxt.setText("没有读到人员信息! ");
//button_clean_click();
return;
}
// 2015-10-27:
// delete original bmp file if exists.
File bmpFile = new File("/sdcard/zp.bmp");
if (bmpFile.exists()) {
bRet = bmpFile.delete();
if (bRet == false) {
mTxt.setText(" 照片删除失败!");
return;
}
}
byte[] wlt = getBytesFromSdcard("/sdcard/wltlib/zp.wlt");
bRet = IDCardDecodeAPI.FCV_SaveCardPictoBmp(wlt, Environment.getExternalStorageDirectory().getPath());
if (bRet)
mTxt.setText(" 照片解码成功!");
else
mTxt.setText(" 照片解码失败!");
// TODO: need debug here, get image from mIDCReader.
mImg.setImageBitmap(BitmapFactory.decodeFile("/sdcard/zp.bmp"));
mTxt.setText("信息解码:\n"
+ "姓名:" + mChatService.GetPeopleName() + "\n"
+ "性别:" + mChatService.GetPeopleSex() + "\n"
+ "民族:" + mChatService.GetPeopleNation() + "\n"
+ "出生:" + mChatService.GetPeopleBirthday() + "\n"
+ "住址:" + mChatService.GetPeopleAddress() + "\n"
+ "卡号:" + mChatService.GetPeopleIDCode() + "\n"
+ "发证机关:" + mChatService.GetDepartment() + "\n"
+ "有效开始日期:" + mChatService.GetStartDate() + "\n"
+ "有效截止日期:" + mChatService.GetEndDate() + "\n"
+ "指纹信息:" + FpInfo + "\n");
} else {
mTxt.setText(" 设备未连接 " + readMessage);
}
}
private void connect() {
File file = new File(mConnectedDeviceName);
System.out.println(file.getAbsolutePath() + " canRead = " + file.canRead() + ",canWrite = " + file.canWrite() + ",canExecute = " + file.canExecute());
file = new File("/dev/ttyMT2");
System.out.println(file.getAbsolutePath() + " canRead = " + file.canRead() + ",canWrite = " + file.canWrite() + ",canExecute = " + file.canExecute());
int ret = mChatService.CVR_InitComm(mConnectedDeviceName, 1000, IDCReaderSDK.DEVICE_SERIALPORT);
switch (ret) {
case IDCReaderSDK.CVR_RETCODE_SUCCESS:
mTxt.setText("设备" + mConnectedDeviceName + "连接成功,请放卡操作");
break;
case IDCReaderSDK.CVR_RETCODE_TIMEOUT:
mTxt.setText("设备连接超时");
break;
default:
mTxt.setText("设备连接失败");
break;
}
}
public static byte[] getBytesFromSdcard(String filePath) {
byte[] imgData = null;
FileInputStream fis = null;
try {
File f = new File(filePath);
fis = new FileInputStream(f);
imgData = new byte[fis.available()];
fis.read(imgData);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return imgData;
}
public void WriteBufferToFile(String filename, byte[] buf) {
try {
FileOutputStream fos = new FileOutputStream(filename);
fos.write(buf);
fos.flush();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}