NFC的安卓事儿(第三篇)

来源:互联网 发布:电脑版淘宝店招在哪里 编辑:程序博客网 时间:2024/06/06 02:59

(第三篇:开发NFC应用的前期配置工作)

前两篇我们对NFC有了概念上的了解,或许你可能还不是非常了解整个过程,那么没关系,本文将对前两篇进行一个总结并开始一个实际的开发操作。

现在,你应该能够知道这些:NFC就是一个短距离无线通信技术,该技术在手机设备最基本的运用便是让手机去感应一个如纸张薄的标签,手机设备需要在4cm以内才能对NFC标签进行感应识别。感应的过程无需人为去匹配两端,是自动而快速的。手机一旦感应到标签,那么系统将会对标签内容进行解析,解析到的不同结果将影响到手机执行的情况。比如如果标签是NDEF格式的数据类型那么手机将会优先打开最适合处理该数据类型的应用,但如果标签不属于NDEF格式或者里面的资源类型(映射到MIMEURI过程)不能确定时,手机便采用另一种消息Intent来触发手机。一旦手机能够获取到标签的内容,那么手机就可以利用这些信息进行一些操作了。至于如何利用这些数据就是开发者个人的后续工作了,这里不做讨论。

在遵循NDEF格式规范的标签中,一旦手机扫描到该目标,信息都将是封装在一个个NdefRecord记录中,NdefRecord再被封装进NdefMessage消息类,此消息类最后被封装进一个Intent中去触发手机从而打开相应Activity。这也是数据在整个过程的流通形式,而开发者便可在打开的Activity中去获取Intent里面的信息了。

废话不多说,我们直接切入开发的正题,在准备开发工作前,你首先要有一个支持NFC感应的手机或平板设备。因为NFC感应也是硬件支持的结果,你需要在的安卓工程中声明你使用NFC的权限:

AndroidManifest.xml 中添加如下权限声明:

<uses-permission android:name="android.permission.NFC"/>

 

记住,这是第一步,虽然不起眼,但还是要养成这种习惯,避免忘记声明的低级错误。

接下来,你还得声明你工程最低SDK版本,因为较低版本的Api中对NFC的支持情况没那么好,比如API Level 9 只限制在 ACTION_TAG_DISCOVERED 类型的调度,而对NDEF格式的消息类型也支持不多,对其它的标签类型就几乎不支持了。而在API Level 10中则包含了较复杂的读写操作,API Level 14提供了更加方便的推送NDEF数据到另一设备的方法,这可通过Android Beam实现。更让人欣喜的是,API Level 14使在创建NDEF数据的记录时大大简单快捷了。 所以,你可以在AndroidManifest.xml 中添加如下声明:

<uses-sdkandroid:minSdkVersion="10"/>

接下来的一个声明可能不是非常必要,就是如果你想你的应用在谷歌商城中只为那些支持NFC功能的设备提供下载时那么就要如下声明:

<uses-feature  android:name="android.hardware.nfc" android:required="true" />

当然,如果你的应用包含了NFC功能,但可能不是非常重要的一块,不影响你应用的其它重要用途,你也可以将该属性去掉哦。

完成了对NFC的一些配置信息的声明,接下来就要我们去对消息接收方面做些声明了。因为当设备感应到一个标签时,通过前文我们知道,标签调度系统将根据标签内容格式产生不同类型的Intent来触发手机弹出一个页面(Activity),如果你想你的应用在感应中能够收到这些Intent那么就需要你在过滤中进行特别声明了。通常来说,你应该首选过滤到ACTION_NDEF_DISCOVERED 类型的Intent当你的设备没有应用可以过滤到这种Intent的话那么ACTION_TECH_DISCOVERED 类型的Intent就会被创建了,还有一种情况,就是标签的数据类型不属于NDEF格式的话也会让系统创建该类型Intent。而对于 ACTION_TAG_DISCOVERED 来说,其优先级较低,一般是前面两种情况都不满足的情况下标签调动系统才会产生这种类型的Intent去触发设备应用。所以你就要注意了,当你的应用只声明过滤到ACTION_TAG_DISCOVERED 类型的Intent时,那么在感应过程中仅当没有其它应用能去处 ACTION_NDEF_DISCOVERED ACTION_TECH_DISCOVERED intent时才会触发你的应用。显然,这让你的应用处于比较被动的层次。所以,当你的应用希望能占据主动的地位时,这也是为什么要建议你要规范滴支持NDEF格式的数据并首要地支持过滤到ACTION_NDEF_DISCOVERED 类型的Intent

