1.NDEF格式的NFC标签
现在了解一个NDEF格式的NFC标签中数据时怎么读取的。对于NDEF格式的NFC标签数据的操作时非常简单的,Android已经封装好了,我们可以直接通过对象的来读取和写入数据。
按照第一篇NFC文章那样进行声明,并启用前端分派。接下来就了解怎么进行读取和写入。
在onNewIntent方法中会传入参数Intent,从这个参数中我们就可以标签的中数据。代码如下
Parcelable[] msgs = getIntent().getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
if (msgs != null)
{
NdefMessage msg = (NdefMessage)msgs[0];
NdefRecord[] records = msg.getRecords();
for (NdefRecord ndefRecord : records) {
String type = new String(ndefRecord.getType(), "utf-8");
if (type.equals("application/demo")) {
mTxtTagID.setText(new String(ndefRecord.getPayload(), "utf-8"));
}
}
}
a.获取Intent,在通过Intent的getParcelableArrayExtra方法,获取Parcelable数组
b.接着把Parcelable对象转换为NdefMessage对象。Android中通过NdefMessage来传递参数,写入的时候也可以写入这样一个对象
c.NdefMessage对象中包含NdefRecord数组,NdefRecord用来实际存储用户数据。
d.创建NdefRecord对象时,需要指定数据的类型(android手机就是通过第一条NdefMessage中的第一个NdefRecord对象来确定NFC标签中数据的类型)。可以通过NdefRecord对象的getPayload方法获取实际存储的数据。
那接下来看怎么写入数据
a.首先要获取Tag对象。可以通过Intent对象获取Tag对象
Tag tag = getIntent().getParcelableExtra(NfcAdapter.EXTRA_TAG);
b.写入数据之前首先我们要构造需要写入的数据,即创建NdefMessage对象,并构造NdefRecord对象。
NdefRecord record = new NdefRecord(NdefRecord.TNF_MIME_MEDIA, "application/demo".getBytes("utf-8"), new byte[0], "NFC".getBytes("utf-8"));
NdefMessage msgMessage = new NdefMessage(new NdefRecord[]{record});
return msgMessage;
c.接着获取Ndef对象,并连接NFC卡,在调用writeNdefMessage方法写入数据
public static boolean WriteToTag(Tag tag, NdefMessage msg) throws IOException, Exception {
Ndef ndef = null;
try {
ndef = Ndef.get(tag);
if (ndef != null) {
ndef.connect();
if (!ndef.isWritable())
{
throw new Exception("");
}
byte[] msgByte = msg.toByteArray();
if (ndef.getMaxSize() < msgByte.length) {
throw new Exception("");
}
ndef.writeNdefMessage(msg);
return true;
}
} catch (Exception e) {
throw new Exception(e.getMessage());
}
finally {
if (ndef != null && ndef.isConnected())
{
ndef.close();
}
}
return false;
}
d.写入的时候,我们还可以调用格式化的方法进行写入。即如果NFC标签未格式成NDEF标签,那就可以先格式化,再写入
public static boolean WriteAndFormatToTag(Tag tag, NdefMessage msg) throws Exception {
NdefFormatable ndefFormat = null;
try {
ndefFormat = NdefFormatable.get(tag);
if (ndefFormat == null) {
throw new Exception("");
}
ndefFormat.connect();
ndefFormat.format(msg);
return true;
} catch (Exception e) {
throw new Exception("");
}
}
2.Mifare Classic卡
现在了解一下怎么读写Mifare Classic卡。卡很多类型,包括TypeA、TypeB、TypeF以及15693的卡
我们可以通过Tag对象的getTechList方法获取卡的类型。Mifare Classic即TypeA类型卡,如果我们把Mifare Classic卡格式成NDEF的卡,那调用getTechList就会获取一个数组,包含这三个类型。
String[] techlist = tag.getTechList();
在通过创建Mifare Classic对象来操作Mifare Classic卡
mifareClassic = MifareClassic.get(tag);
mifareClassic.connect();
boolean r = mifareClassic.authenticateSectorWithKeyB(0, getKey());
byte[] result = mifareClassic.readBlock(1);
首先需要调用connect()方法进行连接。然后进行密钥验证,再就可以通过readBlock来读取数据了。读取完之后记得调用close进行关闭。
自己开发的过程发现一个问题,在调试的过程读取不到数据,猜测是进行密钥验证之后要马上调用readBlock方法读取数据,否则读取不了。(调试的过程中我们是一步一步执行)
还有就是如果不调用close方法,会发现手机会失去NFC卡。