本文译自:http://developer.android.com/guide/topics/connectivity/nfc/advanced-nfc.html
本文介绍一些高级的NFC专题,如多样的NFC标签技术、编写NFC标签、以及前台调度,前台调度允许在前台的应用程序优先调度Intent事件,即使还有其他的过滤同样的Intent事件的应用程序存在。
Android所支持的NFC标签技术
在使用NFC标签和Android设备来进行工作的时候,使用的读写NFC标签上数据的主要格式是NDEF。当设备扫描到带有NDEF的数据时,Android会提供对消息解析的支持,并在可能的时候,会以NdefMessage对象的形式来发送它。但是,有些情况下,设备扫描到的NFC标签没有包含NDEF数据,或者该NDEF数据没有被映射到MIME类型或URI。在这些情况下,你需要打开跟NFC标签的通信,并用自己的协议(原始的字节形式)来读写它。Android用android.nfc.tech包提供了对这些情况的一般性支持,这个包在下表1中介绍。你能够使用getTechList()方法来判断NFC标签所支持的的技术,并且用android.nfc.tech提供的一个类来创建对应的TagTechnology对象。
表1.NFC标签所支持的技术
类 | 介绍 |
TagTechnology | 所有的NFC标签技术类必须实现的接口。 |
NfcA | 提供对NFC-A(ISO 14443-3A)属性和I/O操作的访问。 |
NfcB | 提供对NFC-B(ISO 14443-3B)属性和I/O操作的访问。 |
NfcF | 提供对NFC-F(ISO 6319-4)属性和I/O操作的访问。 |
NfcV | 提供对NFC-V(ISO 15693)属性和I/O操作的访问。 |
IsoDep | 提供对NFC-A(ISO 14443-4)属性和I/O操作的访问。 |
Ndef | 提供对NDEF格式的NFC标签上的NDEF数据和操作的访问。 |
NdefFormatable | 提供了对可以被NDEF格式化的NFC标签的格式化操作。 |
表2.可选的NFC标签所支持的技术
类 | 介绍 |
MifareClassic | 如果Android设备支持MIFARE,那么它提供了对经典的MIFARE类型标签属性和I/O操作的访问。 |
MifareUltralight | 如果Android设备支持MIFARE,那么它提供了对超薄的MIFARE类型标签属性和I/O操作的访问。 |
NFC标签和ACTION_TECH_DISCOVERED类型的Intent协同工作
当设备扫描到带有NDEF数据的NFC标签,但却不能映射到MIME或URI时,NFC标签调度系统就尝试使用ACTION_TECH_DISCOVERED类型的Intent来启动一个Activity。在被扫描到的NFC标签上没有NDEF数据时,也会使用ACTION_TECH_DISCOVERED类型的Intent。有了这种回退机制,如果调度系统不能够帮你解析数据,那么你就可以直接使用NFC标签上数据来工作。基本步骤如下:
1. 给你希望处理的NFC标签指定ACTION_TECH_DISCOVERED类型的Intent过滤器。更多信息请看“NFC的Intent过滤”。通常,在NDEF消息不能被映射到MIME类型或URI时,或者被扫描到的NFC标签不包含NDEF数据时,NFC标签调度系统会尝试启动一个ACTION_TECH_DISCOVERED类型的Intent。更多信息,请看“NFC标签调度系统”。
2. 应用程序接收到Intent对象时,从该Intent对象中获取Tag对象:
Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
3. 通过调用android.nfc.tech包中对应类的一个get工厂方法,来获取一个TagTechnology对象实例。在调用get工厂方法之前,通过调用getTechList()方法来枚举NFC标签所支持的技术。例如,用下列方法从Tag对象中获取MifareUltralight对象实例:
MifareUltralight.get(intent.getParcelableExtra(NfcAdapter.EXTRA_TAG));