左晓为主开发手持机充值管理机
添加中安身份证识别相关功能
优化贴卡提示
优化二次确认的按钮样式
添加超时时不在主线程的处理
12个文件已修改
1个文件已添加
239 ■■■■ 已修改文件
app/build.gradle 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/NFCWreatActivity.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/NewCardActivity.java 125 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/ReadCardAcitivy.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/RechargeActivity.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/net/SocketNet.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/view/ConfirmDialog.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/button_custom.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_new_card.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_recharge.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_red_card.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_write_text.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/confirm_dialog.xml 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/build.gradle
@@ -20,9 +20,9 @@
        versionName "2.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
//        ndk{
//            abiFilters 'armeabi-v7a'
//        }
        ndk{
            abiFilters 'armeabi-v7a'
        }
        signingConfig signingConfigs.debug
    }
app/src/main/java/com/dayu/recharge/activity/NFCWreatActivity.java
@@ -437,7 +437,7 @@
                        //00启用01禁用02隶属信息不符03无此卡信息04其它
                        if ("00".equalsIgnoreCase(state)) {
                            rechargeIsOk = true;
                            binding.cardData.setText("充值通信完成,请帖卡充值");
                            binding.cardData.setText("充值"+morny+"元通信完成,请帖卡写卡");
                            rechargeBean = new RechargeBean();
                            rechargeBean.setDate(System.currentTimeMillis());
                            rechargeBean.setMorny(morny);
@@ -480,8 +480,11 @@
                @Override
                public void onSocketError(int code, String msg) {
                    stopAnim();
                    TipUtil.show(NFCWreatActivity.this, msg);
                    runOnUiThread(() -> {
                        stopAnim();
                        TipUtil.show(NFCWreatActivity.this, msg);
                    });
                }
            });
        } catch (Exception e) {
@@ -691,8 +694,11 @@
                @Override
                public void onSocketError(int code, String msg) {
                    stopAnim();
                    TipUtil.show(NFCWreatActivity.this, msg);
                    runOnUiThread(() -> {
                        stopAnim();
                        TipUtil.show(NFCWreatActivity.this, msg);
                    });
                }
            });
        } catch (Exception e) {
app/src/main/java/com/dayu/recharge/activity/NewCardActivity.java
@@ -1,6 +1,5 @@
package com.dayu.recharge.activity;
import android.app.Dialog;
import android.content.Intent;
import android.os.Bundle;
import android.text.InputFilter;
@@ -30,18 +29,22 @@
import com.dayu.recharge.utils.DeviceNumberUtils;
import com.dayu.recharge.utils.SocketUtil;
import com.dayu.recharge.utils.TipUtil;
import com.dayu.recharge.utils.ToastUtil;
import com.dayu.recharge.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 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,
@@ -95,13 +98,10 @@
            ) {
                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);
@@ -116,6 +116,69 @@
                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) {
@@ -199,29 +262,28 @@
        if (resultCode == RESULT_OK) {
            switch (requestCode) {
                case SCAN_IDCARD_REQUEST:
                    String result = data.getStringExtra("OCRResult");
                    try {
                        JSONObject jo = new JSONObject(result);
                        //跳转扫描界面识别完成之后,数据回传
                        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);
                            }
//                    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);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    break;
            }
        }
