From 2b02b6e854a56a511588e4865ddf2c6597675329 Mon Sep 17 00:00:00 2001
From: zuoxiao <470321431@qq.com>
Date: 星期一, 16 六月 2025 16:04:54 +0800
Subject: [PATCH] feat(nfc): 添加读卡功能并优化写卡流程

---
 baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcWriteHelper.java |  299 ++++++++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 242 insertions(+), 57 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 22349c3..f03959a 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
@@ -12,6 +12,7 @@
 import com.tencent.bugly.crashreport.CrashReport;
 
 import java.io.IOException;
+import java.util.List;
 
 /**
  * author: zuo
@@ -23,7 +24,6 @@
     private Tag tag;
 
     private static NativeNfcWriteHelper helper;
-
 
     public void setIntent(Intent intent) {
         this.tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
@@ -43,7 +43,6 @@
         return helper;
     }
 
-
     /**
      * 鍐欏崱
      *
@@ -58,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;
@@ -83,7 +82,7 @@
                                     data = userCard.getTwoBytes();
                                 }
                                 int bIndex = mfc.sectorToBlock(a);
-                                //鍐欏崱
+                                // 鍐欏崱
                                 mfc.writeBlock(bIndex + b, data);
                             }
                             return true;
@@ -108,6 +107,95 @@
         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;
+
+                        if (listKeyA.size() != 0) {
+                            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;
+                                }
+                            }
+                        } 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) {
+                            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;
+    }
 
     /**
      * 鍐欏崱
@@ -135,36 +223,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))) {
+                                if (mfc.authenticateSectorWithKeyA(a, listKeyA.get(i))) {
                                     isOpen = true;
                                     if (listKeyA.get(i).equals(defauleKey)) {
-                                        //褰撳墠涓洪粯璁ょ櫧鍗″瘑鐮佹椂鍐欏崱鏃朵慨鏀瑰瘑鐮�
+                                        // 褰撳墠涓洪粯璁ょ櫧鍗″瘑鐮佹椂鍐欏崱鏃朵慨鏀瑰瘑鐮�
                                         changePasword(a, mfc);
                                     }
                                     break;
@@ -180,7 +268,7 @@
                         }
                         if (isOpen) {
                             int bIndex = mfc.sectorToBlock(a);
-                            //鍐欏崱
+                            // 鍐欏崱
                             mfc.writeBlock(bIndex + b, str);
                             // 鏍¢獙鍐欏叆鏁版嵁鏄惁姝g‘
                             boolean isVerified = true;
@@ -245,56 +333,154 @@
         return false;
     }
 
-
     /**
      * 淇敼瀵嗙爜
      *
-     * @param a 涔﹀啓鐨勬墖鍖�
-     *          //     * @param callback 杩斿洖鐩戝惉
+     * @param passWord 瀵嗙爜
+     * @return
      */
-    @Override
-    public boolean changePasword(int a, MifareClassic mfc) {
-
-        byte[] data = new byte[16];
-        if (null != mfc) {
-            try {
-                //灏嗗瘑鐮佽浆鎹负keyA
-                byte[] dataA = HexUtil.hexToByteArray(companyKeyA);
-                for (int i = 0; i < dataA.length; i++) {
-                    data[i] = dataA[i];
+    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瀹炰緥澶辫触");
                 }
-                //杈撳叆鎺у埗浣�
-                data[6] = (byte) 0xFF;
-                data[7] = (byte) 0x07;
-                data[8] = (byte) 0x80;
-                data[9] = (byte) 0x69;
-                byte[] dataB = HexUtil.hexToByteArray(companyKeyB);
-                //灏嗗瘑鐮佽浆鎹负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();
                 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
+                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
+                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);
 
-    public boolean changePasword(int a,byte[] passWord, MifareClassic mfc) {
-        try {
+                return true;
+            } catch (Exception e) {
+                e.printStackTrace();
+                CrashReport.postCatchedException(e);
 
-
-        } catch (Exception e) {
-            e.printStackTrace();
-            CrashReport.postCatchedException(e);
+                return false;
+            }
         }
+
         return false;
     }
 
@@ -309,15 +495,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))) {
@@ -326,7 +512,7 @@
                             }
                         }
                         if (isOpen) {
-                            //鑾峰彇鍐欑殑鎵囧尯鐨勫潡鐨勬暟閲�
+                            // 鑾峰彇鍐欑殑鎵囧尯鐨勫潡鐨勬暟閲�
                             int blockCount = mfc.getBlockCountInSector(sector);
                             int blockIndex = mfc.sectorToBlock(sector);
                             for (int block = 0; block < blockCount; block++) {
@@ -341,7 +527,7 @@
                                 } else {
                                     mfc.writeBlock(blockIndex, initDataBytes);
                                 }
-                                //鍐欏崱
+                                // 鍐欏崱
                                 blockIndex++;
                             }
                         }
@@ -364,6 +550,5 @@
         }
         return false;
     }
-
 
 }

--
Gitblit v1.8.0