|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 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.baselibrary.tools.HexUtil; | 
|---|
|  |  |  | import com.dayu.baselibrary.utils.BaseCommon; | 
|---|
|  |  |  | import com.dayu.baselibrary.bean.BaseManagerToUserCard; | 
|---|
|  |  |  | import com.dayu.baselibrary.tools.nfc.BaseNfcReadHelper; | 
|---|
|  |  |  | import com.dayu.baselibrary.tools.nfc.NfcReadAdapter; | 
|---|
|  |  |  | import com.dayu.qiheonlinelibrary.card.ManagerToUserCard; | 
|---|
|  |  |  | import com.dayu.qiheonlinelibrary.card.UserCard; | 
|---|
|  |  |  | import com.dayu.qiheonlinelibrary.utils.CardCommon; | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import java.io.IOException; | 
|---|
|  |  |  | import java.util.ArrayList; | 
|---|
|  |  |  | import java.util.Arrays; | 
|---|
|  |  |  | import java.util.HashMap; | 
|---|
|  |  |  | import java.util.List; | 
|---|
|  |  |  | import java.util.Map; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * @author zx | 
|---|
|  |  |  | 
|---|
|  |  |  | * email 1058083107@qq.com | 
|---|
|  |  |  | * description nfc读取工具类 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public class NfcReadHelper extends BaseNFCHelper { | 
|---|
|  |  |  | public class NfcReadHelper extends QHBaseNFCHelper { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private Tag tag; | 
|---|
|  |  |  | //    private NFCCallback callback; | 
|---|
|  |  |  | private static NfcReadHelper helper; | 
|---|
|  |  |  | private NfcReadAdapter adapter; | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public NfcReadHelper(Intent intent, Activity activity) { | 
|---|
|  |  |  | super(activity); | 
|---|
|  |  |  | this.tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); | 
|---|
|  |  |  | adapter = new NfcReadAdapter(intent, activity); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | 
|---|
|  |  |  | if (helper == null) { | 
|---|
|  |  |  | helper = new NfcReadHelper(intent, activity); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | helper.adapter.setIntent(intent); | 
|---|
|  |  |  | return helper; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | 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, defauleKey); | 
|---|
|  |  |  | if (!isOpen) { | 
|---|
|  |  |  | isOpen = mfc.authenticateSectorWithKeyA(1, companyKey); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 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(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | return (UserCard) adapter.getUserCardData(new UserCard()); | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public String getCardNumber() { | 
|---|
|  |  |  | MifareClassic mfc = MifareClassic.get(tag); | 
|---|
|  |  |  | if (null != mfc) { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | mfc.connect(); | 
|---|
|  |  |  | //获取当前卡号 | 
|---|
|  |  |  | boolean isOpen = mfc.authenticateSectorWithKeyA(0, defauleKey); | 
|---|
|  |  |  | if (!isOpen) { | 
|---|
|  |  |  | isOpen = mfc.authenticateSectorWithKeyA(0, companyKey); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (isOpen) { | 
|---|
|  |  |  | int bIndex = mfc.sectorToBlock(0); | 
|---|
|  |  |  | byte[] data = mfc.readBlock(bIndex + 0); | 
|---|
|  |  |  | if (data != null && data.length > 0) { | 
|---|
|  |  |  | String hex = HexUtil.bytesToHex(Arrays.copyOfRange(data, 0, 4)); | 
|---|
|  |  |  | hex = HexUtil.spaceHex(hex); | 
|---|
|  |  |  | hex = HexUtil.HighLowHex(hex); | 
|---|
|  |  |  | Log.i("NFCWreatActivity", "hex===" + hex); | 
|---|
|  |  |  | return hex.toUpperCase(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } catch (IOException e) { | 
|---|
|  |  |  | return BaseCommon.CARD_TYPE_ERROR1; | 
|---|
|  |  |  | } finally { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | mfc.close(); | 
|---|
|  |  |  | } catch (IOException e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | return adapter.getCardNumber(); | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return ""; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public String getCradTypeAndCardNumber() { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | MifareClassic mfc = MifareClassic.get(tag); | 
|---|
|  |  |  | if (null != mfc) { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | mfc.connect(); | 
|---|
|  |  |  | StringBuilder strData = new StringBuilder(); | 
|---|
|  |  |  | //获取当前卡号 | 
|---|
|  |  |  | boolean isOpen = mfc.authenticateSectorWithKeyA(0, defauleKey); | 
|---|
|  |  |  | if (!isOpen) { | 
|---|
|  |  |  | isOpen = mfc.authenticateSectorWithKeyA(0, companyKey); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (isOpen) { | 
|---|
|  |  |  | int bIndex = mfc.sectorToBlock(0); | 
|---|
|  |  |  | byte[] data = mfc.readBlock(bIndex + 0); | 
|---|
|  |  |  | if (data != null && data.length > 0) { | 
|---|
|  |  |  | String hex = HexUtil.bytesToHex(Arrays.copyOfRange(data, 0, 4)); | 
|---|
|  |  |  | hex = HexUtil.spaceHex(hex); | 
|---|
|  |  |  | hex = HexUtil.HighLowHex(hex); | 
|---|
|  |  |  | strData.append(hex); | 
|---|
|  |  |  | strData.append(","); | 
|---|
|  |  |  | Log.i("NFCWreatActivity", "hex===" + hex); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //获取卡片类型 | 
|---|
|  |  |  | 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]); | 
|---|
|  |  |  | strData.append(hex); | 
|---|
|  |  |  | Log.i("NFCWreatActivity", "hex===" + hex); | 
|---|
|  |  |  | return strData.toString().toUpperCase(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | Log.i("NFCWreatActivity", "isOpen===" + isOpen); | 
|---|
|  |  |  | return BaseCommon.CARD_TYPE_ERROR2; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } catch (IOException e) { | 
|---|
|  |  |  | return BaseCommon.CARD_TYPE_ERROR1; | 
|---|
|  |  |  | } finally { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | mfc.close(); | 
|---|
|  |  |  | } catch (IOException e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | return adapter.getCradTypeAndCardNumber(); | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return ""; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param callback | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | 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); | 
|---|
|  |  |  | //获取扇区第一个块对应芯片存储器的位置(我是这样理解的,因为第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; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | map.put(i + "", list); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (flag) { | 
|---|
|  |  |  | callback.callBack(map); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | callback.error(CardCommon.ERROR); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } catch (IOException e) { | 
|---|
|  |  |  | callback.error(CardCommon.ERROR_MOVE); | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | callback.error(CardCommon.ERROR); | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } finally { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | mfc.close(); | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | public void getAllData(final BaseNfcReadHelper.NFCCallMapback callback) { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | adapter.getAllData(callback); | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public List<byte[]> getOnesectorData() { | 
|---|
|  |  |  | MifareClassic mfc = null; | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | mfc = MifareClassic.get(tag); | 
|---|
|  |  |  | return adapter.getOnesectorData(); | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | List<byte[]> list = new ArrayList<>(); | 
|---|
|  |  |  | if (null != mfc) { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | //链接NFC | 
|---|
|  |  |  | mfc.connect(); | 
|---|
|  |  |  | //用于判断时候有内容读取出来 | 
|---|
|  |  |  | boolean flag = false; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //验证扇区密码,否则会报错(链接失败错误) | 
|---|
|  |  |  | boolean isOpen = mfc.authenticateSectorWithKeyA(1, companyKey); | 
|---|
|  |  |  | if (!isOpen) { | 
|---|
|  |  |  | isOpen = mfc.authenticateSectorWithKeyA(1, defauleKey); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 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(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } catch (IOException e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } finally { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | mfc.close(); | 
|---|
|  |  |  | return list; | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 获取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); | 
|---|
|  |  |  | //获取扇区第一个块对应芯片存储器的位置(我是这样理解的,因为第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) { | 
|---|
|  |  |  | callback.callBack(list); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | callback.error(CardCommon.ERROR); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } catch (IOException e) { | 
|---|
|  |  |  | callback.error(CardCommon.ERROR_MOVE); | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | callback.error(CardCommon.ERROR); | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } finally { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | mfc.close(); | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | * @param b        块 | 
|---|
|  |  |  | * @param callback | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public void getData(final int a, final int b, final NFCCallByteback callback) { | 
|---|
|  |  |  | new Thread(new Runnable() { | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public void run() { | 
|---|
|  |  |  | Map<String, List<String>> map = new HashMap<>(); | 
|---|
|  |  |  | MifareClassic mfc = MifareClassic.get(tag); | 
|---|
|  |  |  | if (null != mfc) { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | mfc.connect(); | 
|---|
|  |  |  | int count = mfc.getSectorCount(); | 
|---|
|  |  |  | if (a < 0 || a > count - 1) { | 
|---|
|  |  |  | callback.error(CardCommon.ERROR); | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | int bCount = mfc.getBlockCountInSector(a); | 
|---|
|  |  |  | if (b < 0 || b > bCount - 1) { | 
|---|
|  |  |  | callback.error(CardCommon.ERROR); | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | int type = mfc.getType();//获取TAG的类型 | 
|---|
|  |  |  | String typeS = ""; | 
|---|
|  |  |  | switch (type) { | 
|---|
|  |  |  | case MifareClassic.TYPE_CLASSIC: | 
|---|
|  |  |  | typeS = "TYPE_CLASSIC"; | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | case MifareClassic.TYPE_PLUS: | 
|---|
|  |  |  | typeS = "TYPE_PLUS"; | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | case MifareClassic.TYPE_PRO: | 
|---|
|  |  |  | typeS = "TYPE_PRO"; | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | case MifareClassic.TYPE_UNKNOWN: | 
|---|
|  |  |  | typeS = "TYPE_UNKNOWN"; | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 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); | 
|---|
|  |  |  | callback.callBack(data); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | callback.error(CardCommon.ERROR); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } catch (IOException e) { | 
|---|
|  |  |  | callback.error(CardCommon.ERROR_MOVE); | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | callback.error(CardCommon.ERROR); | 
|---|
|  |  |  | } finally { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | mfc.close(); | 
|---|
|  |  |  | } catch (IOException e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }).start(); | 
|---|
|  |  |  | public void getData(final int a, final int b, final BaseNfcReadHelper.NFCCallByteback callback) { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | adapter.getData(a, b, callback); | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public ManagerToUserCard getManagerToUserCardData() { | 
|---|
|  |  |  | ManagerToUserCard managerToUserCard = 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, defauleKey); | 
|---|
|  |  |  | if (!isOpen) { | 
|---|
|  |  |  | isOpen = mfc.authenticateSectorWithKeyA(1, companyKey); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 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; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | public ManagerToUserCard getManagerToUserCardData(BaseManagerToUserCard baseManagerToUserCard) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (flag) { | 
|---|
|  |  |  | managerToUserCard = ManagerToUserCard.getBean(list); | 
|---|
|  |  |  | return managerToUserCard; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } catch (IOException e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } finally { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | mfc.close(); | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | return (ManagerToUserCard) adapter.getManagerToUserCardData(baseManagerToUserCard); | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 返回监听类 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public interface NFCCallMapback { | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 返回读取nfc卡的全部信息 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param data 前面代表扇区 四个块的数据用#号隔开 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | void callBack(Map<String, List<byte[]>> data); | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | void error(int code); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 返回监听类 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public interface NFCCallListback { | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 返回读取nfc卡的全部信息 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param data 前面代表扇区 四个块的数据用#号隔开 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | void callBack(List<byte[]> data); | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | void error(int code); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public interface NFCCallByteback { | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 返回读取nfc卡的全部信息 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param data 前面代表扇区 四个块的数据用#号隔开 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  |  | 
|---|
|  |  |  | void callBack(byte[] data); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | void error(int code); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|