android之NFC (二)

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章