package com.basic.security.manager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.SystemClock; import android.widget.Toast; import com.alfeye.readcardlib.entity.CardInfo; import com.alfeye.readcardlib.readcard.ReadCardUtil; import com.basic.security.activity.MainActivity; import com.basic.security.base.BaseApplication; import com.basic.security.base.BaseFragment; import com.basic.security.model.ModelAdapter; import com.basic.security.model.Person; import com.basic.security.utils.AndroidBmpUtil; import com.basic.security.utils.Constants; import com.basic.security.utils.DateUtil; import com.basic.security.utils.FaceId; import com.basic.security.utils.IdCard; import com.basic.security.utils.SocketUtil; import com.basic.security.utils.ToastUtil; import com.telpo.tps550.api.idcard.IdentityMsg; import org.apache.commons.io.IOUtils; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.nio.ByteBuffer; import java.text.SimpleDateFormat; import cn.com.aratek.idcard.IDCard; import cn.com.aratek.idcard.IDCardReader; import cn.com.aratek.util.Result; import static com.basic.security.utils.Constants.isNewIDCardReader; //import com.basic.security.idcard.idcard.AppConfig; //import com.basic.security.idcard.idcard.FileStorageHelper; //import com.basic.security.idcard.idcard.ReadUtil; public class IdCardManager extends BaseManager { public static IdCard lastIdCard = null; public static IDCardReader mReader; static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); static long lastTimeShowVerificationSuccess = System.currentTimeMillis(); static long lastTimeShowVerificationFail = System.currentTimeMillis(); static com.telpo.tps550.api.idcard.IdCard idCardTps650 = null; private static IntentFilter filter; private static BroadcastReceiver receiver; private volatile static boolean inRead = false; private static boolean receiverRegisted = false; private static int second = 0; public static byte[] getPixelsBGR(Bitmap image) { int bytes = image.getByteCount(); ByteBuffer buffer = ByteBuffer.allocate(bytes); // Create a new buffer image.copyPixelsToBuffer(buffer); // Move the byte data to the buffer byte[] temp = buffer.array(); // Get the underlying array containing the data. byte[] pixels = new byte[(temp.length / 4) * 3]; // Allocate for BGR for (int i = 0; i < temp.length / 4; i++) { pixels[i * 3] = temp[i * 4 + 2]; //B pixels[i * 3 + 1] = temp[i * 4 + 1]; //G pixels[i * 3 + 2] = temp[i * 4]; //R } return pixels; } public static void restart(Context activity) { BaseApplication.getApplication().executorService.execute(() -> { try { second += 2000; Thread.sleep(second); } catch (InterruptedException e) { e.printStackTrace(); } Intent i = new Intent(); i.setPackage("com.basic.project.idcardservice"); i.setAction("com.basic.read.IDCard"); i.putExtra("type", "start_service"); i.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); activity.startService(i); }); } // static ReadUtil readUtil; public static void startReadIdCard() { if (Constants.isTps650) { BaseApplication.getApplication().activity.runOnUiThread(() -> { try { if (idCardTps650 == null) { idCardTps650 = new com.telpo.tps550.api.idcard.IdCard(BaseApplication.getApplication().activity); } BaseApplication.getApplication().executorService.execute(new Runnable() { @Override public void run() { while (true) { try { IdentityMsg info = idCardTps650.checkIdCardOverseas(3000); if (info != null) { byte[] image = idCardTps650.getIdCardImageOverseas(info); String cardNumber = info.getNo(); Bitmap photo = idCardTps650.decodeIdCardImageOverseas(image); AndroidBmpUtil.save(photo, Constants.attachmentPath + cardNumber + ".bmp"); String name = info.getName(); name = name.replace(" ", ""); MainActivity activity = BaseApplication.getApplication().activity; if (activity != null) { if (activity.currentFragment == activity.fragment_su_auto_ic_wait_idcard || activity.currentFragment == activity.fragment_su_logged_ic_wait_idcard || (activity.currentFragment == activity.fragment_person_manage && activity.fragment_person_manage.needIdCardInfo())) { if (1 == 1) { IdCard idcard = new IdCard(); // idcard.birthday = info.getBorn()+"";//intent.getLongExtra("birthday", 0); idcard.cardNumber = cardNumber;// intent.getStringExtra("cardNumber"); idcard.gender = info.getSex();//intent.getStringExtra("gender"); idcard.name = name;//intent.getStringExtra("name").trim(); idcard.headBitmap = photo;//BitmapFactory.decodeFile("/sdcard/security_excel_attachment/" + idcard.cardNumber + ".bmp"); ByteArrayOutputStream stream = new ByteArrayOutputStream(); idcard.headBitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); idcard.jpgData = stream.toByteArray(); //BitmapFactory.decodeByteArray(idcard.jpgData, 0, idcard.jpgData.length); saveIdCardToSdcard(idcard); BaseApplication.getApplication().detectLock.lock(); File file = new File(Constants.attachmentPath + idcard.cardNumber + ".jpg"); idcard.featureData = FaceId.instance.extractFeature(file.getAbsolutePath()); BaseApplication.getApplication().detectLock.unlock(); BaseFragment.idCardReadTime = System.currentTimeMillis(); System.out.println("IdCardManager.onReceive 2"); BaseFragment.idCard = idcard; saveIdCard(idcard); } } IdCard idcard = new IdCard(); // idcard.birthday = idCard.getBirthday().getTime();//intent.getLongExtra("birthday", 0); idcard.cardNumber = cardNumber;// intent.getStringExtra("cardNumber"); idcard.gender = info.getSex();//intent.getStringExtra("gender"); idcard.name = name;//intent.getStringExtra("name").trim(); idcard.headBitmap = photo;//BitmapFactory.decodeFile("/sdcard/security_excel_attachment/" + idcard.cardNumber + ".bmp"); ByteArrayOutputStream stream = new ByteArrayOutputStream(); idcard.headBitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); idcard.jpgData = stream.toByteArray(); idcard.createTime = System.currentTimeMillis(); System.out.println("IdCardManager.onReceive " + idcard.name); saveIdCardToSdcard(idcard); BaseApplication.getApplication().detectLock.lock(); File file = new File(Constants.attachmentPath + idcard.cardNumber + ".jpg"); idcard.featureData = FaceId.instance.extractFeature(file.getAbsolutePath()); BaseApplication.getApplication().detectLock.unlock(); lastIdCard = idcard; SocketUtil.rpcCallSendIdCard(idcard); } } else { SystemClock.sleep(4*1000); } } catch (Exception e) { e.printStackTrace(); } } } }); } catch (Exception e) { e.printStackTrace(); } }); return; } if (Constants.isAraBM) { BaseApplication.getApplication().executorService.execute(new Runnable() { @Override public void run() { if (!Constants.USE_GRAY_CAMERA) { return; } while (true) { try { Result result = mReader.read(); if (result.error == IDCardReader.RESULT_OK) { IDCard idCard = (IDCard) result.data; System1.out.println("IdCardManager.run " + idCard); AndroidBmpUtil.save(idCard.getPhoto(), Constants.attachmentPath + idCard.getNumber() + ".bmp"); MainActivity activity = BaseApplication.getApplication().activity; if (activity != null) { if (activity.currentFragment == activity.fragment_su_auto_ic_wait_idcard || activity.currentFragment == activity.fragment_su_logged_ic_wait_idcard || (activity.currentFragment == activity.fragment_person_manage && activity.fragment_person_manage.needIdCardInfo())) { if (1 == 1) { IdCard idcard = new IdCard(); idcard.birthday = idCard.getBirthday().getTime();//intent.getLongExtra("birthday", 0); idcard.cardNumber = idCard.getNumber();// intent.getStringExtra("cardNumber"); idcard.gender = idCard.getSex().toString();//intent.getStringExtra("gender"); idcard.name = idCard.getName();//intent.getStringExtra("name").trim(); idcard.headBitmap = idCard.getPhoto();//BitmapFactory.decodeFile("/sdcard/security_yuyin_attachment/" + idcard.cardNumber + ".bmp"); ByteArrayOutputStream stream = new ByteArrayOutputStream(); idcard.headBitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); idcard.jpgData = stream.toByteArray(); //BitmapFactory.decodeByteArray(idcard.jpgData, 0, idcard.jpgData.length); BaseApplication.getApplication().detectLock.lock(); idcard.featureData = FaceId.instance.extractFeature1(getPixelsBGR(idcard.headBitmap), idcard.headBitmap.getWidth(), idcard.headBitmap.getHeight()); BaseApplication.getApplication().detectLock.unlock(); BaseFragment.idCardReadTime = System.currentTimeMillis(); System1.out.println("IdCardManager.onReceive 2"); BaseFragment.idCard = idcard; saveIdCard(idcard); } } if (1 == 1) { if (1 == 1) { IdCard idcard = new IdCard(); idcard.birthday = idCard.getBirthday().getTime();//intent.getLongExtra("birthday", 0); idcard.cardNumber = idCard.getNumber();// intent.getStringExtra("cardNumber"); idcard.gender = idCard.getSex().toString();//intent.getStringExtra("gender"); idcard.name = idCard.getName();//intent.getStringExtra("name").trim(); idcard.headBitmap = idCard.getPhoto();//BitmapFactory.decodeFile("/sdcard/security_yuyin_attachment/" + idcard.cardNumber + ".bmp"); ByteArrayOutputStream stream = new ByteArrayOutputStream(); idcard.headBitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); idcard.jpgData = stream.toByteArray(); idcard.createTime = System.currentTimeMillis(); System1.out.println("IdCardManager.onReceive " + idcard.name); BaseApplication.getApplication().detectLock.lock(); idcard.featureData = FaceId.instance.extractFeature1(getPixelsBGR(idcard.headBitmap), idcard.headBitmap.getWidth(), idcard.headBitmap.getHeight()); BaseApplication.getApplication().detectLock.unlock(); lastIdCard = idcard; saveIdCardToSdcard(idcard); SocketUtil.rpcCallSendIdCard(idcard); } } } } } catch (Exception e) { e.printStackTrace(); } } } }); } if (Constants.indoorOutdoorInOne) { return; } // FileStorageHelper.copyFilesFromRaw(BaseApplication.getApplication().activity, com.basic.security.utils.RUtils.R_raw_base, "base.dat", AppConfig.RootFile); // FileStorageHelper.copyFilesFromRaw(BaseApplication.getApplication().activity, com.basic.security.utils.RUtils.R_raw_license, "license.lic", AppConfig.RootFile); // BaseApplication.getApplication().activity.runOnUiThread(()->{ // readUtil = new ReadUtil(BaseApplication.getApplication().activity, 1); // BaseApplication.getApplication().executorService.execute(()->{ // while (true) { // try { // System1.out.println("IdCardManager.startReadIdCard " + 1); // if (readUtil.isPort()) { // System1.out.println("IdCardManager.startReadIdCard " + 2); // IDCard idCard = readUtil.readCard(); // System1.out.println("ReadIDCardService.run idCard=" + idCard); // if (idCard != null) { // Bitmap headBitmap = BitmapFactory.decodeFile(idCard.getIdPhoto()); // IdCard c = new IdCard(); //// c.birthday = getTimeStamp(idCard.getIdDate(), "yyyyMMdd"); // c.cardNumber = idCard.getIdNum(); // c.gender = idCard.getIdSex(); // c.name = idCard.getIdName(); // ByteArrayOutputStream stream = new ByteArrayOutputStream(); // headBitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); // c.jpgData = stream.toByteArray(); //// Intent i = new Intent(); //// i.putExtra("birthday", c.birthday); //// i.putExtra("cardNumber", c.cardNumber); //// i.putExtra("gender", c.gender); //// i.putExtra("name", c.name); //// i.putExtra("jpgData", c.jpgData); //// i.setPackage("com.basic.security"); //// i.setAction("read.id.card.data"); //// sendBroadcast(i); // } // // } // try { // Thread.sleep(1000); // } catch (InterruptedException e) { // e.printStackTrace(); // } // } catch (Exception e) { // e.printStackTrace(); // } // } // // // }); // }); // // if (1==1) { // return; // } MainActivity activity = BaseApplication.getApplication().activity; if (activity == null) { ToastUtil.show("程序异常, 请重新启动"); return; } activity.readCardUtil = new ReadCardUtil(activity, new ReadCardUtil.OnReadCardListener() { public void onReadCardSucceed(String s, CardInfo cardInfo, Intent intent) { System1.out.println("IdCardManager.onReadCardSucceed"); if (activity != null) { if (activity.currentFragment == activity.fragment_su_auto_ic_wait_idcard || activity.currentFragment == activity.fragment_su_logged_ic_wait_idcard || (activity.currentFragment == activity.fragment_person_manage && activity.fragment_person_manage.needIdCardInfo())) { IdCard idcard = new IdCard(); idcard.birthday = DateUtil.getTimeStamp(cardInfo.getBirthday(), "yyyyMMdd"); idcard.cardNumber = cardInfo.getCardNum(); idcard.gender = cardInfo.getGender(); idcard.name = cardInfo.getName(); idcard.headBitmap = cardInfo.getPhoto(); ByteArrayOutputStream stream = new ByteArrayOutputStream(); cardInfo.getPhoto().compress(Bitmap.CompressFormat.JPEG, 100, stream); idcard.jpgData = stream.toByteArray(); BaseApplication.getApplication().detectLock.lock(); idcard.featureData = FaceId.instance.extractFeature1(getPixelsBGR(idcard.headBitmap), idcard.headBitmap.getWidth(), idcard.headBitmap.getHeight()); BaseApplication.getApplication().detectLock.unlock(); BaseFragment.idCardReadTime = System.currentTimeMillis(); BaseFragment.idCard = idcard; saveIdCard(idcard); } } } public void onReadCardFail(int i, String s) { System1.out.println("IdCardManager.onReadCardFail"); } }); filter = new IntentFilter(); filter.addAction("read.id.card.data"); receiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { System1.out.println("IdCardManager.onReceive 1"); if (activity != null) { if (activity.currentFragment == activity.fragment_su_auto_ic_wait_idcard || activity.currentFragment == activity.fragment_su_logged_ic_wait_idcard || (activity.currentFragment == activity.fragment_person_manage && activity.fragment_person_manage.needIdCardInfo())) { if (intent.getBooleanExtra("close", false)) { Toast.makeText(activity, "身份证连接失败", Toast.LENGTH_SHORT).show(); restart(activity); } else { IdCard idcard = new IdCard(); idcard.birthday = intent.getLongExtra("birthday", 0); idcard.cardNumber = intent.getStringExtra("cardNumber"); idcard.gender = intent.getStringExtra("gender"); idcard.name = intent.getStringExtra("name").trim(); idcard.headBitmap = BitmapFactory.decodeFile("/sdcard/security_yuyin_attachment/" + idcard.cardNumber + ".bmp"); ByteArrayOutputStream stream = new ByteArrayOutputStream(); idcard.headBitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); idcard.jpgData = stream.toByteArray(); //BitmapFactory.decodeByteArray(idcard.jpgData, 0, idcard.jpgData.length); BaseApplication.getApplication().detectLock.lock(); idcard.featureData = FaceId.instance.extractFeature1(getPixelsBGR(idcard.headBitmap), idcard.headBitmap.getWidth(), idcard.headBitmap.getHeight()); BaseApplication.getApplication().detectLock.unlock(); BaseFragment.idCardReadTime = System.currentTimeMillis(); System1.out.println("IdCardManager.onReceive 2"); BaseFragment.idCard = idcard; saveIdCard(idcard); } } if (activity.currentFragment == activity.fragment_su_auto_wait_face || activity.currentFragment == activity.fragment_door_access_result ) { if (intent.getBooleanExtra("close", false)) { Toast.makeText(activity, "身份证连接失败", Toast.LENGTH_SHORT).show(); restart(activity); } else { IdCard idcard = new IdCard(); idcard.birthday = intent.getLongExtra("birthday", 0); idcard.cardNumber = intent.getStringExtra("cardNumber"); idcard.gender = intent.getStringExtra("gender"); idcard.name = intent.getStringExtra("name").trim(); idcard.headBitmap = BitmapFactory.decodeFile("/sdcard/security_yuyin_attachment/" + idcard.cardNumber + ".bmp"); ByteArrayOutputStream stream = new ByteArrayOutputStream(); idcard.headBitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); idcard.jpgData = stream.toByteArray(); // idcard.headBitmap = BitmapFactory.decodeByteArray(idcard.jpgData, 0, idcard.jpgData.length); idcard.createTime = System.currentTimeMillis(); System1.out.println("IdCardManager.onReceive " + idcard.name); BaseApplication.getApplication().detectLock.lock(); idcard.featureData = FaceId.instance.extractFeature1(getPixelsBGR(idcard.headBitmap), idcard.headBitmap.getWidth(), idcard.headBitmap.getHeight()); BaseApplication.getApplication().detectLock.unlock(); lastIdCard = idcard; saveIdCardToSdcard(idcard); SocketUtil.rpcCallSendIdCard(idcard); // BaseFragment.idCardReadTime = System.currentTimeMillis(); // System1.out.println("IdCardManager.onReceive 2"); // BaseFragment.idCard = idcard; // saveIdCard(idcard); } } } } }; activity.registerReceiver(receiver, filter); receiverRegisted = true; BaseApplication.getApplication().executorService.execute(() -> { SystemClock.sleep(5 * 1000); while (true) { try { if (activity.currentFragment == activity.fragment_su_auto_ic_wait_idcard || activity.currentFragment == activity.fragment_su_logged_ic_wait_idcard || (activity.currentFragment == activity.fragment_person_manage && activity.fragment_person_manage.needIdCardInfo()) || activity.currentFragment == activity.fragment_su_auto_wait_face || activity.currentFragment == activity.fragment_door_access_result ) { if (!inRead) { inRead = true; if (isNewIDCardReader) { activity.readCardUtil.startReadCard(); } else { Intent intent = new Intent(); intent.setPackage("com.basic.project.idcardservice"); intent.setAction("com.basic.read.IDCard"); intent.putExtra("type", "start_service"); intent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); activity.startService(intent); } } } else { if (inRead) { inRead = false; if (isNewIDCardReader) { activity.readCardUtil.stopReadCard(); } else { if (1 != 1) { Intent intent = new Intent(); intent.setPackage("com.basic.project.idcardservice"); intent.setAction("com.basic.read.IDCard"); intent.putExtra("type", "stop_service"); intent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); activity.startService(intent); } } } } } catch (Exception e) { e.printStackTrace(); } SystemClock.sleep(200); } }); } public static void saveIdCardToSdcard(IdCard idcard) { if (idcard.jpgData != null) { try { ModelAdapter idCard = new ModelAdapter(); idCard.setString(com.basic.security.model.IdCard.birthday, idcard.birthday + ""); idCard.setString(com.basic.security.model.IdCard.card_number, idcard.cardNumber + ""); idCard.setString(com.basic.security.model.IdCard.name, idcard.name + ""); idCard.setString(com.basic.security.model.IdCard.gender, idcard.gender + ""); idCard.setString(com.basic.security.model.IdCard.head_path, idcard.headPath + ""); idCard.setString(com.basic.security.model.IdCard.create_time, idcard.createTime + ""); idCard.setString(Constants.TABLE, com.basic.security.model.IdCard.tableName); save(idCard); IOUtils.write(idcard.jpgData, new FileOutputStream(Constants.attachmentPath + idcard.cardNumber + ".jpg")); } catch (Exception e) { e.printStackTrace(); } } } private static void saveIdCard(IdCard idcard) { MainActivity activity = BaseApplication.getApplication().activity; ModelAdapter selectedPerson = activity.fragment_person_manage.selectedPerson(); if (selectedPerson != null && idcard.featureData != null) { byte[] camera_image_feature = selectedPerson.getBlob(Person.camera_image_feature); BaseApplication.getApplication().detectLock.lock(); float score = FaceId.instance.compareFeature(camera_image_feature, idcard.featureData); BaseApplication.getApplication().detectLock.unlock(); if (score >= 50) { String verificationSuccessHint = HintSignUpManager.getVerificationSuccessHint(); if (System.currentTimeMillis() - lastTimeShowVerificationSuccess > 4 * 1000) { ToastUtil.show(verificationSuccessHint); lastTimeShowVerificationSuccess = System.currentTimeMillis(); SystemInitManager.secondaryDisplay.showVerificationFail(verificationSuccessHint); } if (activity.fragment_face_detail.person != null) { activity.fragment_face_detail.updateIdCard(); } if (activity.currentFragment == activity.fragment_su_logged_ic_wait_idcard) { activity.showFragment(activity.fragment_su_logged_ic_compare_success); } } else { if (System.currentTimeMillis() - lastTimeShowVerificationFail > 4 * 1000) { ToastUtil.show(HintSignUpManager.getVerificationFail()); lastTimeShowVerificationFail = System.currentTimeMillis(); SystemInitManager.secondaryDisplay.showVerificationFail(HintSignUpManager.getVerificationFail()); } BaseFragment.idCard = null; } } } public static void unRegisterBroadcast(Context context) { Intent intent = new Intent(); intent.setPackage("com.basic.project.idcardservice"); intent.setAction("com.basic.read.IDCard"); intent.putExtra("type", "close_service"); context.startService(intent); try { if (IdCardManager.receiverRegisted) { context.unregisterReceiver(receiver); } } catch (Exception e) { e.printStackTrace(); } } }