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.activity.BaseActivity; 
 | 
import com.dayu.baselibrary.activity.BaseNfcActivity; 
 | 
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.UserCardHN; 
 | 
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 HNBaseActivity { 
 | 
  
 | 
    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<String> permissions, boolean allGranted) { 
 | 
                            if (allGranted) {//所有申请的权限都已通过 
 | 
                                startCamera(); 
 | 
                            } 
 | 
                    } 
 | 
  
 | 
                    @Override 
 | 
                    public void onDenied(@NonNull List<String> 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(); 
 | 
                        UserCardHN userCard = new UserCardHN(); 
 | 
                        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; 
 | 
    } 
 | 
  
 | 
} 
 |