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卡。