上一章讲到了在activity的intent过滤器中,如果选用了TECH_DISCOVERED作为action的过滤模式,则必须要定义一个xml文件来筛选所能支持的NFC标准,步骤如下:
1、在AndroidManifest.xml中设置activity的intent过滤器
过滤器根据
<meta-data android:name="android.nfc.action.TECH_DISCOVERED"
android:resource="@xml/filter_nfc" />
来关联对应的tech过滤器filter_nfc文件,比如此处,对应的tech过滤器文件为filter_nfc,此文件是在xml文件夹下
2、filter_nfc中的过滤规则,假设一个tag使用的是14443-3A标准,而且在<tech-list>….</tech-list>标签之间刚好有<tech>android.nfc.tech.NfcA</tech>标签,则改tag方才满足android.nfc.action.TECH_DISCOVERED的过滤规则,当然,在次之前必须先前台发布规则和intent系统发布规则。
3、同一个<tech-list>….</tech-list>之间的<tech>是“并且”的关系,也即假设按照下图设置了所有的tech,则被扫描的tag必须同时具备所有的NFC标准,此tag才是可被识别的。
举例说明,深圳城市通卡同时满足以下三种tech:
<tech>android.nfc.tech.IsoDep</tech>
<tech>android.nfc.tech.MifareClassic</tech>
<tech>android.nfc.tech.NfcA</tech>
所以当<tech-list>….</tech-list>之中包含且仅包含三种tech中的一种或几种时,该深圳城市通卡是可以满足android.nfc.action.TECH_DISCOVERED的过滤规则,但是当增加之外的tech时,比如<tech>android.nfc.tech.MifareUltralight</tech>,则深圳城市通卡无法满足TECH_DISCOVERED规则。
4、<tech-list>….</tech-list>与<tech-list>….</tech-list>之间是“或者”的关系,tag只要满足其中任何一种tech,则可以满足android.nfc.action.TECH_DISCOVERED的过滤规则。通过这个特性可以测试出一张IC卡究竟满足哪种NFC规范,把每种tech写在一个<tech-list>….</tech-list>之间,进行一一的判别,如下图:
例子下址地址:http://download.youkuaiyun.com/detail/niejing654092427/4398354
将本例安装在手机上.
情况1:把深圳通靠近NFC手机,如果手机上的应用只有这个支持,就会打开该应用.效果如下:
情况2:把深圳通靠近NFC手机,如果手机上的多个应用支持,就会出现一个选择,效果如下:
说明:
当手机开启了NFC,并且检测到一个TAG后,TAG分发系统会自动创建一个封装了NFC TAG信息的intent。如果多于一个应用程序能够处理这个intent的话,那么手机就会弹出一个框(如上图),让用户选择处理该TAG的Activity。
TAG分发系统定义了3中intent。按优先级从高到低排列为:NDEF_DISCOVERED, TECH_DISCOVERED, TAG_DISCOVERED
当Android设备检测到有NFC Tag靠近时,会根据Action申明的顺序给对应的Activity 发送含NFC消息的 Intent。
此处我们使用的intent-filter的Action类型为TECH_DISCOVERED从而可以处理所有类型为ACTION_TECH_DISCOVERED并且使用的技术为nfc_tech_filter.xml文件中定义的类型的TAG。