基本信息
源码名称: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());
}
}