基本信息
源码名称:nfc 简单卡模拟demo
源码大小:10.02M
文件格式:.zip
开发语言:Java
更新时间:2021-07-23
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
package com.simcom.readnfclist.activity; import android.app.PendingIntent; import android.content.Intent; import android.nfc.NdefMessage; import android.nfc.NdefRecord; import android.nfc.NfcAdapter; import android.nfc.Tag; import android.nfc.tech.IsoDep; import android.nfc.tech.MifareClassic; import android.nfc.tech.MifareUltralight; import android.nfc.tech.Ndef; import android.os.Build; import android.os.Bundle; import android.os.Parcelable; import android.support.annotation.RequiresApi; import android.widget.TextView; import android.widget.Toast; import com.simcom.readnfclist.R; import com.simcom.readnfclist.base.BaseNfcActivity; import com.simcom.readnfclist.tools.utils; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.Arrays; import com.simcom.readnfclist.been.NfsreadAID; import com.simcom.readnfclist.db.AccountStorage; /** * Author:Created by Ricky on 2017/8/25. * Email:584182977@qq.com * Description: */ @RequiresApi(api = Build.VERSION_CODES.KITKAT) public class ReadTextActivity extends BaseNfcActivity implements NfcAdapter.ReaderCallback { private TextView mNfcText; private String mTagText; // self-defined APDU public static final String STATUS_SUCCESS = "9000"; public static final String STATUS_FAILED = "6F00"; public static final String CLA_NOT_SUPPORTED = "6E00"; public static final String INS_NOT_SUPPORTED = "6D00"; public static final String AID = "A0000002471001"; public static final String LC = "07"; public static final String SELECT_INS = "A4"; public static final String DEFAULT_CLA = "00"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_read_text); mNfcText = (TextView) findViewById(R.id.tv_nfctext); } @Override public void onNewIntent(Intent intent) { /* //1.获取Tag对象 Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); //2.获取Ndef的实例 Ndef ndef = Ndef.get(detectedTag); mTagText = ndef.getType() "\nmaxsize:" ndef.getMaxSize() "bytes\n\n"; readNfcTag(intent); mNfcText.setText(mTagText);*/ if (intent != null) { processIntent(intent); } } @Override protected void onStart() { super.onStart(); } @Override public void onResume() { // TODO Auto-generated method stub super.onResume(); /* if (NfcAdapter.EXTRA_AID != null) NfcAdapter.enableForegroundDispatch(this, pendingIntent, FILTERS, TECHLISTS); NfcAdapter.enableReaderMode(this, this, NfcAdapter.FLAG_READER_NFC_A | NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK, null);*/ } /** * 读取NFC标签文本数据 */ private void readNfcTag(Intent intent) { if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) { Parcelable[] rawMsgs = intent.getParcelableArrayExtra( NfcAdapter.EXTRA_NDEF_MESSAGES); NdefMessage msgs[] = null; int contentSize = 0; if (rawMsgs != null) { msgs = new NdefMessage[rawMsgs.length]; for (int i = 0; i < rawMsgs.length; i ) { msgs[i] = (NdefMessage) rawMsgs[i]; contentSize = msgs[i].toByteArray().length; } } try { if (msgs != null) { NdefRecord record = msgs[0].getRecords()[0]; String textRecord = parseTextRecord(record); mTagText = textRecord "\n\ntext\n" contentSize " bytes"; } } catch (Exception e) { } } } /** * 解析NDEF文本数据,从第三个字节开始,后面的文本数据 * * @param ndefRecord * @return */ public static String parseTextRecord(NdefRecord ndefRecord) { /** * 判断数据是否为NDEF格式 */ //判断TNF if (ndefRecord.getTnf() != NdefRecord.TNF_WELL_KNOWN) { return null; } //判断可变的长度的类型 if (!Arrays.equals(ndefRecord.getType(), NdefRecord.RTD_TEXT)) { return null; } try { //获得字节数组,然后进行分析 byte[] payload = ndefRecord.getPayload(); //下面开始NDEF文本数据第一个字节,状态字节 //判断文本是基于UTF-8还是UTF-16的,取第一个字节"位与"上16进制的80,16进制的80也就是最高位是1, //其他位都是0,所以进行"位与"运算后就会保留最高位 String textEncoding = ((payload[0] & 0x80) == 0) ? "UTF-8" : "UTF-16"; //3f最高两位是0,第六位是1,所以进行"位与"运算后获得第六位 int languageCodeLength = payload[0] & 0x3f; //下面开始NDEF文本数据第二个字节,语言编码 //获得语言编码 String languageCode = new String(payload, 1, languageCodeLength, "US-ASCII"); //下面开始NDEF文本数据后面的字节,解析出文本 String textRecord = new String(payload, languageCodeLength 1, payload.length - languageCodeLength - 1, textEncoding); return textRecord; } catch (Exception e) { throw new IllegalArgumentException(); } } @Override public void onTagDiscovered(Tag tag) { System.out.println("onTagDiscovered"); // Card response for IsoDep final StringBuilder cardResp = new StringBuilder("Card response: \n"); // read card data of CardEmulator IsoDep isoDep = IsoDep.get(tag); try { isoDep.connect(); byte [] resp = isoDep.transceive(utils.hexStringToByteArray(DEFAULT_CLA SELECT_INS "0400" LC AID)); String respStatus = utils.encodeHexString(resp, true); if (respStatus.equals(STATUS_SUCCESS)) { cardResp.append("Success response"); } else { cardResp.append("Failed response, code:").append(respStatus); } runOnUiThread(new Runnable() { @Override public void run() { /* if (getIntent() != null) { processIntent(getIntent()); }else*/ { mNfcText.setText(cardResp.toString()); } } }); } catch (IOException e) { e.printStackTrace(); } } private void processIntent(Intent intent) { if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction())) { Toast.makeText(this, "ACTION_TECH_DISCOVERED", Toast.LENGTH_LONG).show(); } else if (Intent.ACTION_MAIN.equals(intent.getAction())) { return; } /*else { Toast.makeText(this, "Invalid action - " intent.getAction(), Toast.LENGTH_LONG).show(); return; }*/ StringBuilder nfcInfo = new StringBuilder(); byte[] extraId = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID); // Id if (extraId != null) { ///NfsreadAID aid =new NfsreadAID(); //aid.setResdAID(utils.encodeHexString(extraId, false)); AccountStorage.SetAccount(this ,utils.encodeHexString(extraId, false)); nfcInfo.append("ID (hex): ").append(utils.encodeHexString(extraId, false)).append("\n"); } // Tag info Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); // Technologies StringBuilder technologiesAvailable = new StringBuilder("Technologies Available: \n"); // Card type. StringBuilder cardType = new StringBuilder("Card Type: \n"); // Sector and block. StringBuilder sectorAndBlock = new StringBuilder("Storage: \n"); // Sector check StringBuilder sectorCheck = new StringBuilder("Sector check: \n"); int idx = 0; for (String tech : tag.getTechList()) { if (tech.equals(MifareClassic.class.getName())) { // Mifare Classic MifareClassic mfc = MifareClassic.get(tag); switch (mfc.getType()) { case MifareClassic.TYPE_CLASSIC: cardType.append("Classic"); break; case MifareClassic.TYPE_PLUS: cardType.append("Plus"); break; case MifareClassic.TYPE_PRO: cardType.append("Pro"); break; case MifareClassic.TYPE_UNKNOWN: cardType.append("Unknown"); break; } sectorAndBlock.append("Sectors: ").append(mfc.getSectorCount()).append("\n") .append("Blocks: ").append(mfc.getBlockCount()).append("\n") .append("Size: ").append(mfc.getSize()).append(" Bytes"); try { // Enable I/O to the tag mfc.connect(); for (int i = 0; i < mfc.getSectorCount(); i) { if (mfc.authenticateSectorWithKeyA(i, MifareClassic.KEY_DEFAULT)) { sectorCheck.append("Sector <").append(i).append("> with KeyA auth succ\n"); // Read block of sector final int blockIndex = mfc.sectorToBlock(i); for (int j = 0; j < mfc.getBlockCountInSector(i); j) { byte[] blockData = mfc.readBlock(blockIndex j); sectorCheck.append(" Block <").append(blockIndex j).append("> ") .append(utils.encodeHexString(blockData, false)).append("\n"); } } else if (mfc.authenticateSectorWithKeyB(i, MifareClassic.KEY_DEFAULT)) { sectorCheck.append("Sector <").append(i).append("> with KeyB auth succ\n"); // Read block of sector final int blockIndex = mfc.sectorToBlock(i); for (int j = 0; j < mfc.getBlockCountInSector(i); j) { byte[] blockData = mfc.readBlock(blockIndex j); sectorCheck.append(" Block <").append(blockIndex j).append("> ") .append(utils.encodeHexString(blockData, false)).append("\n"); } } else { sectorCheck.append("Sector <").append(i).append("> auth failed\n"); } } } catch (IOException e) { e.printStackTrace(); Toast.makeText(this, "Try again and keep NFC tag below device", Toast.LENGTH_LONG).show(); } } else if (tech.equals(MifareUltralight.class.getName())) { // Mifare Ultralight MifareUltralight mful = MifareUltralight.get(tag); switch (mful.getType()) { case MifareUltralight.TYPE_ULTRALIGHT: cardType.append("Ultralight"); break; case MifareUltralight.TYPE_ULTRALIGHT_C: cardType.append("Ultralight C"); break; case MifareUltralight.TYPE_UNKNOWN: cardType.append("Unknown"); break; } } String [] techPkgFields = tech.split("\\."); if (techPkgFields.length > 0) { final String techName = techPkgFields[techPkgFields.length-1]; if (0 == idx ) { technologiesAvailable.append(techName); } else { technologiesAvailable.append(", ").append(techName); } } } nfcInfo.append("\n").append(technologiesAvailable).append("\n") .append("\n").append(cardType).append("\n"); // NDEF Messages StringBuilder sbNdefMessages = new StringBuilder("NDEF Messages: \n"); Parcelable[] rawMessages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); if (rawMessages != null) { NdefMessage[] messages = new NdefMessage[rawMessages.length]; for (int i = 0; i < rawMessages.length; i) { messages[i] = (NdefMessage) rawMessages[i]; } for (NdefMessage message : messages) { for (NdefRecord record : message.getRecords()) { if (record.getTnf() == NdefRecord.TNF_WELL_KNOWN) { if (Arrays.equals(record.getType(), NdefRecord.RTD_TEXT)) { try { // NFC Forum "Text Record Type Definition" section 3.2.1. byte[] payload = record.getPayload(); String textEncoding = ((payload[0] & 0200) == 0) ? "UTF-8" : "UTF-16"; int languageCodeLength = payload[0] & 0077; String languageCode = new String(payload, 1, languageCodeLength, "US-ASCII"); String text = new String(payload, languageCodeLength 1, payload.length - languageCodeLength - 1, textEncoding); sbNdefMessages.append(" - ").append(languageCode).append(", ") .append(textEncoding).append(", ").append(text).append("\n"); } catch (UnsupportedEncodingException e) { // should never happen unless we get a malformed tag. throw new IllegalArgumentException(e); } } } } } } nfcInfo.append("\n").append(sbNdefMessages).append("\n") .append("\n").append(sectorAndBlock).append("\n") .append("\n").append(sectorCheck).append("\n"); mNfcText.setText(nfcInfo.toString()); } }