实例介绍
【实例简介】
【实例截图】
【实例截图】
【核心代码】
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小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论