From 14b15539a8fbbce1145197993e0c062400174ef1 Mon Sep 17 00:00:00 2001
From: zuoxiao <lf_zuo@163.com>
Date: 星期四, 26 六月 2025 16:51:12 +0800
Subject: [PATCH] docs(baselibrary): 更新 NativeNfcReadHelper 类文档
---
baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcReadHelper.java | 360 +++++++++++++++++++++++++++++++++++++++++------------------
1 files changed, 248 insertions(+), 112 deletions(-)
diff --git a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcReadHelper.java b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcReadHelper.java
index 3bb0206..189ba9d 100644
--- a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcReadHelper.java
+++ b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcReadHelper.java
@@ -7,8 +7,6 @@
import android.nfc.tech.MifareClassic;
import android.util.Log;
-import androidx.annotation.NonNull;
-
import com.dayu.baselibrary.bean.BaseManagerToUserCard;
import com.dayu.baselibrary.bean.BaseUserCardCard;
import com.dayu.baselibrary.tools.HexUtil;
@@ -22,28 +20,56 @@
import java.util.Map;
/**
- * author: zuo
- * Date: 2024-09-25
- * Time: 10:33
- * 澶囨敞锛氬師鐢熻鍐欏崱鏂瑰紡
+ * 鍘熺敓NFC璇诲崱宸ュ叿绫�
+ *
+ * 鍔熻兘璇存槑锛�
+ * 1. 浣跨敤Android鍘熺敓NFC API璇诲彇Mifare Classic鍗$墖鏁版嵁
+ * 2. 鏀寔璇诲彇鐢ㄦ埛鍗′俊鎭�佺鐞嗗崱淇℃伅銆佸崱鍙枫�佸崱绫诲瀷绛�
+ * 3. 鏀寔鎵囧尯绾у埆鐨勬暟鎹鍙栧拰楠岃瘉
+ * 4. 鎻愪緵澶氱瀵嗛挜楠岃瘉鏂瑰紡锛圞eyA楠岃瘉锛�
+ * 5. 鏀寔鍗曚緥妯″紡锛岀‘淇濊祫婧愭纭鐞�
+ *
+ * 浣跨敤鍦烘櫙锛�
+ * - 鐢ㄦ埛鍗′俊鎭鍙�
+ * - 绠$悊鍗′俊鎭鍙�
+ * - 鍗$墖绫诲瀷璇嗗埆
+ * - 鍗″彿鑾峰彇
+ * - 鎵囧尯鏁版嵁璇诲彇
+ *
+ * 娉ㄦ剰浜嬮」锛�
+ * - 闇�瑕佺‘淇漀FC鍔熻兘宸插紑鍚�
+ * - 璇诲彇鍓嶉渶瑕佽繘琛屽瘑閽ラ獙璇�
+ * - 浣跨敤瀹屾瘯鍚庨渶瑕佸叧闂繛鎺ワ紝閲婃斁璧勬簮
+ * - 寮傚父鎯呭喌涓嬭姝g‘澶勭悊杩炴帴鍏抽棴
+ *
+ * @author zuo
+ * @date 2024-09-25
+ * @time 10:33
*/
public class NativeNfcReadHelper extends BaseNfcReadHelper {
+
+ /** NFC鏍囩瀵硅薄锛屽寘鍚崱鐗囩殑鍩烘湰淇℃伅 */
private Tag tag;
- // private NFCCallback callback;
+
+ /** 鍗曚緥瀹炰緥 */
private static NativeNfcReadHelper helper;
-
+ /**
+ * 璁剧疆Intent锛屼粠涓彁鍙朜FC鏍囩淇℃伅
+ *
+ * @param intent 鍖呭惈NFC鏍囩淇℃伅鐨処ntent
+ */
@Override
public void setIntent(Intent intent) {
this.tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
}
-
/**
- * 鍗曚緥鍒濆鍖�
- *
- * @param intent
- * @return
+ * 鑾峰彇鍗曚緥瀹炰緥
+ *
+ * @param intent 鍖呭惈NFC鏍囩淇℃伅鐨処ntent
+ * @param activity 褰撳墠Activity瀹炰緥
+ * @return NativeNfcReadHelper瀹炰緥
*/
public static NativeNfcReadHelper getInstence(Intent intent, Activity activity) {
if (helper == null) {
@@ -53,15 +79,29 @@
return helper;
}
-
- public BaseUserCardCard getUserCardData( BaseUserCardCard userCardCard) {
+ /**
+ * 鑾峰彇鐢ㄦ埛鍗℃暟鎹紙榛樿浠庢墖鍖�1璇诲彇锛�
+ *
+ * @param userCardCard 鐢ㄦ埛鍗℃暟鎹ā鏉垮璞★紝鐢ㄤ簬瑙f瀽璇诲彇鐨勫瓧鑺傛暟鎹�
+ * @return 瑙f瀽鍚庣殑鐢ㄦ埛鍗℃暟鎹璞★紝澶辫触杩斿洖null
+ */
+ public BaseUserCardCard getUserCardData(BaseUserCardCard userCardCard) {
return getUserCardData(1, userCardCard);
}
/**
- * 鑾峰彇鐢ㄦ埛鍗′俊鎭�
- *
- * @return
+ * 浠庢寚瀹氭墖鍖鸿幏鍙栫敤鎴峰崱淇℃伅
+ *
+ * 璇诲彇娴佺▼锛�
+ * 1. 寤虹珛NFC杩炴帴
+ * 2. 浣跨敤瀵嗛挜楠岃瘉鎵囧尯璁块棶鏉冮檺
+ * 3. 璇诲彇鎵囧尯鍐呮墍鏈夊潡鐨勬暟鎹�
+ * 4. 灏嗗瓧鑺傛暟鎹В鏋愪负鐢ㄦ埛鍗″璞�
+ * 5. 鍏抽棴杩炴帴骞惰繑鍥炵粨鏋�
+ *
+ * @param sectorIndex 瑕佽鍙栫殑鎵囧尯绱㈠紩锛堜粠0寮�濮嬶級
+ * @param userCardCard 鐢ㄦ埛鍗℃暟鎹ā鏉垮璞�
+ * @return 瑙f瀽鍚庣殑鐢ㄦ埛鍗℃暟鎹璞★紝澶辫触杩斿洖null
*/
@Override
public BaseUserCardCard getUserCardData(int sectorIndex, BaseUserCardCard userCardCard) {
@@ -71,15 +111,17 @@
MifareClassic mfc = MifareClassic.get(tag);
if (null != mfc) {
try {
- //閾炬帴NFC
+ // 寤虹珛NFC杩炴帴
mfc.connect();
- //鐢ㄤ簬鍒ゆ柇鏃跺�欐湁鍐呭璇诲彇鍑烘潵
+ // 鐢ㄤ簬鍒ゆ柇鏄惁鏈夊唴瀹硅鍙栧嚭鏉�
boolean flag = false;
List<byte[]> list = new ArrayList<>();
- //楠岃瘉鎵囧尯瀵嗙爜锛屽惁鍒欎細鎶ラ敊锛堥摼鎺ュけ璐ラ敊璇級
+
+ // 楠岃瘉鎵囧尯瀵嗙爜锛屽惁鍒欎細鎶ラ敊锛堣繛鎺ュけ璐ラ敊璇級
boolean isOpen = false;
if (!listKeyA.isEmpty()) {
+ // 閬嶅巻鎵�鏈夊彲鐢ㄧ殑KeyA瀵嗛挜杩涜楠岃瘉
for (int i = 0; i < listKeyA.size(); i++) {
if (mfc.authenticateSectorWithKeyA(sectorIndex, listKeyA.get(i))) {
isOpen = true;
@@ -87,20 +129,22 @@
}
}
} else if (!listA_PS.isEmpty()) {
+ // 浣跨敤榛樿瀵嗛挜鎴栫壒瀹氭墖鍖哄瘑閽ヨ繘琛岄獙璇�
if (mfc.authenticateSectorWithKeyA(sectorIndex, defauleKey)) {
isOpen = true;
} else if (mfc.authenticateSectorWithKeyA(sectorIndex, listA_PS.get(sectorIndex))) {
isOpen = true;
}
}
+
if (isOpen) {
- //鑾峰彇鎵囧尯閲岄潰鍧楃殑鏁伴噺
+ // 鑾峰彇鎵囧尯閲岄潰鍧楃殑鏁伴噺
int bCount = mfc.getBlockCountInSector(sectorIndex);
- //鑾峰彇鎵囧尯绗竴涓潡瀵瑰簲鑺墖瀛樺偍鍣ㄧ殑浣嶇疆锛堟垜鏄繖鏍风悊瑙g殑锛屽洜涓虹0鎵囧尯鐨勮繖涓�兼槸4鑰屼笉鏄�0锛�
+ // 鑾峰彇鎵囧尯绗竴涓潡瀵瑰簲鑺墖瀛樺偍鍣ㄧ殑浣嶇疆
int bIndex = mfc.sectorToBlock(sectorIndex);
- //String data1 = "";
+
+ // 璇诲彇鎵囧尯鍐呮墍鏈夊潡鐨勬暟鎹�
for (int j = 0; j < bCount; j++) {
- //璇诲彇鏁版嵁
byte[] data = null;
try {
data = mfc.readBlock(bIndex);
@@ -114,6 +158,7 @@
}
if (flag) {
+ // 灏嗚鍙栫殑瀛楄妭鏁版嵁瑙f瀽涓虹敤鎴峰崱瀵硅薄
userCard = userCardCard.getBean(list);
return userCard;
}
@@ -122,6 +167,7 @@
} catch (Exception e) {
e.printStackTrace();
} finally {
+ // 纭繚杩炴帴琚纭叧闂紝閲婃斁璧勬簮
try {
mfc.close();
} catch (Exception e) {
@@ -133,7 +179,13 @@
return null;
}
-
+ /**
+ * 鑾峰彇鍗$墖绫诲瀷
+ *
+ * 璇诲彇鎵囧尯1绗竴涓潡鐨勭涓�涓瓧鑺備綔涓哄崱鐗囩被鍨嬫爣璇�
+ *
+ * @return 鍗$墖绫诲瀷鐨勫崄鍏繘鍒跺瓧绗︿覆锛屽け璐ヨ繑鍥為敊璇爜
+ */
@Override
public String getCradType() {
MifareClassic mfc = MifareClassic.get(tag);
@@ -141,27 +193,31 @@
try {
mfc.connect();
boolean isOpen = false;
+
+ // 浣跨敤KeyA瀵嗛挜楠岃瘉鎵囧尯1鐨勮闂潈闄�
for (int i = 0; i < listKeyA.size(); i++) {
if (mfc.authenticateSectorWithKeyA(1, listKeyA.get(i))) {
isOpen = true;
break;
}
}
+
if (isOpen) {
+ // 璇诲彇鎵囧尯1绗竴涓潡鐨勬暟鎹�
int bIndex = mfc.sectorToBlock(1);
byte[] data = mfc.readBlock(bIndex + 0);
if (data != null && data.length > 0) {
+ // 灏嗙涓�涓瓧鑺傝浆鎹负鍗佸叚杩涘埗瀛楃涓蹭綔涓哄崱鐗囩被鍨�
String hex = HexUtil.byteToHex(data[0]);
Log.i("NFCWreatActivity", "hex===" + hex);
return hex;
}
-
} else {
Log.i("NFCWreatActivity", "isOpen===" + isOpen);
- return BaseCommon.CARD_TYPE_ERROR2;
+ return BaseCommon.CARD_TYPE_ERROR2; // 瀵嗛挜楠岃瘉澶辫触
}
} catch (IOException e) {
- return BaseCommon.CARD_TYPE_ERROR1;
+ return BaseCommon.CARD_TYPE_ERROR1; // IO寮傚父
} finally {
try {
mfc.close();
@@ -175,8 +231,10 @@
/**
* 璇诲彇NFC鍗$殑鍏ㄩ儴淇℃伅
- *
- * @param callback
+ *
+ * 閬嶅巻鎵�鏈夋墖鍖猴紝璇诲彇姣忎釜鎵囧尯鐨勬墍鏈夊潡鏁版嵁
+ *
+ * @param callback 鏁版嵁璇诲彇瀹屾垚鍚庣殑鍥炶皟鎺ュ彛
*/
@Override
public void getAllData(final NFCCallMapback callback) {
@@ -184,17 +242,19 @@
MifareClassic mfc = MifareClassic.get(tag);
if (null != mfc) {
try {
- //閾炬帴NFC
+ // 寤虹珛NFC杩炴帴
mfc.connect();
- //鑾峰彇鎵囧尯鏁伴噺
+ // 鑾峰彇鎵囧尯鏁伴噺
int count = mfc.getSectorCount();
- //瀛樺偍绌洪棿
+ // 瀛樺偍绌洪棿澶у皬
int size = mfc.getSize();
- //鐢ㄤ簬鍒ゆ柇鏃跺�欐湁鍐呭璇诲彇鍑烘潵
+ // 鐢ㄤ簬鍒ゆ柇鏄惁鏈夊唴瀹硅鍙栧嚭鏉�
boolean flag = false;
+
+ // 閬嶅巻鎵�鏈夋墖鍖�
for (int i = 0; i < count; i++) {
List<byte[]> list = new ArrayList<>();
- //楠岃瘉鎵囧尯瀵嗙爜锛屽惁鍒欎細鎶ラ敊锛堥摼鎺ュけ璐ラ敊璇級
+ // 楠岃瘉鎵囧尯瀵嗙爜
boolean isOpen = false;
for (int j = 0; j < listKeyA.size(); j++) {
if (mfc.authenticateSectorWithKeyA(i, listKeyA.get(i))) {
@@ -202,14 +262,15 @@
break;
}
}
+
if (isOpen) {
- //鑾峰彇鎵囧尯閲岄潰鍧楃殑鏁伴噺
+ // 鑾峰彇鎵囧尯閲岄潰鍧楃殑鏁伴噺
int bCount = mfc.getBlockCountInSector(i);
- //鑾峰彇鎵囧尯绗竴涓潡瀵瑰簲鑺墖瀛樺偍鍣ㄧ殑浣嶇疆锛堟垜鏄繖鏍风悊瑙g殑锛屽洜涓虹0鎵囧尯鐨勮繖涓�兼槸4鑰屼笉鏄�0锛�
+ // 鑾峰彇鎵囧尯绗竴涓潡瀵瑰簲鑺墖瀛樺偍鍣ㄧ殑浣嶇疆
int bIndex = mfc.sectorToBlock(i);
- //String data1 = "";
+
+ // 璇诲彇鎵囧尯鍐呮墍鏈夊潡鐨勬暟鎹�
for (int j = 0; j < bCount; j++) {
- //璇诲彇鏁版嵁
byte[] data = null;
try {
data = mfc.readBlock(bIndex);
@@ -223,6 +284,7 @@
}
map.put(i + "", list);
}
+
if (flag) {
callback.callBack(map);
} else {
@@ -244,30 +306,31 @@
}
}
-
/**
- * 鑾峰彇1鎵囧尯淇℃伅
- *
- * @param callback
+ * 鑾峰彇鎵囧尯1鐨勪俊鎭�
+ *
+ * 涓撻棬鐢ㄤ簬璇诲彇鎵囧尯1鐨勬墍鏈夊潡鏁版嵁锛岄�氬父鐢ㄤ簬璇诲彇鐢ㄦ埛鍗′俊鎭�
+ *
+ * @param callback 鏁版嵁璇诲彇瀹屾垚鍚庣殑鍥炶皟鎺ュ彛
*/
@Override
public void getOneSectorData(NFCCallListback callback) {
-
-
MifareClassic mfc = null;
try {
mfc = MifareClassic.get(tag);
} catch (Exception e) {
e.printStackTrace();
}
+
if (null != mfc) {
try {
- //閾炬帴NFC
+ // 寤虹珛NFC杩炴帴
mfc.connect();
- //鐢ㄤ簬鍒ゆ柇鏃跺�欐湁鍐呭璇诲彇鍑烘潵
+ // 鐢ㄤ簬鍒ゆ柇鏄惁鏈夊唴瀹硅鍙栧嚭鏉�
boolean flag = false;
List<byte[]> list = new ArrayList<>();
- //楠岃瘉鎵囧尯瀵嗙爜锛屽惁鍒欎細鎶ラ敊锛堥摼鎺ュけ璐ラ敊璇級
+
+ // 楠岃瘉鎵囧尯1鐨勫瘑鐮�
boolean isOpen = false;
for (int i = 0; i < listKeyA.size(); i++) {
if (mfc.authenticateSectorWithKeyA(1, listKeyA.get(i))) {
@@ -275,14 +338,15 @@
break;
}
}
+
if (isOpen) {
- //鑾峰彇鎵囧尯閲岄潰鍧楃殑鏁伴噺
+ // 鑾峰彇鎵囧尯1閲岄潰鍧楃殑鏁伴噺
int bCount = mfc.getBlockCountInSector(1);
- //鑾峰彇鎵囧尯绗竴涓潡瀵瑰簲鑺墖瀛樺偍鍣ㄧ殑浣嶇疆锛堟垜鏄繖鏍风悊瑙g殑锛屽洜涓虹0鎵囧尯鐨勮繖涓�兼槸4鑰屼笉鏄�0锛�
+ // 鑾峰彇鎵囧尯1绗竴涓潡瀵瑰簲鑺墖瀛樺偍鍣ㄧ殑浣嶇疆
int bIndex = mfc.sectorToBlock(1);
- //String data1 = "";
+
+ // 璇诲彇鎵囧尯1鍐呮墍鏈夊潡鐨勬暟鎹�
for (int j = 0; j < bCount; j++) {
- //璇诲彇鏁版嵁
byte[] data = null;
try {
data = mfc.readBlock(bIndex);
@@ -294,6 +358,7 @@
}
flag = true;
}
+
if (flag) {
callback.callBack(list);
} else {
@@ -306,7 +371,6 @@
callback.error(CardCommonState.ERROR);
e.printStackTrace();
} finally {
-
try {
mfc.close();
} catch (Exception e) {
@@ -316,13 +380,12 @@
}
}
-
/**
- * 璇诲彇NFC鍗$殑鐗瑰畾鎵囧尯淇℃伅
- *
- * @param a 鎵囧尯
- * @param b 鍧�
- * @param callback
+ * 璇诲彇NFC鍗$殑鐗瑰畾鎵囧尯鐗瑰畾鍧椾俊鎭�
+ *
+ * @param a 鎵囧尯绱㈠紩锛堜粠0寮�濮嬶級
+ * @param b 鍧楃储寮曪紙浠�0寮�濮嬶紝鐩稿浜庢墖鍖哄唴鐨勫潡锛�
+ * @param callback 鏁版嵁璇诲彇瀹屾垚鍚庣殑鍥炶皟鎺ュ彛
*/
@Override
public void getData(final int a, final int b, final NFCCallByteback callback) {
@@ -335,17 +398,22 @@
try {
mfc.connect();
int count = mfc.getSectorCount();
+
+ // 楠岃瘉鎵囧尯绱㈠紩鏄惁鏈夋晥
if (a < 0 || a > count - 1) {
callback.error(CardCommonState.ERROR);
return;
}
+
int bCount = mfc.getBlockCountInSector(a);
+ // 楠岃瘉鍧楃储寮曟槸鍚︽湁鏁�
if (b < 0 || b > bCount - 1) {
callback.error(CardCommonState.ERROR);
return;
}
- int type = mfc.getType();//鑾峰彇TAG鐨勭被鍨�
+ // 鑾峰彇TAG鐨勭被鍨嬶紙鐢ㄤ簬璋冭瘯锛�
+ int type = mfc.getType();
String typeS = "";
switch (type) {
case MifareClassic.TYPE_CLASSIC:
@@ -361,6 +429,8 @@
typeS = "TYPE_UNKNOWN";
break;
}
+
+ // 楠岃瘉鎵囧尯瀵嗙爜
boolean isOpen = false;
for (int i = 0; i < listKeyA.size(); i++) {
if (mfc.authenticateSectorWithKeyA(a, listKeyA.get(i))) {
@@ -368,7 +438,9 @@
break;
}
}
+
if (isOpen) {
+ // 璇诲彇鎸囧畾鎵囧尯鎸囧畾鍧楃殑鏁版嵁
int bIndex = mfc.sectorToBlock(a);
byte[] data = mfc.readBlock(bIndex + b);
callback.callBack(data);
@@ -392,19 +464,27 @@
}).start();
}
-
+ /**
+ * 鑾峰彇鍗″彿锛堣鍙栧悗鑷姩鍏抽棴杩炴帴锛�
+ *
+ * 浠庢墖鍖�0绗竴涓潡璇诲彇鍗$殑UID浣滀负鍗″彿
+ *
+ * @return 鍗″彿鐨勫崄鍏繘鍒跺瓧绗︿覆锛堝ぇ鍐欙級锛屽け璐ヨ繑鍥為敊璇爜鎴栫┖瀛楃涓�
+ */
@Override
public String getCardNumber() {
if (tag == null) {
return "";
}
+
MifareClassic mfc = MifareClassic.get(tag);
if (null != mfc) {
try {
mfc.connect();
- //鑾峰彇褰撳墠鍗″彿
+ // 鑾峰彇褰撳墠鍗″彿
boolean isOpen = false;
if (!listKeyA.isEmpty()) {
+ // 浣跨敤KeyA瀵嗛挜楠岃瘉鎵囧尯0
for (int i = 0; i < listKeyA.size(); i++) {
if (mfc.authenticateSectorWithKeyA(0, listKeyA.get(i))) {
isOpen = true;
@@ -412,6 +492,7 @@
}
}
} else if (!listA_PS.isEmpty()) {
+ // 浣跨敤榛樿瀵嗛挜鎴栫壒瀹氬瘑閽ラ獙璇佹墖鍖�0
if (mfc.authenticateSectorWithKeyA(0, defauleKey)) {
isOpen = true;
} else if (mfc.authenticateSectorWithKeyA(0, listA_PS.get(0))) {
@@ -420,24 +501,26 @@
}
if (isOpen) {
+ // 璇诲彇鎵囧尯0绗竴涓潡鐨勬暟鎹�
int bIndex = mfc.sectorToBlock(0);
byte[] data = mfc.readBlock(bIndex + 0);
if (data != null && data.length > 0) {
+ // 鎻愬彇鍓�4涓瓧鑺備綔涓篣ID
String hex = HexUtil.bytesToHex(Arrays.copyOfRange(data, 0, 4));
- hex = HexUtil.spaceHex(hex);
- hex = HexUtil.HighLowHex(hex);
+ hex = HexUtil.spaceHex(hex); // 娣诲姞绌烘牸鍒嗛殧
+ hex = HexUtil.HighLowHex(hex); // 楂樹綆浣嶈浆鎹�
Log.i("NFCWreatActivity", "hex===" + hex);
return hex.toUpperCase();
}
- }else {
- return BaseCommon.CARD_TYPE_ERROR2;
+ } else {
+ return BaseCommon.CARD_TYPE_ERROR2; // 瀵嗛挜楠岃瘉澶辫触
}
} catch (IOException e) {
- return BaseCommon.CARD_TYPE_ERROR1;
+ return BaseCommon.CARD_TYPE_ERROR1; // IO寮傚父
} finally {
try {
- mfc.close();
+ mfc.close(); // 纭繚鍏抽棴杩炴帴
} catch (IOException e) {
e.printStackTrace();
}
@@ -446,18 +529,27 @@
return "";
}
-
+ /**
+ * 鑾峰彇鍗″彿锛堜笉鍏抽棴杩炴帴锛�
+ *
+ * 涓巊etCardNumber()鍔熻兘鐩稿悓锛屼絾涓嶅叧闂璑FC杩炴帴
+ * 閫傜敤浜庨渶瑕佽繛缁繘琛屽娆FC鎿嶄綔鐨勫満鏅�
+ *
+ * @return 鍗″彿鐨勫崄鍏繘鍒跺瓧绗︿覆锛堝ぇ鍐欙級锛屽け璐ヨ繑鍥為敊璇爜鎴栫┖瀛楃涓�
+ */
public String getCardNumberNoClose() {
if (tag == null) {
return "";
}
+
MifareClassic mfc = MifareClassic.get(tag);
if (null != mfc) {
try {
mfc.connect();
- //鑾峰彇褰撳墠鍗″彿
+ // 鑾峰彇褰撳墠鍗″彿
boolean isOpen = false;
if (!listKeyA.isEmpty()) {
+ // 浣跨敤KeyA瀵嗛挜楠岃瘉鎵囧尯0
for (int i = 0; i < listKeyA.size(); i++) {
if (mfc.authenticateSectorWithKeyA(0, listKeyA.get(i))) {
isOpen = true;
@@ -465,6 +557,7 @@
}
}
} else if (!listA_PS.isEmpty()) {
+ // 浣跨敤榛樿瀵嗛挜鎴栫壒瀹氬瘑閽ラ獙璇佹墖鍖�0
if (mfc.authenticateSectorWithKeyA(0, defauleKey)) {
isOpen = true;
} else if (mfc.authenticateSectorWithKeyA(0, listA_PS.get(0))) {
@@ -473,47 +566,74 @@
}
if (isOpen) {
+ // 璇诲彇鎵囧尯0绗竴涓潡鐨勬暟鎹�
int bIndex = mfc.sectorToBlock(0);
byte[] data = mfc.readBlock(bIndex + 0);
if (data != null && data.length > 0) {
+ // 鎻愬彇鍓�4涓瓧鑺備綔涓篣ID
String hex = HexUtil.bytesToHex(Arrays.copyOfRange(data, 0, 4));
- hex = HexUtil.spaceHex(hex);
- hex = HexUtil.HighLowHex(hex);
+ hex = HexUtil.spaceHex(hex); // 娣诲姞绌烘牸鍒嗛殧
+ hex = HexUtil.HighLowHex(hex); // 楂樹綆浣嶈浆鎹�
Log.i("NFCWreatActivity", "hex===" + hex);
return hex.toUpperCase();
}
- }else {
- return BaseCommon.CARD_TYPE_ERROR2;
+ } else {
+ return BaseCommon.CARD_TYPE_ERROR2; // 瀵嗛挜楠岃瘉澶辫触
}
} catch (IOException e) {
Log.i("NFCWreatActivity", e.toString());
- return BaseCommon.CARD_TYPE_ERROR1;
+ return BaseCommon.CARD_TYPE_ERROR1; // IO寮傚父
}
+ // 娉ㄦ剰锛氳繖閲屼笉鍏抽棴杩炴帴
}
return "";
}
+ /**
+ * 鑾峰彇鍗$墖绫诲瀷鍜屽崱鍙凤紙榛樿鍙傛暟锛�
+ *
+ * @return "鍗″彿,鍗$墖绫诲瀷"鏍煎紡鐨勫瓧绗︿覆
+ */
@Override
public String getCradTypeAndCardNumber() {
return getCradTypeAndCardNumber(1, 0, 0);
}
+ /**
+ * 鑾峰彇鍗$墖绫诲瀷鍜屽崱鍙凤紙鑷姩鍏抽棴杩炴帴锛�
+ *
+ * @param sectorIndex 璇诲彇鍗$墖绫诲瀷鐨勬墖鍖虹储寮�
+ * @param blockIndex 璇诲彇鍗$墖绫诲瀷鐨勫潡绱㈠紩
+ * @param cardTypeIndex 鍗$墖绫诲瀷瀛楄妭鍦ㄥ潡涓殑浣嶇疆绱㈠紩
+ * @return "鍗″彿,鍗$墖绫诲瀷"鏍煎紡鐨勫瓧绗︿覆
+ */
+ public String getCradTypeAndCardNumber(int sectorIndex, int blockIndex, int cardTypeIndex) {
+ return getCradTypeAndCardNumber(sectorIndex, blockIndex, cardTypeIndex, true);
+ }
/**
* 鑾峰彇鍗$墖绫诲瀷鍜屽崱鍙�
- *
- * @return
+ *
+ * 璇诲彇娴佺▼锛�
+ * 1. 浠庢墖鍖�0璇诲彇鍗″彿
+ * 2. 浠庢寚瀹氭墖鍖鸿鍙栧崱鐗囩被鍨�
+ * 3. 杩斿洖"鍗″彿,鍗$墖绫诲瀷"鏍煎紡鐨勫瓧绗︿覆
+ *
+ * @param sectorIndex 璇诲彇鍗$墖绫诲瀷鐨勬墖鍖虹储寮�
+ * @param blockIndex 璇诲彇鍗$墖绫诲瀷鐨勫潡绱㈠紩
+ * @param cardTypeIndex 鍗$墖绫诲瀷瀛楄妭鍦ㄥ潡涓殑浣嶇疆绱㈠紩
+ * @param isClose 鏄惁鍦ㄨ鍙栧畬鎴愬悗鍏抽棴杩炴帴
+ * @return "鍗″彿,鍗$墖绫诲瀷"鏍煎紡鐨勫瓧绗︿覆锛屽け璐ヨ繑鍥為敊璇爜
*/
-
- public String getCradTypeAndCardNumber(int sectorIndex, int blockIndex, int cardTypeIndex) {
-
+ public String getCradTypeAndCardNumber(int sectorIndex, int blockIndex, int cardTypeIndex, boolean isClose) {
MifareClassic mfc = MifareClassic.get(tag);
if (null != mfc) {
try {
mfc.connect();
StringBuilder strData = new StringBuilder();
- //鑾峰彇褰撳墠鍗″彿
+
+ // 绗竴姝ワ細鑾峰彇褰撳墠鍗″彿锛堜粠鎵囧尯0璇诲彇锛�
boolean isOpen = false;
if (!listKeyA.isEmpty()) {
for (int i = 0; i < listKeyA.size(); i++) {
@@ -529,19 +649,22 @@
isOpen = true;
}
}
+
if (isOpen) {
int bIndex = mfc.sectorToBlock(0);
byte[] data = mfc.readBlock(bIndex + 0);
if (data != null && data.length > 0) {
+ // 鎻愬彇鍗″彿骞舵牸寮忓寲
String hex = HexUtil.bytesToHex(Arrays.copyOfRange(data, 0, 4));
hex = HexUtil.spaceHex(hex);
hex = HexUtil.HighLowHex(hex);
strData.append(hex);
- strData.append(",");
+ strData.append(","); // 鍒嗛殧绗�
Log.i("NFCWreatActivity", "hex===" + hex);
}
}
- //鑾峰彇鍗$墖绫诲瀷
+
+ // 绗簩姝ワ細鑾峰彇鍗$墖绫诲瀷锛堜粠鎸囧畾鎵囧尯璇诲彇锛�
if (!listKeyA.isEmpty()) {
for (int i = 0; i < listKeyA.size(); i++) {
if (mfc.authenticateSectorWithKeyA(sectorIndex, listKeyA.get(i))) {
@@ -556,10 +679,12 @@
isOpen = true;
}
}
+
if (isOpen) {
int bIndex = mfc.sectorToBlock(sectorIndex);
byte[] data = mfc.readBlock(bIndex + 0);
if (data != null && data.length > 0) {
+ // 鎻愬彇鎸囧畾浣嶇疆鐨勫瓧鑺備綔涓哄崱鐗囩被鍨�
String hex = HexUtil.byteToHex(data[cardTypeIndex]);
strData.append(hex);
Log.i("NFCWreatActivity", "hex===" + hex);
@@ -567,14 +692,16 @@
}
} else {
Log.i("NFCWreatActivity", "isOpen===" + isOpen);
- return BaseCommon.CARD_TYPE_ERROR2;
+ return BaseCommon.CARD_TYPE_ERROR2; // 瀵嗛挜楠岃瘉澶辫触
}
} catch (IOException e) {
e.printStackTrace();
- return BaseCommon.CARD_TYPE_ERROR1;
+ return BaseCommon.CARD_TYPE_ERROR1; // IO寮傚父
} finally {
try {
- mfc.close();
+ if (isClose) {
+ mfc.close(); // 鏍规嵁鍙傛暟鍐冲畾鏄惁鍏抽棴杩炴帴
+ }
} catch (IOException e) {
e.printStackTrace();
}
@@ -583,7 +710,11 @@
return "";
}
-
+ /**
+ * 鑾峰彇鎵囧尯1鐨勬暟鎹紙杩斿洖瀛楄妭鏁扮粍鍒楄〃锛�
+ *
+ * @return 鎵囧尯1鎵�鏈夊潡鐨勫瓧鑺傛暟鎹垪琛紝澶辫触杩斿洖null
+ */
@Override
public List<byte[]> getOnesectorData() {
MifareClassic mfc = null;
@@ -592,15 +723,16 @@
} catch (Exception e) {
e.printStackTrace();
}
+
List<byte[]> list = new ArrayList<>();
if (null != mfc) {
try {
- //閾炬帴NFC
+ // 寤虹珛NFC杩炴帴
mfc.connect();
- //鐢ㄤ簬鍒ゆ柇鏃跺�欐湁鍐呭璇诲彇鍑烘潵
+ // 鐢ㄤ簬鍒ゆ柇鏄惁鏈夊唴瀹硅鍙栧嚭鏉�
boolean flag = false;
- //楠岃瘉鎵囧尯瀵嗙爜锛屽惁鍒欎細鎶ラ敊锛堥摼鎺ュけ璐ラ敊璇級
+ // 楠岃瘉鎵囧尯1鐨勫瘑鐮�
boolean isOpen = false;
for (int i = 0; i < listKeyA.size(); i++) {
if (mfc.authenticateSectorWithKeyA(1, listKeyA.get(i))) {
@@ -608,14 +740,15 @@
break;
}
}
+
if (isOpen) {
- //鑾峰彇鎵囧尯閲岄潰鍧楃殑鏁伴噺
+ // 鑾峰彇鎵囧尯1閲岄潰鍧楃殑鏁伴噺
int bCount = mfc.getBlockCountInSector(1);
- //鑾峰彇鎵囧尯绗竴涓潡瀵瑰簲鑺墖瀛樺偍鍣ㄧ殑浣嶇疆锛堟垜鏄繖鏍风悊瑙g殑锛屽洜涓虹0鎵囧尯鐨勮繖涓�兼槸4鑰屼笉鏄�0锛�
+ // 鑾峰彇鎵囧尯1绗竴涓潡瀵瑰簲鑺墖瀛樺偍鍣ㄧ殑浣嶇疆
int bIndex = mfc.sectorToBlock(1);
- //String data1 = "";
+
+ // 璇诲彇鎵囧尯1鍐呮墍鏈夊潡鐨勬暟鎹�
for (int j = 0; j < bCount; j++) {
- //璇诲彇鏁版嵁
byte[] data = null;
try {
data = mfc.readBlock(bIndex);
@@ -634,7 +767,7 @@
} finally {
try {
mfc.close();
- return list;
+ return list; // 鍦╢inally涓繑鍥炵粨鏋�
} catch (Exception e) {
e.printStackTrace();
}
@@ -644,40 +777,44 @@
}
/**
- * 鑾峰彇鐢ㄦ埛鍗′俊鎭�
- *
- * @return
+ * 鑾峰彇绠$悊鍗¤浆鐢ㄦ埛鍗$殑鏁版嵁
+ *
+ * 鐢ㄤ簬璇诲彇绠$悊鍗′腑瀛樺偍鐨勭敤鎴峰崱淇℃伅锛岄�氬父鐢ㄤ簬绠$悊鍗″悜鐢ㄦ埛鍗$殑鏁版嵁杞崲
+ *
+ * @param baseManagerToUserCard 绠$悊鍗℃暟鎹ā鏉垮璞�
+ * @return 瑙f瀽鍚庣殑绠$悊鍗℃暟鎹璞★紝澶辫触杩斿洖null
*/
@Override
public BaseManagerToUserCard getManagerToUserCardData(BaseManagerToUserCard baseManagerToUserCard) {
-
BaseManagerToUserCard managerToUserCard = null;
Map<String, List<byte[]>> map = new HashMap<>();
MifareClassic mfc = MifareClassic.get(tag);
if (null != mfc) {
try {
- //閾炬帴NFC
+ // 寤虹珛NFC杩炴帴
mfc.connect();
- //鑾峰彇鎵囧尯鏁伴噺
+ // 鑾峰彇鎵囧尯鏁伴噺
int count = mfc.getSectorCount();
- //瀛樺偍绌洪棿
+ // 瀛樺偍绌洪棿澶у皬
int size = mfc.getSize();
- //鐢ㄤ簬鍒ゆ柇鏃跺�欐湁鍐呭璇诲彇鍑烘潵
+ // 鐢ㄤ簬鍒ゆ柇鏄惁鏈夊唴瀹硅鍙栧嚭鏉�
boolean flag = false;
List<byte[]> list = new ArrayList<>();
- //楠岃瘉鎵囧尯瀵嗙爜锛屽惁鍒欎細鎶ラ敊锛堥摼鎺ュけ璐ラ敊璇級
+
+ // 楠岃瘉鎵囧尯1鐨勫瘑鐮侊紙鍏堝皾璇曢粯璁ゅ瘑閽ワ紝鍐嶅皾璇曞叕鍙稿瘑閽ワ級
boolean isOpen = mfc.authenticateSectorWithKeyA(1, defauleKey);
if (!isOpen) {
isOpen = mfc.authenticateSectorWithKeyA(1, companyKey);
}
+
if (isOpen) {
- //鑾峰彇鎵囧尯閲岄潰鍧楃殑鏁伴噺
+ // 鑾峰彇鎵囧尯1閲岄潰鍧楃殑鏁伴噺
int bCount = mfc.getBlockCountInSector(1);
- //鑾峰彇鎵囧尯绗竴涓潡瀵瑰簲鑺墖瀛樺偍鍣ㄧ殑浣嶇疆锛堟垜鏄繖鏍风悊瑙g殑锛屽洜涓虹0鎵囧尯鐨勮繖涓�兼槸4鑰屼笉鏄�0锛�
+ // 鑾峰彇鎵囧尯1绗竴涓潡瀵瑰簲鑺墖瀛樺偍鍣ㄧ殑浣嶇疆
int bIndex = mfc.sectorToBlock(1);
- //String data1 = "";
+
+ // 璇诲彇鎵囧尯1鍐呮墍鏈夊潡鐨勬暟鎹�
for (int j = 0; j < bCount; j++) {
- //璇诲彇鏁版嵁
byte[] data = null;
try {
data = mfc.readBlock(bIndex);
@@ -691,6 +828,7 @@
}
if (flag) {
+ // 灏嗚鍙栫殑瀛楄妭鏁版嵁瑙f瀽涓虹鐞嗗崱瀵硅薄
managerToUserCard = baseManagerToUserCard.getBean(list);
return managerToUserCard;
}
@@ -700,7 +838,7 @@
e.printStackTrace();
} finally {
try {
- mfc.close();
+ mfc.close(); // 纭繚杩炴帴琚纭叧闂�
} catch (Exception e) {
e.printStackTrace();
}
@@ -708,6 +846,4 @@
}
return null;
}
-
-
}
--
Gitblit v1.8.0