From 1c549ae7af5f8d7bdeecb4ad38ab181af4831821 Mon Sep 17 00:00:00 2001
From: zuoxiao <470321431@qq.com>
Date: 星期四, 29 二月 2024 18:07:41 +0800
Subject: [PATCH] 添加齐河项目的卡结构

---
 app/src/main/java/com/dayu/recharge/tools/NfcReadHelper.java |  252 ++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 191 insertions(+), 61 deletions(-)

diff --git a/app/src/main/java/com/dayu/recharge/tools/NfcReadHelper.java b/app/src/main/java/com/dayu/recharge/tools/NfcReadHelper.java
index 428cfd8..e8ed9d6 100644
--- a/app/src/main/java/com/dayu/recharge/tools/NfcReadHelper.java
+++ b/app/src/main/java/com/dayu/recharge/tools/NfcReadHelper.java
@@ -1,16 +1,17 @@
 package com.dayu.recharge.tools;
 
+import android.app.Activity;
 import android.content.Intent;
 import android.nfc.NfcAdapter;
 import android.nfc.Tag;
 import android.nfc.tech.MifareClassic;
+import android.util.Log;
 
 import com.dayu.recharge.card.UserCard;
 import com.dayu.recharge.utils.MyCommon;
 
 import java.io.IOException;
 import java.util.ArrayList;
-
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -28,7 +29,8 @@
     private static NfcReadHelper helper;
 
 
