| | |
| | | |
| | | 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.henanlibrary.card.UserCard; |
| | | import com.dayu.henanlibrary.utils.CardCommon; |
| | | import com.dayu.baselibrary.tools.nfc.BaseNfcReadHelper; |
| | | import com.dayu.baselibrary.tools.nfc.NfcReadAdapter; |
| | | import com.dayu.henanlibrary.card.UserCardHN; |
| | | |
| | | import java.io.IOException; |
| | | import java.util.ArrayList; |
| | | import java.util.HashMap; |
| | | import java.util.Collections; |
| | | 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 HNBaseHelper { |
| | | |
| | | 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); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 单例初始化 |
| | |
| | | * |
| | | * @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(); |
| | | } |
| | | } |
| | | public UserCardHN getUserCardData() { |
| | | try { |
| | | return (UserCardHN) adapter.getUserCardData(new UserCardHN()); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | 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 BaseCommon.CARD_TYPE_ERROR2; |
| | | } |
| | | } catch (IOException e) { |
| | | return BaseCommon.CARD_TYPE_ERROR1; |
| | | } finally { |
| | | try { |
| | | mfc.close(); |
| | | } catch (IOException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | try { |
| | | return adapter.getCradType(); |
| | | } 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(); |
| | | } |
| | | } |
| | | |
| | |
| | | * |
| | | * @param callback |
| | | */ |
| | | public void getOneSectorData(NFCCallListback callback) { |
| | | |
| | | |
| | | MifareClassic mfc = null; |
| | | public void getOneSectorData(BaseNfcReadHelper.NFCCallListback callback) { |
| | | try { |
| | | mfc = MifareClassic.get(tag); |
| | | adapter.getOneSectorData(callback); |
| | | } 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 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 void getData(final int a, final int b, final BaseNfcReadHelper.NFCCallByteback callback) { |
| | | try { |
| | | adapter.getData(a, b, callback); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | |
| | | |
| | | public interface NFCCallByteback { |
| | | /** |
| | | * 返回读取nfc卡的全部信息 |
| | | * |
| | | * @param data 前面代表扇区 四个块的数据用#号隔开 |
| | | */ |
| | | |
| | | void callBack(byte[] data); |
| | | |
| | | void error(int code); |
| | | } |
| | | |
| | | } |