左晓为主开发手持机充值管理机
zuoxiao
2023-12-04 1057af10a464e70d10b8a90315d0ecec6a7cb205
app/src/main/java/com/dayu/recharge/activity/NewCardActivity.java
@@ -1,13 +1,18 @@
package com.dayu.recharge.activity;
import android.Manifest;
import android.app.Dialog;
import android.app.ProgressDialog;
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 com.dayu.recharge.utils.DeviceNumberUtils;
import com.dayu.recharge.view.ProgressDialog;
import com.msd.ocr.idcard.LibraryInitOCR;
import com.dayu.recharge.MyApplication;
import com.dayu.recharge.card.UserCard;
import com.dayu.recharge.databinding.ActivityNewCardBinding;
@@ -24,8 +29,11 @@
import com.dayu.recharge.tools.Utils;
import com.dayu.recharge.utils.CRC8;
import com.dayu.recharge.utils.SocketUtil;
import com.dayu.recharge.utils.ToastUtil;
import com.dayu.recharge.utils.WSHelper;
import com.dayu.recharge.utils.TipUtil;
import com.permissionx.guolindev.PermissionX;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.Arrays;
@@ -37,7 +45,7 @@
 */
public class NewCardActivity extends BaseNfcActivity {
    public static final int SCAN_IDCARD_REQUEST = 1;
    UserCardBean userCardBean;
    Dialog dialog;
@@ -54,9 +62,21 @@
        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) {
                rxPermission();
            }
        });
        newCardBinding.newCardRegistBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
@@ -71,16 +91,15 @@
                        && !TextUtils.isEmpty(phone) && !TextUtils.isEmpty(userID)
                ) {
                    if (userName.length() <= 1 || !validateName(userName)) {
                        ToastUtil.show(NewCardActivity.this, "请输入正确姓名");
                        TipUtil.show(NewCardActivity.this, "请输入正确姓名");
                        return;
                    } else if (phone.length() < 11) {
                        ToastUtil.show(NewCardActivity.this, "请输入正确手机号");
                        TipUtil.show(NewCardActivity.this, "请输入正确手机号");
                        return;
                    } else if (!Utils.check(userID)) {
                        ToastUtil.show(NewCardActivity.this, "请输入正确身份证号");
                        TipUtil.show(NewCardActivity.this, "请输入正确身份证号");
                        return;
                    } else {
                        dialog = ProgressDialog.show(NewCardActivity.this, "", "正在通信请稍后", true, true);
                        userCardBean = new UserCardBean();
                        userCardBean.setUserName(userName);
                        userCardBean.setDate(date);
@@ -91,10 +110,71 @@
                    }
                } else {
                    ToastUtil.show(NewCardActivity.this, "请输入完整内容");
                    TipUtil.show(NewCardActivity.this, "请输入完整内容");
                }
            }
        });
    }
    private void rxPermission() {
        PermissionX.init(NewCardActivity.this).permissions(Manifest.permission.CAMERA)
                .onExplainRequestReason((scope, deniedList) -> {
// val message = "PermissionX需要您同意以下权限才能正常使用"
                })
                .request((allGranted, grantedList, deniedList) -> {
                    if (allGranted) {//所有申请的权限都已通过
                        startCamera();
                    } else {//您拒绝了如下权限:$deniedList
                    }
                });
    }
    private void startCamera() {
        Bundle bundle = new Bundle();
        bundle.putBoolean("saveImage", false);
        bundle.putInt("requestCode", SCAN_IDCARD_REQUEST);
        bundle.putInt("type", 0); //0身份证, 1驾驶证
        LibraryInitOCR.startScan(NewCardActivity.this, bundle);
    }
    @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() {
@@ -113,10 +193,10 @@
     * 开卡报文
     */
    private void initCard() {
        String initCode = WSHelper.getInstance(this).get("initCode", "");
        ProgressDialog.show(this);
        String initCode = DeviceNumberUtils.getDeviceNumber();
        if (TextUtils.isEmpty(initCode)) {
            ToastUtil.show(this, "设备注册号为空,请先设置IP和管理员地址");
            TipUtil.show(this, "设备注册号为空,请先设置IP和管理员地址");
            IpBean ipBean = baseDao.ipDao().findFirst();
            if (ipBean != null && adminData != null) {
                MyApplication.myApplication.initMachineRequestBean(ipBean.getIp(), ipBean.getPort(), adminData.getAddressCode());
@@ -143,7 +223,7 @@
            @Override
            public void onSocketResponse(SocketData readData) {
                dialog.dismiss();
                ProgressDialog.dismiss();
                if (CRC8.isCRC8(readData.getOriginDataBytes())) {
                    String state = BcdUtil.bcdToStr(readData.getBodyBytes()[26]); //BCD码00成功01身份证已注册02其他原因失败
@@ -172,26 +252,27 @@
                        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")) {
                        ToastUtil.show(NewCardActivity.this, "开卡报文--身份证已注册");
                        TipUtil.show(NewCardActivity.this, "开卡报文--身份证已注册");
                    } else if (state.equalsIgnoreCase("02")) {
                        ToastUtil.show(NewCardActivity.this, "开卡报文--其他原因失败");
                        TipUtil.show(NewCardActivity.this, "开卡报文--其他原因失败");
                    }
                } else {
                    //校验CRC错误
                    ToastUtil.show(NewCardActivity.this, "开卡报文校验CRC错误");
                    TipUtil.show(NewCardActivity.this, "开卡报文校验CRC错误");
                }
            }
            @Override
            public void onSocketError(int code, String msg) {
                dialog.dismiss();
                ToastUtil.show(NewCardActivity.this, msg);
                ProgressDialog.dismiss();
                TipUtil.show(NewCardActivity.this, msg);
            }
        });
@@ -203,4 +284,46 @@
        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;
    }
}