实例介绍
【实例简介】
【实例截图】
【实例截图】
【核心代码】
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()); } }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论