@@ -270,7 +332,7 @@
        initCardRequestBean.setPhone(phoneBuffer.toString());
        String userId = userCardBean.getUserID();
        initCardRequestBean.setIdCard(SocketUtil.str2HexStr(userId));
        SocketNet.getInstance().sendTestMessage(initCardRequestBean.pack(), "93",new SocketCallBack() {
        SocketNet.getInstance().sendTestMessage(initCardRequestBean.pack(), "93", new SocketCallBack() {
            @Override
            public void onSocketResponse(SocketData readData) {
@@ -323,8 +385,11 @@
            @Override
            public void onSocketError(int code, String msg) {
                ProgressDialog.dismiss();
                TipUtil.show(NewCardActivity.this, msg);
                runOnUiThread(() -> {
                    ProgressDialog.dismiss();
                    TipUtil.show(NewCardActivity.this, msg);
                });
            }
        });
app/src/main/java/com/dayu/recharge/activity/ReadCardAcitivy.java
@@ -215,7 +215,7 @@
        requestBean.setInitCode(initCode);
        requestBean.setInitPeasantCode(initPeasantCode);
        requestBean.setXuLie(SocketUtil.getXuLie(this));
        SocketNet.getInstance().sendTestMessage(requestBean.pack(), "94",new SocketCallBack() {
        SocketNet.getInstance().sendTestMessage(requestBean.pack(), "94", new SocketCallBack() {
            @Override
            public void onSocketResponse(SocketData readData) {
                if (CRC8.isCRC8(readData.getOriginDataBytes())) {
@@ -271,8 +271,11 @@
            @Override
            public void onSocketError(int code, String msg) {
                stopAnim();
                TipUtil.show(ReadCardAcitivy.this, msg);
                runOnUiThread(() -> {
                    stopAnim();
                    TipUtil.show(ReadCardAcitivy.this, msg);
                });
            }
        });
    }
app/src/main/java/com/dayu/recharge/activity/RechargeActivity.java
@@ -167,12 +167,12 @@
            requestBean.setInitCode(initCode);
            requestBean.setInitPeasantCode(initPeasantCode);
            requestBean.setXuLie(SocketUtil.getXuLie(this));
            SocketNet.getInstance().sendTestMessage(requestBean.pack(),"94", new SocketCallBack() {
            SocketNet.getInstance().sendTestMessage(requestBean.pack(), "94", new SocketCallBack() {
                @Override
                public void onSocketResponse(SocketData readData) {
                    ProgressDialog.dismiss();
                    if (CRC8.isCRC8(readData.getOriginDataBytes())) {
                        StringBuffer stateText ;
                        StringBuffer stateText;
                        try {
                            stateText = new StringBuffer();
                            String state = BcdUtil.bcdToStr(readData.getBodyBytes()[2]);  //BCD码00启用 01禁用 02隶属信息不符 03无此卡信息 04其它s
@@ -233,8 +233,10 @@
                @Override
                public void onSocketError(int code, String msg) {
                    ProgressDialog.dismiss();
                    TipUtil.show(RechargeActivity.this, msg);
                    runOnUiThread(() -> {
                        ProgressDialog.dismiss();
                        TipUtil.show(RechargeActivity.this, msg);
                    });
                }
            });
        } catch (Exception e) {
app/src/main/java/com/dayu/recharge/net/SocketNet.java
@@ -1,8 +1,10 @@
package com.dayu.recharge.net;
import android.app.Activity;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Looper;
import android.text.TextUtils;
import android.util.Log;
@@ -19,6 +21,8 @@
import com.easysocket.interfaces.conn.SocketActionListener;
import com.easysocket.utils.HexUtil;
import com.tencent.bugly.crashreport.CrashReport;
import java.util.logging.Handler;
/**
@@ -39,10 +43,8 @@
    public static SocketNet getInstance() {
        if (socketNet == null) {
            socketNet = new SocketNet();
            if (socketNet.socketActionListener != null) {
            }
        }
        return socketNet;
    }
@@ -66,7 +68,7 @@
                        try {
                            mSender = null;
                            myCallBack=null;
                            myCallBack = null;
                            Log.i("SocketActionListener", "SimpleCallBack收到数据-->" + HexUtil.bytesToHex(data.getBodyBytes()));
                            SocketData socketData = new SocketData();
                            socketData.setBodyData(data.getBodyBytes());
@@ -76,7 +78,7 @@
                                callBack.onSocketResponse(socketData);
                            }
                        } catch (Exception e) {
                         e.printStackTrace();
                            e.printStackTrace();
                        }
                    }
@@ -84,20 +86,22 @@
                    public void onError(Exception e) {
                        super.onError(e);
                        mSender = null;
                        myCallBack=null;
                        myCallBack = null;
                        try {
                            if (e instanceof RequestTimeOutException) {
                                // 在这里执行需要在主线程中执行的操作
                                callBack.onSocketError(-3, "请求超时,正在重试");
                                //超时后重新连接
                                EasySocket.getInstance().disconnect(true);
                            }
                        } catch (Exception ex) {
                            throw new RuntimeException(ex);
                        }
                    }
                });
            } else {
                callBack.onSocketError(-2, "与服务器连接断开,请检查网络,或者稍后再试");
                callBack.onSocketError(-2, "与服务器连接断开,请检查网络稍后再试");
                MyApplication.myApplication.initEasySocket(false, null);
            }
        } else {
app/src/main/java/com/dayu/recharge/view/ConfirmDialog.java
@@ -4,6 +4,7 @@
import android.app.Dialog;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.NonNull;
@@ -39,8 +40,8 @@
        getWindow().setGravity(Gravity.CENTER);
        setContentView(R.layout.confirm_dialog);
        setCanceledOnTouchOutside(false);
        TextView cannel = (TextView) this.findViewById(R.id.confirm_cancel);
        TextView ok = (TextView) this.findViewById(R.id.confirm_ok);
        Button cannel = (Button) this.findViewById(R.id.confirm_cancel);
        Button ok = (Button) this.findViewById(R.id.confirm_ok);
        cannel.setOnClickListener(v -> ConfirmDialog.this.dismiss());
        if (mListner == null) {
            ok.setOnClickListener((View v) -> {
app/src/main/res/drawable/button_custom.xml
New file
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 按钮按下时的状态 -->
    <item android:state_pressed="true">
        <shape android:shape="rectangle">
            <solid android:color="#DCDCDC"/> <!-- 按钮按下时的背景颜色 -->
            <corners android:radius="10dp"/> <!-- 圆角半径 -->
        </shape>
    </item>
    <!-- 默认状态 -->
    <item>
        <shape android:shape="rectangle">
            <solid android:color="#DCDCDC"/> <!-- 按钮默认的背景颜色 -->
            <corners android:radius="10dp"/> <!-- 圆角半径 -->
        </shape>
    </item>
</selector>
app/src/main/res/layout/activity_new_card.xml
@@ -67,7 +67,7 @@
                    android:id="@+id/newCard_scanBtn"
                    android:layout_width="45dp"
                    android:layout_height="45dp"
                    android:visibility="gone"
                    android:visibility="visible"
                    android:padding="10dp"
                    android:src="@mipmap/icon_scan" />
app/src/main/res/layout/activity_recharge.xml
@@ -25,7 +25,7 @@
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:gravity="center"
            android:text="请将卡贴在设备上进行读卡"
            android:text="请将卡贴在设备顶部进行读卡"
            android:textSize="@dimen/text_size" />
        <ImageView
app/src/main/res/layout/activity_red_card.xml
@@ -149,7 +149,7 @@
            android:layout_below="@id/titleBar"
            android:layout_marginTop="20dp"
            android:gravity="center"
            android:text="请将卡贴在设备上进行读卡"
            android:text="请将卡贴在设备顶部进行读卡"
            android:textSize="@dimen/text_size" />
app/src/main/res/layout/activity_write_text.xml
@@ -32,7 +32,7 @@
        android:layout_below="@id/cardData"
        android:layout_marginTop="20dp"
        android:gravity="center"
        android:text="请将卡贴在设备上进行写卡"
        android:text="请将卡贴在设备顶部进行写卡"
        android:textSize="@dimen/text_size" />
app/src/main/res/layout/confirm_dialog.xml
@@ -18,10 +18,9 @@
            android:id="@+id/confirm_data"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="22sp"
            android:textColor="#000000"
            android:text="确认退出吗?"
            />
            android:textColor="#000000"
            android:textSize="22sp" />
        <LinearLayout
@@ -29,31 +28,33 @@
            android:layout_height="wrap_content"
            android:orientation="horizontal">
            <TextView
            <Button
                android:id="@+id/confirm_cancel"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="20dp"
                android:background="@drawable/ws_login_red_btn_one"
                android:paddingLeft="15dp"
                android:paddingLeft="30dp"
                android:paddingTop="5dp"
                android:paddingRight="15dp"
                android:background="@drawable/button_custom"
                android:paddingRight="30dp"
                android:paddingBottom="5dp"
                android:text="取消"
                android:textColor="#000000"
                android:textSize="@dimen/text_size" />
            <TextView
            <Button
                android:id="@+id/confirm_ok"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="100dp"
                android:background="@drawable/button_custom"
                android:layout_marginLeft="70dp"
                android:layout_marginTop="20dp"
                android:background="@drawable/ws_login_red_btn_one"
                android:paddingLeft="15dp"
                android:paddingLeft="30dp"
                android:paddingTop="5dp"
                android:paddingRight="15dp"
                android:paddingRight="30dp"
                android:paddingBottom="5dp"
                android:text="确认"
                android:textColor="#000000"
                android:textSize="@dimen/text_size" />
        </LinearLayout>