package com.dayu.qihealonelibrary.activity; import android.app.Dialog; 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.qihealonelibrary.card.UserCard; import com.dayu.qihealonelibrary.databinding.ActivityNewCardBinding; import com.dayu.qihealonelibrary.dbBean.AdminDataBean; import com.dayu.qihealonelibrary.dbBean.IpBean; import com.dayu.qihealonelibrary.dbBean.UserCardBean; import com.dayu.qihealonelibrary.utils.DeviceNumberUtils; import com.dayu.qihealonelibrary.view.ProgressDialog; import com.hjq.permissions.OnPermissionCallback; import com.hjq.permissions.Permission; import com.hjq.permissions.XXPermissions; import org.json.JSONException; import org.json.JSONObject; import java.util.Arrays; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Copyright (C), 2023, * Author: zuo * Date: 2023-11-10 19:52 * Description: 新卡注册 */ public class NewCardActivity extends QHAloneBaseActivity { public static final int SCAN_IDCARD_REQUEST = 1; UserCardBean userCardBean; Dialog dialog; ActivityNewCardBinding newCardBinding; AdminDataBean adminData; static NewCardActivity newCardActivity; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); newCardActivity = this; newCardBinding = ActivityNewCardBinding.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.newCardScanBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { getPermission(); } }); 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, "请输入正确姓名"); return; } else if (phone.length() < 11 || !isValidPhoneNumber(phone)) { TipUtil.show(NewCardActivity.this, "请输入正确手机号"); return; } else if (!Utils.check(userID)) { TipUtil.show(NewCardActivity.this, "请输入正确身份证号"); return; } else { userCardBean = new UserCardBean(); userCardBean.setUserName(userName); userCardBean.setDate(date); userCardBean.setSerial(adminData.getSerial()); userCardBean.setPhone(phone); userCardBean.setUserID(userID); } } 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 getPermission() { try { XXPermissions.with(this) // 申请单个权限 // .permission(Permission.RECORD_AUDIO) // 申请多个权限 .permission(Permission.CAMERA) // 设置权限请求拦截器(局部设置) //.interceptor(new PermissionInterceptor()) // 设置不触发错误检测机制(局部设置) //.unchecked() .request(new OnPermissionCallback() { @Override public void onGranted(@NonNull List permissions, boolean allGranted) { if (allGranted) { } } @Override public void onDenied(@NonNull List permissions, boolean doNotAskAgain) { if (doNotAskAgain) { // 如果是被永久拒绝就跳转到应用权限系统设置页面 } else { // toast("获取录音和日历权限失败"); } } }); } catch ( Throwable e) { e.printStackTrace(); } } @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: String result = data.getStringExtra("OCRResult"); try { JSONObject jo = new JSONObject(result); // sb.append(String.format("正面 = %s\n", jo.opt("type"))); // sb.append(String.format("姓名 = %s\n", jo.opt("name"))); // sb.append(String.format("性别 = %s\n", jo.opt("sex"))); // sb.append(String.format("民族 = %s\n", jo.opt("folk"))); // sb.append(String.format("日期 = %s\n", jo.opt("birt"))); // sb.append(String.format("号码 = %s\n", jo.opt("num"))); // sb.append(String.format("住址 = %s\n", jo.opt("addr"))); // sb.append(String.format("签发机关 = %s\n", jo.opt("issue"))); // sb.append(String.format("有效期限 = %s\n", jo.opt("valid"))); // sb.append(String.format("整体照片 = %s\n", jo.opt("imgPath"))); // sb.append(String.format("头像路径 = %s\n", jo.opt("headPath"))); newCardBinding.newCardName.setText(jo.opt("name").toString()); newCardBinding.newCardId.setText(jo.opt("num").toString()); newCardBinding.newCardIdTip.setVisibility(View.VISIBLE); } catch (JSONException e) { throw new RuntimeException(e); } break; } } } 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; } }