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>