为了能够过滤到ACTION_NDEF_DISCOVERED Intent,需要在你工程下进行如下过滤器的声明:

<intent-filter>    

<action android:name="android.nfc.action.NDEF_DISCOVERED"/>    

<categoryandroid:name="android.intent.category.DEFAULT"/>    

<dataandroid:mimeType="text/plain"/>

</intent-filter>

记住android:mimeType="text/plain" 这个声明,它表示内容类型为text/plain intent才会去被你的应用接收处理。

以下的示例声明则表示只过滤到URI http://developer.android.com/index.html 样式的Intent

<intent-filter>    

<action android:name="android.nfc.action.NDEF_DISCOVERED"/>    

<category android:name="android.intent.category.DEFAULT"/>   

<dataandroid:scheme="http"android:host="developer.android.com"              android:pathPrefix="/index.html" />

</intent-filter>

ACTION_TECH_DISCOVERED 方面

如果你的工程(activity)要过滤到ACTION_TECH_DISCOVERED intent,那么就需要创建一个XML资源文件来指定你工程所能支持的技术,这通过一个 tech-list列表来进行说明。记住这很重要,因为读取一个标签时首先要确定标签能支持的技术,只要当你在tech-list 指定了相应能支持的技术那么你的应用才能被正确匹配从而进行触发。可以通过getTechList()方法来获得标签能支持的技术。

比如,如果一个标签被扫描后发现支持 MifareClassic, NdefFormatable,NfcA这三种技术,那么你的工程里面必须在tech-list中至少指定其中一种技术支持。

以下的示例中汇总了目前市面上标签需要支持的技术,你可以根据需要有选择地选择相关技术在你的工程中。该XML资源文件需要保存在<project-root>/res/xml 文件夹下。

<resourcesxmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">    

<tech-list>        

<tech>android.nfc.tech.IsoDep</tech>        

<tech>android.nfc.tech.NfcA</tech>        

<tech>android.nfc.tech.NfcB</tech>        

<tech>android.nfc.tech.NfcF</tech>       

 <tech>android.nfc.tech.NfcV</tech>       

 <tech>android.nfc.tech.Ndef</tech>       

 <tech>android.nfc.tech.NdefFormatable</tech>       

 <tech>android.nfc.tech.MifareClassic</tech>      

  <tech>android.nfc.tech.MifareUltralight</tech>    

</tech-list>

</resources>

当然了,这里还提供一种声明的形式,就是分成几个tech-list 独立来声明,如果某个块声明的技术是包含在标签支持的技术列表的,那么也可以被匹配。如下示例:

 

 

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">    

<tech-list>        

<tech>android.nfc.tech.NfcA</tech>       

  <tech>android.nfc.tech.Ndef</tech>    

</tech-list></resources>

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">    

<tech-list>        

<tech>android.nfc.tech.NfcB</tech>        

<tech>android.nfc.tech.Ndef</tech>    

</tech-list>

</resources>

配置好tech-list列表后,还需要在 AndroidManifest.xml 件中进行相关声明,你需要在相应的activity元素内进行 <meta-data> 元素的添加,如下所示:

<activity>
... <intent-filter>    

<actionandroid:name="android.nfc.action.TECH_DISCOVERED"/>

</intent-filter>

<meta-dataandroid:name="android.nfc.action.TECH_DISCOVERED"    android:resource="@xml/nfc_tech_filter" />
...</activity>

这样,就基本上完成了你的应用能对 ACTION_TECH_DISCOVERED intent进行过滤的配置。

ACTION_TAG_DISCOVERED

为了过滤到ACTION_TAG_DISCOVEREDintent,只需添加如下声明即可:

<intent-filter>    

<action android:name="android.nfc.action.TAG_DISCOVERED"/>

</intent-filter>

好了,以上从三个优先级不同的Intent类型进行了相关配置的介绍,这样我们就可以让我们的应用在手机感应NFC过程中接收到相应Intent进行处理了。完成了接收Intent的配置还只是开发的第一步,我们之前已经了解到,该Intent封装了被扫描标签包含的信息,获取到信息才是我们开发本身的意义,接下来我们将在第四篇开始学习如何对收集到的Intent进行信息读取操作。请继续关注!

 

 

 

 

 

0 0