From d773ab0295feba24ae4fc14f61e8aa310e40f4ba Mon Sep 17 00:00:00 2001
From: zuojincheng <lf_zuo@163.com>
Date: 星期五, 06 六月 2025 16:55:57 +0800
Subject: [PATCH] refactor(nfc): 优化写卡流程和状态更新
---
baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcWriteHelper.java | 364 ++++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 314 insertions(+), 50 deletions(-)
diff --git a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcWriteHelper.java b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcWriteHelper.java
index ef15209..1d89f03 100644
--- a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcWriteHelper.java
+++ b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcWriteHelper.java
@@ -9,8 +9,10 @@
import com.dayu.baselibrary.bean.BaseUserCardCard;
import com.dayu.baselibrary.tools.HexUtil;
+import com.tencent.bugly.crashreport.CrashReport;
import java.io.IOException;
+import java.util.List;
/**
* author: zuo
@@ -23,7 +25,7 @@
private static NativeNfcWriteHelper helper;
- public NativeNfcWriteHelper(Intent intent, Activity activity) {
+ public void setIntent(Intent intent) {
this.tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
}
@@ -35,11 +37,11 @@
*/
public static NativeNfcWriteHelper getInstence(Intent intent, Activity activity) {
if (helper == null) {
- helper = new NativeNfcWriteHelper(intent, activity);
+ helper = new NativeNfcWriteHelper();
}
+ helper.setIntent(intent);
return helper;
}
-
/**
* 鍐欏崱
@@ -47,22 +49,23 @@
* @param userCard 鐢ㄦ埛鍗″唴瀹�
* @param
*/
- public boolean writeUserData(BaseUserCardCard userCard) {
+ @Override
+ public boolean writeUserData(BaseUserCardCard userCard, int sector) {
if (userCard != null) {
- int a = 1;
+ int a = sector;
try {
MifareClassic mfc = MifareClassic.get(tag);
if (null != mfc) {
try {
- //杩炴帴NFC
+ // 杩炴帴NFC
mfc.connect();
- //楠岃瘉鎵囧尯瀵嗙爜
+ // 楠岃瘉鎵囧尯瀵嗙爜
boolean isOpen = false;
for (int i = 0; i < listKeyA.size(); i++) {
if (mfc.authenticateSectorWithKeyA(a, listKeyA.get(i))) {
isOpen = true;
if (listKeyA.get(i).equals(defauleKey)) {
- //褰撳墠涓洪粯璁ょ櫧鍗″瘑鐮佹椂鍐欏崱鏃朵慨鏀瑰瘑鐮�
+ // 褰撳墠涓洪粯璁ょ櫧鍗″瘑鐮佹椂鍐欏崱鏃朵慨鏀瑰瘑鐮�
changePasword(a, mfc);
}
break;
@@ -79,7 +82,7 @@
data = userCard.getTwoBytes();
}
int bIndex = mfc.sectorToBlock(a);
- //鍐欏崱
+ // 鍐欏崱
mfc.writeBlock(bIndex + b, data);
}
return true;
@@ -104,57 +107,62 @@
return false;
}
-
/**
- * 鍐欏崱
+ * 鍐欏崱锛堝甫鍥炶皟锛�
*
- * @param str 涔﹀啓鍐呭锛�16涓瓧鑺�
- * @param a 涔﹀啓鐨勬墖鍖� (浠�0寮�濮嬫暟)
- * @param b 涔﹀啓鐨勫潡(浠�0寮�濮嬫暟)
- * @param
+ * @param userCard 鐢ㄦ埛鍗″唴瀹�
+ * @param sector 鎵囧尯
+ * @param callBack 鍥炶皟鎺ュ彛
*/
- public boolean writeData(byte[] str, int a, int b) {
- Log.i("NFCWreatActivity", "writeData: a=" + a + " b=" + b);
- if (str.length <= 16) {
+ public boolean writeUserData(BaseUserCardCard userCard, int sector, NFCCallBack callBack) {
+ if (userCard != null) {
+ int a = sector;
try {
MifareClassic mfc = MifareClassic.get(tag);
if (null != mfc) {
try {
- //杩炴帴NFC
+ // 杩炴帴NFC
mfc.connect();
- //鑾峰彇鎵囧尯鏁伴噺
- int count = mfc.getSectorCount();
- //濡傛灉浼犺繘鏉ョ殑鎵囧尯澶т簡鎴栬�呭皬浜嗙洿鎺ラ��鍑烘柟娉�
- if (a > count - 1 || a < 0) {
- return false;
- }
- //鑾峰彇鍐欑殑鎵囧尯鐨勫潡鐨勬暟閲�
- int bCount = mfc.getBlockCountInSector(a);
- //濡傛灉杈撳叆鐨勫潡澶т簡鎴栬�呭皬浜嗕篃鏄洿鎺ラ��鍑�
- if (b > bCount - 1 || b < 0) {
- return false;
- }
- //楠岃瘉鎵囧尯瀵嗙爜
+ // 楠岃瘉鎵囧尯瀵嗙爜
boolean isOpen = false;
for (int i = 0; i < listKeyA.size(); i++) {
- if (mfc.authenticateSectorWithKeyA(0, listKeyA.get(i))) {
+ if (mfc.authenticateSectorWithKeyA(a, listKeyA.get(i))) {
isOpen = true;
if (listKeyA.get(i).equals(defauleKey)) {
- //褰撳墠涓洪粯璁ょ櫧鍗″瘑鐮佹椂鍐欏崱鏃朵慨鏀瑰瘑鐮�
+ // 褰撳墠涓洪粯璁ょ櫧鍗″瘑鐮佹椂鍐欏崱鏃朵慨鏀瑰瘑鐮�
changePasword(a, mfc);
}
break;
}
}
if (isOpen) {
- int bIndex = mfc.sectorToBlock(a);
- //鍐欏崱
- mfc.writeBlock(bIndex + b, str);
+ for (int b = 0; b < 3; b++) {
+ byte[] data;
+ if (b == 0) {
+ data = userCard.getZeroBytes();
+ } else if (b == 1) {
+ data = userCard.getOneBytes();
+ } else {
+ data = userCard.getTwoBytes();
+ }
+ int bIndex = mfc.sectorToBlock(a);
+ // 鍐欏崱
+ mfc.writeBlock(bIndex + b, data);
+ }
+ if (callBack != null) {
+ callBack.isSusses(true, "鐢ㄦ埛鏁版嵁鍐欏叆鎴愬姛");
+ }
return true;
+ }
+ if (callBack != null) {
+ callBack.isSusses(false, "鎵囧尯" + a + "瀵嗙爜楠岃瘉澶辫触");
}
return false;
} catch (Exception e) {
e.printStackTrace();
+ if (callBack != null) {
+ callBack.isSusses(false, "鎵囧尯" + a + "鍐欏崱寮傚父: " + e.getMessage());
+ }
return false;
} finally {
try {
@@ -166,50 +174,304 @@
}
} catch (Exception e) {
e.printStackTrace();
+ if (callBack != null) {
+ callBack.isSusses(false, "鍐欏崱寮傚父: " + e.getMessage());
+ }
return false;
+ }
+ } else {
+ if (callBack != null) {
+ callBack.isSusses(false, "鐢ㄦ埛鍗℃暟鎹负绌�");
}
}
return false;
}
+ /**
+ * 鍐欏崱
+ *
+ * @param str 涔﹀啓鍐呭锛�16涓瓧鑺�
+ * @param a 涔﹀啓鐨勬墖鍖� (浠�0寮�濮嬫暟)
+ * @param b 涔﹀啓鐨勫潡(浠�0寮�濮嬫暟)
+ * @param
+ */
+ @Override
+ public boolean writeData(byte[] str, int a, int b) {
+ return writeData(str, a, b, null);
+ }
+
+ @Override
+ public boolean writeData(byte[] str, int a, int b, NFCCallBack callBack) {
+ return writeData(str, a, b, true, null);
+ }
+
+ @Override
+ public boolean writeData(byte[] str, int a, int b, boolean isConnect, NFCCallBack callBack) {
+ Log.i("NFCWreatActivity", "writeData: a=" + a + " b=" + b);
+ if (str.length == 16) {
+ try {
+ MifareClassic mfc = MifareClassic.get(tag);
+ if (null != mfc) {
+ try {
+ // 杩炴帴NFC
+ if (isConnect) {
+ mfc.connect();
+ }
+ // 鑾峰彇鎵囧尯鏁伴噺
+ int count = mfc.getSectorCount();
+ // 濡傛灉浼犺繘鏉ョ殑鎵囧尯澶т簡鎴栬�呭皬浜嗙洿鎺ラ��鍑烘柟娉�
+ if (a > count - 1 || a < 0) {
+ if (callBack != null) {
+ callBack.isSusses(false, "鎵囧尯閿欒--" + a);
+ }
+ return false;
+ }
+ // 鑾峰彇鍐欑殑鎵囧尯鐨勫潡鐨勬暟閲�
+ int bCount = mfc.getBlockCountInSector(a);
+ // 濡傛灉杈撳叆鐨勫潡澶т簡鎴栬�呭皬浜嗕篃鏄洿鎺ラ��鍑�
+ if (b > bCount - 1 || b < 0) {
+ if (callBack != null) {
+ callBack.isSusses(false, "鍧楀尯閿欒--" + b);
+ }
+ return false;
+ }
+ // 楠岃瘉鎵囧尯瀵嗙爜
+ boolean isOpen = false;
+ if (listKeyA.size() != 0) {
+ for (int i = 0; i < listKeyA.size(); i++) {
+ if (mfc.authenticateSectorWithKeyA(0, listKeyA.get(i))) {
+ isOpen = true;
+ if (listKeyA.get(i).equals(defauleKey)) {
+ // 褰撳墠涓洪粯璁ょ櫧鍗″瘑鐮佹椂鍐欏崱鏃朵慨鏀瑰瘑鐮�
+ changePasword(a, mfc);
+ }
+ break;
+ }
+ }
+ } else if (listA_PS.size() != 0 && listA_PS.size() > a) {
+ if (mfc.authenticateSectorWithKeyA(a, defauleKey)) {
+ isOpen = true;
+
+ } else if (mfc.authenticateSectorWithKeyA(a, listA_PS.get(a))) {
+ isOpen = true;
+ }
+ }
+ if (isOpen) {
+ int bIndex = mfc.sectorToBlock(a);
+ // 鍐欏崱
+ mfc.writeBlock(bIndex + b, str);
+ // 鏍¢獙鍐欏叆鏁版嵁鏄惁姝g‘
+ boolean isVerified = true;
+ // 璇诲彇鏁版嵁楠岃瘉
+ byte[] readResult = mfc.readBlock(bIndex + b);
+ if (readResult == null) {
+ if (callBack != null) {
+ callBack.isSusses(false, a + "鎵囧尯鍐欏崱鏃跺啀娆¤鍙栭獙璇佹椂澶辫触");
+ }
+ return false;
+ }
+ for (int i = 0; i < str.length; i++) {
+ if (str[i] != readResult[i]) {
+ isVerified = false;
+ break;
+ }
+ }
+ if (isVerified) {
+ if (callBack != null) {
+ callBack.isSusses(true, "鍐欏叆鎴愬姛骞堕獙璇侀�氳繃");
+ }
+ return true;
+
+ } else {
+ if (callBack != null) {
+ callBack.isSusses(false, "鍐欏叆楠岃瘉澶辫触");
+ }
+ return false;
+ }
+ }
+ if (callBack != null) {
+ callBack.isSusses(false, a + "鎵囧尯瀵嗙爜閿欒");
+ }
+ return false;
+ } catch (Exception e) {
+ e.printStackTrace();
+ if (callBack != null) {
+ callBack.isSusses(false, a + "鎵囧尯鍐欏崱鎶ラ敊" + e.getMessage());
+
+ }
+ return false;
+ } finally {
+ try {
+ mfc.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ if (callBack != null) {
+ callBack.isSusses(false, a + "鎵囧尯鍐欏崱鎶ラ敊" + e.getMessage());
+ }
+ return false;
+ }
+ } else {
+ if (callBack != null) {
+ callBack.isSusses(false, a + "鎵囧尯鍐欏崱鎶ラ敊锛宐yte鏁扮粍澶у皬涓嶄负16");
+ }
+ }
+ return false;
+ }
/**
* 淇敼瀵嗙爜
*
- * @param a 涔﹀啓鐨勬墖鍖�
- * // * @param callback 杩斿洖鐩戝惉
+ * @param 涔﹀啓鐨勬墖鍖�
+ * @param passWord 瀵嗙爜
+ * @return
*/
- public boolean changePasword(int a, MifareClassic mfc) {
+ public boolean changePasword(List<byte[]> passWord, boolean isConnect, boolean isClose, NFCCallBack callBack) {
+ if (passWord == null || passWord.size() != 16) {
+ if (callBack != null) {
+ callBack.isSusses(false, "瀵嗙爜鏁扮粍涓虹┖鎴栭暱搴︿笉涓�16");
+ }
+ return false;
+ }
+ try {
+ MifareClassic mfc = MifareClassic.get(tag);
+ if (mfc == null) {
+ if (callBack != null) {
+ callBack.isSusses(false, "鑾峰彇MifareClassic瀹炰緥澶辫触");
+ }
+ return false;
+ }
+ try {
+ // 杩炴帴NFC
+ if (isConnect) {
+ mfc.connect();
+ }
+ for (int i = 0; i < passWord.size(); i++) {
+ byte[] passWordItem = passWord.get(i);
+ // 楠岃瘉鎵囧尯瀵嗙爜
+ boolean isAuthenticated = false;
+
+ // 灏濊瘯浣跨敤榛樿瀵嗛挜楠岃瘉
+ if (mfc.authenticateSectorWithKeyA(i, defauleKey)) {
+ isAuthenticated = true;
+ } else if (mfc.authenticateSectorWithKeyA(i, listA_PS.get(i))) {
+ continue;
+ }
+ if (!isAuthenticated) {
+ if (callBack != null) {
+ callBack.isSusses(false, "鎵囧尯" + i + "瀵嗙爜楠岃瘉澶辫触");
+ }
+ return false;
+ }
+
+ // 鍑嗗鏁版嵁
+ byte[] data = new byte[16];
+
+ if (passWordItem.length == 16) {
+ // 濡傛灉鏄畬鏁寸殑16瀛楄妭鏁版嵁锛岀洿鎺ヤ娇鐢�
+ System.arraycopy(passWordItem, 0, data, 0, 16);
+ } else if (passWordItem.length == 6) {
+ // 濡傛灉鍙槸6瀛楄妭瀵嗛挜锛屾瀯寤哄畬鏁寸殑鎺у埗鍧�
+ // 灏嗗瘑鐮佽浆鎹负keyA
+ System.arraycopy(passWordItem, 0, data, 0, 6);
+ // 杈撳叆鎺у埗浣�
+ data[6] = (byte) 0xFF;
+ data[7] = (byte) 0x07;
+ data[8] = (byte) 0x80;
+ data[9] = (byte) 0x69;
+ // 灏嗗瘑鐮佷綔涓篕eyB
+ System.arraycopy(passWordItem, 0, data, 10, 6);
+ } else {
+ if (callBack != null) {
+ callBack.isSusses(false, "鎵囧尯" + i + "瀵嗙爜闀垮害涓嶆纭紝搴斾负6瀛楄妭鎴�16瀛楄妭");
+ }
+ return false;
+ }
+
+ // 鑾峰彇鍐欏叆浣嶇疆
+ int bIndex = mfc.sectorToBlock(i);
+ int bCount = mfc.getBlockCountInSector(i);
+
+ try {
+ // 鍐欏埌鎵囧尯鐨勬渶鍚庝竴涓潡(鎺у埗鍧�)
+ mfc.writeBlock(bIndex + bCount - 1, data);
+ } catch (IOException e) {
+ if (callBack != null) {
+ callBack.isSusses(false, "鎵囧尯" + i + "鍐欏叆鎺у埗鍧楀け璐�: " + e.getMessage());
+ }
+ return false;
+ }
+ }
+
+ if (callBack != null) {
+ callBack.isSusses(true, "鎵�鏈夋墖鍖哄瘑鐮佷慨鏀规垚鍔�");
+ }
+ return true;
+ } finally {
+ try {
+ if (isClose) {
+ mfc.close();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ CrashReport.postCatchedException(e);
+ if (callBack != null) {
+ callBack.isSusses(false, "淇敼瀵嗙爜鏃跺彂鐢熷紓甯�: " + e.getMessage());
+ }
+ }
+ return false;
+ }
+
+ /**
+ * 淇敼瀵嗙爜
+ *
+ * @param a 鎵囧尯
+ * @param mfc MifareClassic瀹炰緥
+ * @return
+ */
+ @Override
+ public boolean changePasword(int a, MifareClassic mfc) {
byte[] data = new byte[16];
if (null != mfc) {
try {
-
- //灏嗗瘑鐮佽浆鎹负keyA
+ // 灏嗗瘑鐮佽浆鎹负keyA
byte[] dataA = HexUtil.hexToByteArray(companyKeyA);
for (int i = 0; i < dataA.length; i++) {
data[i] = dataA[i];
}
- //杈撳叆鎺у埗浣�
+ // 杈撳叆鎺у埗浣�
data[6] = (byte) 0xFF;
data[7] = (byte) 0x07;
data[8] = (byte) 0x80;
data[9] = (byte) 0x69;
byte[] dataB = HexUtil.hexToByteArray(companyKeyB);
- //灏嗗瘑鐮佽浆鎹负KeyB
+ // 灏嗗瘑鐮佽浆鎹负KeyB
for (int i = 0; i < dataB.length; i++) {
data[i + 10] = dataB[i];
}
int bIndex = mfc.sectorToBlock(a);
int bCount = mfc.getBlockCountInSector(a);
- //鍐欏埌鎵囧尯鐨勬渶鍚庝竴涓潡
+ // 鍐欏埌鎵囧尯鐨勬渶鍚庝竴涓潡
mfc.writeBlock(bIndex + bCount - 1, data);
+
return true;
} catch (Exception e) {
e.printStackTrace();
+ CrashReport.postCatchedException(e);
+
return false;
}
}
+
return false;
}
@@ -218,20 +480,21 @@
*
* @return
*/
+ @Override
public boolean initCard() {
try {
MifareClassic mfc = MifareClassic.get(tag);
if (null != mfc) {
try {
- //杩炴帴NFC
+ // 杩炴帴NFC
mfc.connect();
- //鑾峰彇鎵囧尯鏁伴噺
+ // 鑾峰彇鎵囧尯鏁伴噺
int count = mfc.getSectorCount();
byte[] data = new byte[16];
String initData = "FFFFFFFFFFFFFF078069FFFFFFFFFFFF";
byte[] initDataBytes = HexUtil.hexToByteArray(initData);
for (int sector = 0; sector < count; sector++) {
- //楠岃瘉鎵囧尯瀵嗙爜
+ // 楠岃瘉鎵囧尯瀵嗙爜
boolean isOpen = false;
for (int i = 0; i < listKeyA.size(); i++) {
if (mfc.authenticateSectorWithKeyA(sector, listKeyA.get(i))) {
@@ -240,7 +503,7 @@
}
}
if (isOpen) {
- //鑾峰彇鍐欑殑鎵囧尯鐨勫潡鐨勬暟閲�
+ // 鑾峰彇鍐欑殑鎵囧尯鐨勫潡鐨勬暟閲�
int blockCount = mfc.getBlockCountInSector(sector);
int blockIndex = mfc.sectorToBlock(sector);
for (int block = 0; block < blockCount; block++) {
@@ -255,7 +518,7 @@
} else {
mfc.writeBlock(blockIndex, initDataBytes);
}
- //鍐欏崱
+ // 鍐欏崱
blockIndex++;
}
}
@@ -278,4 +541,5 @@
}
return false;
}
+
}
--
Gitblit v1.8.0