左晓为主开发手持机充值管理机
zuoxiao
2023-11-22 1ffa3cb19f95855d44fbc9485f4eb3286b12e359
app/src/main/java/com/dayu/recharge/tools/NfcReadHelper.java
@@ -5,6 +5,9 @@
import android.nfc.Tag;
import android.nfc.tech.MifareClassic;
import com.dayu.recharge.card.UserCard;
import com.dayu.recharge.utils.MyCommon;
import java.io.IOException;
import java.util.ArrayList;
@@ -43,21 +46,63 @@
        return helper;
    }
    /**
     * 设置NFC卡的密码
     *
     * @param str
     * @return
     */
//    public NfcReadHelper setPassword(String str) {
//
//        if (null != str && (str.length() <= 6)) {
//            for (int i = 0; i < str.length(); i++) {
//                bytes[i] = (byte) str.charAt(i);
//            }
//        }
//        return helper;
//    }
    public UserCard getUserCardData() {
        UserCard userCard = null;
        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;
                List<byte[]> list = new ArrayList<>();
                //验证扇区密码,否则会报错(链接失败错误)
                boolean isOpen = mfc.authenticateSectorWithKeyA(1, bytes);
                if (isOpen) {
                    //获取扇区里面块的数量
                    int bCount = mfc.getBlockCountInSector(1);
                    //获取扇区第一个块对应芯片存储器的位置(我是这样理解的,因为第0扇区的这个值是4而不是0)
                    int bIndex = mfc.sectorToBlock(1);
                    //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;
                }
                if (flag) {
                    userCard = UserCard.getBean(list);
                    return userCard;
                }
            } catch (IOException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    mfc.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }
    /**
     * 读取NFC卡的全部信息
@@ -108,15 +153,18 @@
                        if (flag) {
                            callback.callBack(map);
                        } else {
                            callback.error();
                            callback.error(MyCommon.ERROR);
                        }
                    } catch (IOException e) {
                        callback.error(MyCommon.ERROR_MOVE);
                        e.printStackTrace();
                    } catch (Exception e) {
                        callback.error();
                        callback.error(MyCommon.ERROR);
                        e.printStackTrace();
                    } finally {
                        try {
                            mfc.close();
                        } catch (IOException e) {
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
@@ -143,12 +191,12 @@
                        mfc.connect();
                        int count = mfc.getSectorCount();
                        if (a < 0 || a > count - 1) {
                            callback.error();
                            callback.error(MyCommon.ERROR);
                            return;
                        }
                        int bCount = mfc.getBlockCountInSector(a);
                        if (b < 0 || b > bCount - 1) {
                            callback.error();
                            callback.error(MyCommon.ERROR);
                            return;
                        }
@@ -174,11 +222,13 @@
                            byte[] data = mfc.readBlock(bIndex + b);
                            callback.callBack(data);
                        } else {
                            callback.error();
                            callback.error(MyCommon.ERROR);
                        }
                    } catch (Exception e) {
                        callback.error();
                    } catch (IOException e) {
                        callback.error(MyCommon.ERROR_MOVE);
                        e.printStackTrace();
                    } catch (Exception e) {
                        callback.error(MyCommon.ERROR);
                    } finally {
                        try {
                            mfc.close();
@@ -203,7 +253,7 @@
        void callBack(Map<String, List<byte[]>> data);
        void error();
        void error(int code);
    }
    public interface NFCCallByteback {
@@ -215,7 +265,7 @@
        void callBack(byte[] data);
        void error();
        void error(int code);
    }
}