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 | 137 +++++++++++++++++++++++++++++++++++----------
1 files changed, 105 insertions(+), 32 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 ba9a494..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
@@ -25,7 +25,6 @@
private static NativeNfcWriteHelper helper;
-
public void setIntent(Intent intent) {
this.tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
}
@@ -44,7 +43,6 @@
return helper;
}
-
/**
* 鍐欏崱
*
@@ -59,15 +57,15 @@
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;
@@ -84,7 +82,7 @@
data = userCard.getTwoBytes();
}
int bIndex = mfc.sectorToBlock(a);
- //鍐欏崱
+ // 鍐欏崱
mfc.writeBlock(bIndex + b, data);
}
return true;
@@ -109,6 +107,85 @@
return false;
}
+ /**
+ * 鍐欏崱锛堝甫鍥炶皟锛�
+ *
+ * @param userCard 鐢ㄦ埛鍗″唴瀹�
+ * @param sector 鎵囧尯
+ * @param callBack 鍥炶皟鎺ュ彛
+ */
+ 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
+ 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;
+ }
+ }
+ if (isOpen) {
+ 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 {
+ mfc.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ if (callBack != null) {
+ callBack.isSusses(false, "鍐欏崱寮傚父: " + e.getMessage());
+ }
+ return false;
+ }
+ } else {
+ if (callBack != null) {
+ callBack.isSusses(false, "鐢ㄦ埛鍗℃暟鎹负绌�");
+ }
+ }
+ return false;
+ }
/**
* 鍐欏崱
@@ -136,36 +213,36 @@
MifareClassic mfc = MifareClassic.get(tag);
if (null != mfc) {
try {
- //杩炴帴NFC
+ // 杩炴帴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;
@@ -181,7 +258,7 @@
}
if (isOpen) {
int bIndex = mfc.sectorToBlock(a);
- //鍐欏崱
+ // 鍐欏崱
mfc.writeBlock(bIndex + b, str);
// 鏍¢獙鍐欏叆鏁版嵁鏄惁姝g‘
boolean isVerified = true;
@@ -246,16 +323,15 @@
return false;
}
-
/**
* 淇敼瀵嗙爜
*
- * @param 涔﹀啓鐨勬墖鍖�
+ * @param 涔﹀啓鐨勬墖鍖�
* @param passWord 瀵嗙爜
* @return
*/
- public boolean changePasword( List<byte[]> passWord, boolean isConnect, boolean isClose, NFCCallBack callBack) {
- if (passWord == null || passWord.size()!=16) {
+ 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");
}
@@ -276,7 +352,7 @@
mfc.connect();
}
for (int i = 0; i < passWord.size(); i++) {
- byte [] passWordItem = passWord.get(i);
+ byte[] passWordItem = passWord.get(i);
// 楠岃瘉鎵囧尯瀵嗙爜
boolean isAuthenticated = false;
@@ -358,7 +434,7 @@
/**
* 淇敼瀵嗙爜
*
- * @param a 鎵囧尯
+ * @param a 鎵囧尯
* @param mfc MifareClassic瀹炰緥
* @return
*/
@@ -367,24 +443,24 @@
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;
@@ -399,8 +475,6 @@
return false;
}
-
-
/**
* 鍒濆鍖栧崱
*
@@ -412,15 +486,15 @@
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))) {
@@ -429,7 +503,7 @@
}
}
if (isOpen) {
- //鑾峰彇鍐欑殑鎵囧尯鐨勫潡鐨勬暟閲�
+ // 鑾峰彇鍐欑殑鎵囧尯鐨勫潡鐨勬暟閲�
int blockCount = mfc.getBlockCountInSector(sector);
int blockIndex = mfc.sectorToBlock(sector);
for (int block = 0; block < blockCount; block++) {
@@ -444,7 +518,7 @@
} else {
mfc.writeBlock(blockIndex, initDataBytes);
}
- //鍐欏崱
+ // 鍐欏崱
blockIndex++;
}
}
@@ -467,6 +541,5 @@
}
return false;
}
-
}
--
Gitblit v1.8.0