package com.dayu.qiheonlinelibrary.activity; import android.content.Intent; import android.os.Bundle; import android.text.InputFilter; import android.text.Spanned; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import androidx.annotation.NonNull; import com.dayu.baselibrary.tools.Utils; import com.dayu.baselibrary.utils.TipUtil; import com.dayu.baselibrary.utils.ToastUtil; import com.dayu.qiheonlinelibrary.card.UserCard; import com.dayu.qiheonlinelibrary.databinding.ActivityNewCardQhlBinding; import com.dayu.qiheonlinelibrary.dbBean.AdminDataBean; import com.dayu.qiheonlinelibrary.dbBean.UserCardBean; 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.Calendar; 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 BaseActivity { public static final int SCAN_IDCARD_REQUEST = 1; UserCardBean userCardBean; ActivityNewCardQhlBinding newCardBinding; AdminDataBean adminData; static NewCardActivity newCardActivity; private int defValueMainId = 2; private int defValueSubId = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); newCardActivity = this; newCardBinding = ActivityNewCardQhlBinding.inflate(LayoutInflater.from(this)); setContentView(newCardBinding.getRoot()); setData(); initView(); } private void initView() { newCardBinding.newCardName.setFilters(new InputFilter[]{new ChineseInputFilter()}); newCardBinding.newCardId.setFilters(new InputFilter[]{new AlphaNumericXFilter(), new InputFilter.LengthFilter(18)}); //身份证识别 newCardBinding.newCardScanBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { rxPermission(); } }); //开户 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); UserCard userCard = new UserCard(); userCard.setArerNumber(Integer.valueOf(adminData.getSerial())); userCard.setDeviceNumberl(Integer.valueOf(adminData.getAddressCode())); userCard.setRechargeTimes((byte) 0); userCard.setTotalWater(0); userCard.setTotalElectric(0); userCard.setBalance(0); userCard.setSurplusWater(0); userCard.setRechargeDate(Calendar.getInstance()); Intent intent = new Intent(NewCardActivity.this, NFCWreatActivity.class); intent.putExtra("userCard", userCard); intent.putExtra("dbUserCard", userCardBean); startActivity(intent); } } else { TipUtil.show(NewCardActivity.this, "请输入完整内容"); } }); } 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; } 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("获取录音和日历权限失败"); } } }); } @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 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); } public int getSharedPreferencesStoreMainId() { return SharedPreferencesHelper.getInt( getApplicationContext(), "nMainId", defValueMainId); } public int getSharedPreferencesStoreSubId() { return SharedPreferencesHelper.getInt( getApplicationContext(), "nSubID", defValueSubId); } private void setData() { try { adminData = baseDao.adminDao().findFirst(); newCardBinding.newCardVillageNum.setText(adminData.getSerial()); } catch (Exception e) { e.printStackTrace(); } } 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; } }