-    public NfcReadHelper(Intent intent) {
+    public NfcReadHelper(Intent intent, Activity activity) {
+        super(activity);
         this.tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
 
     }
@@ -39,14 +41,18 @@
      * @param intent
      * @return
      */
-    public static NfcReadHelper getInstence(Intent intent) {
+    public static NfcReadHelper getInstence(Intent intent, Activity activity) {
         if (helper == null) {
-            helper = new NfcReadHelper(intent);
+            helper = new NfcReadHelper(intent, activity);
         }
         return helper;
     }
 
-
+    /**
+     * 鑾峰彇鐢ㄦ埛鍗′俊鎭�
+     *
+     * @return
+     */
     public UserCard getUserCardData() {
         UserCard userCard = null;
         Map<String, List<byte[]>> map = new HashMap<>();
@@ -63,7 +69,10 @@
                 boolean flag = false;
                 List<byte[]> list = new ArrayList<>();
                 //楠岃瘉鎵囧尯瀵嗙爜锛屽惁鍒欎細鎶ラ敊锛堥摼鎺ュけ璐ラ敊璇級
-                boolean isOpen = mfc.authenticateSectorWithKeyA(1, bytes);
+                boolean isOpen = mfc.authenticateSectorWithKeyA(1, defauleKey);
+                if (!isOpen) {
+                    isOpen = mfc.authenticateSectorWithKeyA(1, companyKey);
+                }
                 if (isOpen) {
                     //鑾峰彇鎵囧尯閲岄潰鍧楃殑鏁伴噺
                     int bCount = mfc.getBlockCountInSector(1);
@@ -103,75 +112,177 @@
         return null;
     }
 
+    public String getCradType() {
+
+        MifareClassic mfc = MifareClassic.get(tag);
+        if (null != mfc) {
+            try {
+                mfc.connect();
+                boolean isOpen = mfc.authenticateSectorWithKeyA(1, defauleKey);
+                if (!isOpen) {
+                    isOpen = mfc.authenticateSectorWithKeyA(1, companyKey);
+                }
+                if (isOpen) {
+                    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 "-1";
+                }
+            } catch (IOException e) {
+                return "-1";
+            } finally {
+                try {
+                    mfc.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return "";
+    }
 
     /**
      * 璇诲彇NFC鍗$殑鍏ㄩ儴淇℃伅
      *
      * @param callback
      */
-    public void getAllData(final NFCCallListback callback) {
-        new Thread(new Runnable() {
-            @Override
-            public void run() {
-                Map<String, List<byte[]>> map = new HashMap<>();
-                MifareClassic mfc = MifareClassic.get(tag);
-                if (null != mfc) {
-                    try {
-                        //閾炬帴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 = mfc.authenticateSectorWithKeyA(i, bytes);
-                            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);
-                                        bIndex++;
-                                        list.add(data);
-                                    } catch (Exception e) {
-                                        e.printStackTrace();
-                                    }
-                                }
-                                flag = true;
+    public void getAllData(final NFCCallMapback callback) {
+        Map<String, List<byte[]>> map = new HashMap<>();
+        MifareClassic mfc = MifareClassic.get(tag);
+        if (null != mfc) {
+            try {
+                //閾炬帴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 = mfc.authenticateSectorWithKeyA(i, defauleKey);
+                    if (!isOpen) {
+                        isOpen = mfc.authenticateSectorWithKeyA(i, companyKey);
+                    }
+                    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);
+                                bIndex++;
+                                list.add(data);
+                            } catch (Exception e) {
+                                e.printStackTrace();
                             }
-                            map.put(i + "", list);
                         }
-                        if (flag) {
-                            callback.callBack(map);
-                        } else {
-                            callback.error(MyCommon.ERROR);
-                        }
-                    } catch (IOException e) {
-                        callback.error(MyCommon.ERROR_MOVE);
-                        e.printStackTrace();
-                    } catch (Exception e) {
-                        callback.error(MyCommon.ERROR);
-                        e.printStackTrace();
-                    } finally {
+                        flag = true;
+                    }
+                    map.put(i + "", list);
+                }
+                if (flag) {
+                    callback.callBack(map);
+                } else {
+                    callback.error(MyCommon.ERROR);
+                }
+            } catch (IOException e) {
+                callback.error(MyCommon.ERROR_MOVE);
+                e.printStackTrace();
+            } catch (Exception e) {
+                callback.error(MyCommon.ERROR);
+                e.printStackTrace();
+            } finally {
+                try {
+                    mfc.close();
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+
+    /**
+     * 鑾峰彇1鎵囧尯淇℃伅
+     *
+     * @param callback
+     */
+    public void getOneSectorData(NFCCallListback callback) {
+
+
+        MifareClassic mfc = null;
+        try {
+            mfc = MifareClassic.get(tag);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        if (null != mfc) {
+            try {
+                //閾炬帴NFC
+                mfc.connect();
+                //鐢ㄤ簬鍒ゆ柇鏃跺�欐湁鍐呭璇诲彇鍑烘潵
+                boolean flag = false;
+                List<byte[]> list = new ArrayList<>();
+                //楠岃瘉鎵囧尯瀵嗙爜锛屽惁鍒欎細鎶ラ敊锛堥摼鎺ュけ璐ラ敊璇級
+                boolean isOpen = mfc.authenticateSectorWithKeyA(1, companyKey);
+                if (!isOpen) {
+                    isOpen = mfc.authenticateSectorWithKeyA(1, defauleKey);
+                }
+                if (isOpen) {
+                    //鑾峰彇鎵囧尯閲岄潰鍧楃殑鏁伴噺
+                    int bCount = mfc.getBlockCountInSector(1);
+                    //鑾峰彇鎵囧尯绗竴涓潡瀵瑰簲鑺墖瀛樺偍鍣ㄧ殑浣嶇疆锛堟垜鏄繖鏍风悊瑙g殑锛屽洜涓虹0鎵囧尯鐨勮繖涓�兼槸4鑰屼笉鏄�0锛�
+                    int bIndex = mfc.sectorToBlock(1);
+                    //String data1 = "";
+                    for (int j = 0; j < bCount; j++) {
+                        //璇诲彇鏁版嵁
+                        byte[] data = null;
                         try {
-                            mfc.close();
+                            data = mfc.readBlock(bIndex);
+                            bIndex++;
+                            list.add(data);
                         } catch (Exception e) {
                             e.printStackTrace();
                         }
                     }
+                    flag = true;
+                }
+                if (flag) {
+                    callback.callBack(list);
+                } else {
+                    callback.error(MyCommon.ERROR);
+                }
+            } catch (IOException e) {
+                callback.error(MyCommon.ERROR_MOVE);
+                e.printStackTrace();
+            } catch (Exception e) {
+                callback.error(MyCommon.ERROR);
+                e.printStackTrace();
+            } finally {
+
+                try {
+                    mfc.close();
+                } catch (Exception e) {
+                    e.printStackTrace();
                 }
             }
-        }).start();
+        }
     }
+
 
     /**
      * 璇诲彇NFC鍗$殑鐗瑰畾鎵囧尯淇℃伅
@@ -216,7 +327,10 @@
                                 typeS = "TYPE_UNKNOWN";
                                 break;
                         }
-                        boolean isOpen = mfc.authenticateSectorWithKeyA(a, bytes);
+                        boolean isOpen = mfc.authenticateSectorWithKeyA(a, defauleKey);
+                        if (!isOpen) {
+                            isOpen = mfc.authenticateSectorWithKeyA(a, companyKey);
+                        }
                         if (isOpen) {
                             int bIndex = mfc.sectorToBlock(a);
                             byte[] data = mfc.readBlock(bIndex + b);
@@ -244,7 +358,7 @@
     /**
      * 杩斿洖鐩戝惉绫�
      */
-    public interface NFCCallListback {
+    public interface NFCCallMapback {
         /**
          * 杩斿洖璇诲彇nfc鍗$殑鍏ㄩ儴淇℃伅
          *
@@ -256,6 +370,22 @@
         void error(int code);
     }
 
+    /**
+     * 杩斿洖鐩戝惉绫�
+     */
+    public interface NFCCallListback {
+        /**
+         * 杩斿洖璇诲彇nfc鍗$殑鍏ㄩ儴淇℃伅
+         *
+         * @param data 鍓嶉潰浠h〃鎵囧尯 鍥涗釜鍧楃殑鏁版嵁鐢�#鍙烽殧寮�
+         */
+        void callBack(List<byte[]> data);
+
+
+        void error(int code);
+    }
+
+
     public interface NFCCallByteback {
         /**
          * 杩斿洖璇诲彇nfc鍗$殑鍏ㄩ儴淇℃伅

--
Gitblit v1.8.0