|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 初始化卡 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public boolean initCard() { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | MifareClassic mfc = MifareClassic.get(tag); | 
|---|
|  |  |  | if (null != mfc) { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | //连接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 = mfc.authenticateSectorWithKeyA(sector, defauleKey); | 
|---|
|  |  |  | if (!isOpen) { | 
|---|
|  |  |  | isOpen = mfc.authenticateSectorWithKeyA(sector, companyKey2); | 
|---|
|  |  |  | if (isOpen){ | 
|---|
|  |  |  | mfc.authenticateSectorWithKeyB(sector, companyKey2); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (!isOpen) { | 
|---|
|  |  |  | isOpen = mfc.authenticateSectorWithKeyA(sector, companyKey); | 
|---|
|  |  |  | if (isOpen){ | 
|---|
|  |  |  | mfc.authenticateSectorWithKeyB(sector, companyKey); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (isOpen) { | 
|---|
|  |  |  | //获取写的扇区的块的数量 | 
|---|
|  |  |  | int blockCount = mfc.getBlockCountInSector(sector); | 
|---|
|  |  |  | int blockIndex = mfc.sectorToBlock(sector); | 
|---|
|  |  |  | for (int block = 0; block < blockCount ; block++) { | 
|---|
|  |  |  | // 跳过第 0 扇区的第 0 块 | 
|---|
|  |  |  | if (sector == 0 && block == 0) { | 
|---|
|  |  |  | blockIndex++; | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (block < 3) { | 
|---|
|  |  |  | mfc.writeBlock(blockIndex, data); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | mfc.writeBlock(blockIndex, initDataBytes); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //写卡 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | blockIndex++; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return true; | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } finally { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | mfc.close(); | 
|---|
|  |  |  | } catch (IOException e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 返回监听类 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public interface NFCCallback { | 
|---|