左晓为主开发手持机充值管理机
zuojincheng
2 天以前 dd0f9e5f533d868d68c5fc343a44356b537b3988
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);
                            // 校验写入数据是否正确
                            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;
    }
}