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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值