From dd0f9e5f533d868d68c5fc343a44356b537b3988 Mon Sep 17 00:00:00 2001 From: zuojincheng <lf_zuo@163.com> Date: 星期五, 06 六月 2025 15:36:45 +0800 Subject: [PATCH] feat(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