package com.dayu.henanlibrary.activity; import android.content.Intent; import android.os.Bundle; import android.text.InputFilter; import android.text.Spanned; import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import androidx.annotation.NonNull; import com.dayu.baselibrary.tools.BcdUtil; import com.dayu.baselibrary.tools.HexUtil; import com.dayu.baselibrary.tools.Utils; import com.dayu.baselibrary.utils.CRC8; import com.dayu.baselibrary.utils.TipUtil; import com.dayu.baselibrary.utils.ToastUtil; import com.dayu.henanlibrary.HeNanApplication; import com.dayu.henanlibrary.card.UserCard; import com.dayu.henanlibrary.databinding.ActivityNewCardHnBinding; import com.dayu.henanlibrary.dbBean.AdminDataBean; import com.dayu.henanlibrary.dbBean.ElectricPriceBean; import com.dayu.henanlibrary.dbBean.IpBean; import com.dayu.henanlibrary.dbBean.UserCardBean; import com.dayu.henanlibrary.net.SocketCallBack; import com.dayu.henanlibrary.net.SocketData; import com.dayu.henanlibrary.net.SocketNet; import com.dayu.henanlibrary.socketBean.InitCardRequestBean; import com.dayu.henanlibrary.utils.DeviceNumberUtils; import com.dayu.henanlibrary.utils.SocketUtil; import com.dayu.henanlibrary.view.ProgressDialog; import com.hjq.permissions.OnPermissionCallback; import com.hjq.permissions.Permission; import com.hjq.permissions.XXPermissions; import com.kernal.passportreader.sdk.CardsCameraActivity; import com.kernal.passportreader.sdk.utils.DefaultPicSavePath; import java.util.Arrays; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import kernal.idcard.android.ResultMessage; import kernal.idcard.camera.CardOcrRecogConfigure; import kernal.idcard.camera.SharedPreferencesHelper; /** * Copyright (C), 2023, * Author: zuo * Date: 2023-11-10 19:52 * Description: 新卡注册 */ public class NewCardActivity extends BaseNfcActivity { public static final int SCAN_IDCARD_REQUEST = 1; UserCardBean userCardBean; ActivityNewCardHnBinding newCardBinding; AdminDataBean adminData; static NewCardActivity newCardActivity; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); newCardActivity = this; newCardBinding = ActivityNewCardHnBinding.inflate(LayoutInflater.from(this)); setContentView(newCardBinding.getRoot()); setData(); initView(); // LibraryInitOCR.initOCR(NewCardActivity.this); } private void initView() { newCardBinding.newCardName.setFilters(new InputFilter[]{new ChineseInputFilter()}); newCardBinding.newCardId.setFilters(new InputFilter[]{new AlphaNumericXFilter(), new InputFilter.LengthFilter(18)}); newCardBinding.newCardRegistBtn.setOnClickListener(v -> { String userName = newCardBinding.newCardName.getText().toString(); long date = System.currentTimeMillis(); String phone = newCardBinding.newCardPhone.getText().toString(); String userID = newCardBinding.newCardId.getText().toString().toUpperCase(); if (!TextUtils.isEmpty(userName) && !TextUtils.isEmpty(phone) && !TextUtils.isEmpty(userID) ) { if (userName.length() <= 1 || !validateName(userName)) { TipUtil.show(NewCardActivity.this, "请输入正确姓名"); } else if (phone.length() < 11 || !isValidPhoneNumber(phone)) { TipUtil.show(NewCardActivity.this, "请输入正确手机号"); } else if (!Utils.check(userID)) { TipUtil.show(NewCardActivity.this, "请输入正确身份证号"); } else { userCardBean = new UserCardBean(); userCardBean.setUserName(userName); userCardBean.setDate(date); userCardBean.setSerial(adminData.getSerial()); userCardBean.setPhone(phone); userCardBean.setUserID(userID); initCard(); } } else { TipUtil.show(NewCardActivity.this, "请输入完整内容"); } }); //身份证识别 newCardBinding.newCardScanBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { rxPermission(); } }); } private void rxPermission() { XXPermissions.with(this) // 申请单个权限 // .permission(Permission.RECORD_AUDIO) // 申请多个权限 .permission(Permission.CAMERA) .request(new OnPermissionCallback() { @Override public void onGranted(@NonNull List permissions, boolean allGranted) { if (allGranted) {//所有申请的权限都已通过 startCamera(); } } @Override public void onDenied(@NonNull List permissions, boolean doNotAskAgain) { if (doNotAskAgain) { // 如果是被永久拒绝就跳转到应用权限系统设置页面 } else { // toast("获取录音和日历权限失败"); } } }); } private void startCamera() { CardOcrRecogConfigure.getInstance() .initLanguage(getApplicationContext()) .setSaveCut(true) .setOpenIDCopyFuction(true) .setnMainId(getSharedPreferencesStoreMainId()) .setnSubID(getSharedPreferencesStoreSubId()) .setFlag(0) .setnCropType(0) .setSavePath(new DefaultPicSavePath(this, true)); Intent intent = new Intent(this, CardsCameraActivity.class); startActivityForResult(intent, SCAN_IDCARD_REQUEST); } private int defValueMainId = 2; private int defValueSubId = 0; public int getSharedPreferencesStoreMainId() { return SharedPreferencesHelper.getInt( getApplicationContext(), "nMainId", defValueMainId); } public int getSharedPreferencesStoreSubId() { return SharedPreferencesHelper.getInt( getApplicationContext(), "nSubID", defValueSubId); } private boolean isValidPhoneNumber(String phoneNumber) { // 定义手机号的正则表达式,确保数字部分没有连续6位相同的数字 String phoneRegex = "^1[0-9]{10}$"; // 创建 Pattern 对象 Pattern pattern = Pattern.compile(phoneRegex); // 创建 matcher 对象 Matcher matcher = pattern.matcher(phoneNumber); // 判断手机号是否匹配正则表达式 return matcher.matches() && !hasSixConsecutiveSameDigits(phoneNumber); } /** * 判断是否有6个相同的连续数字 * * @param input * @return */ public static boolean hasSixConsecutiveSameDigits(String input) { char[] digits = input.toCharArray(); for (int i = 0; i <= digits.length - 6; i++) { boolean consecutiveSame = true; for (int j = 1; j < 6; j++) { if (digits[i + j] != digits[i + j - 1]) { consecutiveSame = false; break; } } if (consecutiveSame) { return true; } } return false; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { switch (requestCode) { case SCAN_IDCARD_REQUEST: try { //跳转扫描界面识别完成之后,数据回传 if (data != null) { //数据回传的获取 Bundle bundle = data.getBundleExtra("resultbundle"); //bundle不为null,代表这识别成功 if (bundle != null) { ResultMessage resultMessage = (ResultMessage) bundle.getSerializable("resultMessage"); newCardBinding.newCardName.setText(resultMessage.GetRecogResult[1]); newCardBinding.newCardId.setText(resultMessage.GetRecogResult[6]); newCardBinding.newCardIdTip.setVisibility(View.VISIBLE); } else { String error = data.getStringExtra("error"); String StrPath = data.getStringExtra("strpicpath"); ToastUtil.show(error); } } } catch (Exception e) { e.printStackTrace(); } break; } } } private void setData() { try { adminData = baseDao.adminDao().findFirst(); newCardBinding.newCardVillageNum.setText(adminData.getSerial()); } catch (Exception e) { e.printStackTrace(); } } /** * 开卡报文 */ private void initCard() { ProgressDialog.show(this); String initCode = DeviceNumberUtils.getDeviceNumber(); if (TextUtils.isEmpty(initCode)) { TipUtil.show(this, "设备注册号为空,请先设置IP和管理员地址"); IpBean ipBean = baseDao.ipDao().findFirst(); if (ipBean != null && adminData != null) { HeNanApplication.myApplication.initMachineRequestBean(ipBean.getIp(), ipBean.getPort(), adminData.getAddressCode()); } return; } InitCardRequestBean initCardRequestBean = new InitCardRequestBean(); initCardRequestBean.setControl("01"); initCardRequestBean.setInitCode(initCode); initCardRequestBean.setMachineCode(SocketUtil.getXuLie(this)); initCardRequestBean.setAFN("93"); initCardRequestBean.setOrderId(SocketUtil.getOrderId(NewCardActivity.this)); String userName = userCardBean.getUserName(); initCardRequestBean.setName(SocketUtil.str2HexStr(userName)); String phone = userCardBean.getPhone(); StringBuffer phoneBuffer = new StringBuffer(phone); for (int i = 0; i < 12 - phone.length(); i++) { phoneBuffer.insert(0, "0"); } initCardRequestBean.setPhone(phoneBuffer.toString()); String userId = userCardBean.getUserID(); initCardRequestBean.setIdCard(SocketUtil.str2HexStr(userId)); SocketNet.getInstance().sendTestMessage(initCardRequestBean.pack(), "93", new SocketCallBack() { @Override public void onSocketResponse(SocketData readData) { ProgressDialog.dismiss(); if (CRC8.isCRC8(readData.getOriginDataBytes())) { String state = BcdUtil.bcdToStr(readData.getBodyBytes()[26]); //BCD码00成功01身份证已注册02其他原因失败 Log.i("initCard", "state:" + state); if (state.equalsIgnoreCase("00")) { String initPeasantCode = HexUtil.bytesToHex(Arrays.copyOfRange(readData.getBodyBytes(), 10, 26)); String serial = baseDao.adminDao().findFirst().getSerial(); UserCard userCard = new UserCard(); userCard.setRechargeTimes(0); ElectricPriceBean electricPriceBean = baseDao.electricPriceDao().findFirst(); if (electricPriceBean != null) { userCard.setElectricityPrice(electricPriceBean.getPrice()); } else { //默认是1元 userCard.setElectricityPrice(1.000f); } userCard.setState("00"); userCard.setBalance(0); userCard.setAddressCode(adminData.getAddressCode()); userCard.setInitPeasantCode(initPeasantCode); userCardBean.setSerial(serial); userCardBean.setInitPeasantCode(initPeasantCode); userCardBean.setUserName(newCardBinding.newCardName.getText().toString()); userCardBean.setPhone(newCardBinding.newCardPhone.getText().toString()); userCardBean.setUserID(newCardBinding.newCardId.getText().toString()); userCardBean.setDate(System.currentTimeMillis()); baseDao.userCardDao().insert(userCardBean); Intent intent = new Intent(NewCardActivity.this, NFCWreatActivity.class); intent.putExtra("userCard", userCard); intent.putExtra("dbUserCard", userCardBean); startActivity(intent); } else if (state.equalsIgnoreCase("01")) { TipUtil.show(NewCardActivity.this, "开卡报文--身份证已注册"); } else if (state.equalsIgnoreCase("02")) { TipUtil.show(NewCardActivity.this, "开卡报文--其他原因失败"); } } else { //校验CRC错误 TipUtil.show(NewCardActivity.this, "开卡报文校验CRC错误"); } } @Override public void onSocketError(int code, String msg) { runOnUiThread(() -> { ProgressDialog.dismiss(); TipUtil.show(NewCardActivity.this, msg); }); } }); } public boolean validateName(String name) { // 使用正则表达式匹配姓名 String regex = "^[\\u4e00-\\u9fa5]+$"; // 只允许中文字符 return name.matches(regex); } private static class AlphaNumericXFilter implements InputFilter { // 正则表达式定义只能输入数字和字母 "X"(大写或小写) private final String regex = "[0-9Xx]*"; @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { // 检查每个输入字符是否符合正则表达式 for (int i = start; i < end; i++) { if (!String.valueOf(source.charAt(i)).matches(regex)) { return ""; // 不符合规定的字符被过滤掉 } } return null; // 允许输入字符 } } public class ChineseInputFilter implements InputFilter { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { StringBuilder builder = new StringBuilder(); for (int i = start; i < end; i++) { char currentChar = source.charAt(i); // 只允许汉字 if (isChineseCharacter(currentChar)) { builder.append(currentChar); } } return builder.toString(); } private boolean isChineseCharacter(char c) { // 这里使用Unicode范围判断是否为汉字 // 汉字的Unicode范围是:0x4e00 - 0x9fa5 return (c >= 0x4e00 && c <= 0x9fa5); } } @Override protected void onDestroy() { super.onDestroy(); newCardActivity = null; } }