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