首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

NFC相干研究

2012-08-10 
NFC相关研究NFC概述Android API概览Android.nfc包包含顶层类用来与本地NFC适配器交互。这些类可以表示被检

NFC相关研究

NFC概述
  • Android API概览

    Android.nfc包

    包含顶层类用来与本地NFC适配器交互。这些类可以表示被检测到的tag和NDEF数据。

    android.nfc.tech包

    包含那些对tag查询属性和进行I/O操作的类。这些类分别标示一个tag支持的不同的NFC技术标准。

    权限声明

    在AndroidManifest.xml中:

    1. intent-filter设置

      NFC intent filter告诉Android系统该Activity能处理NFC数据,可以定义1个或多个intent filter:

      Tag发布系统

      当Android设备扫描到一个NFC tag,一般的行为是自动找出会处理这个tag Intent的最合适的Activity,而不需要用户来选择用哪个Activity来处理。因为设备扫描NFC tag的范围和时间都很短,如果让用户选择,就有可能需要移动设备,这样将会打断这个扫描过程。应该开发只处理需要处理的tags的Activity,防 止出现让用户选择使用哪个Activity来处理的情况。

      Android提供两个系统来正确的识别一个NFC tag是否是Activity想要处理的:

      1. Intent发布系统

        Intent发布系统检查所有Activity的intent filters,找出那些定义了可以处理此tag的Activity,如果有多个Activity都配置了处理同一个tag Intent,那么将使用Activity选择器来让用户选择使用哪个Activity。用户选择之后,将使用选择的Activity来处理此 Intent.

        前台发布系统

        前台发布系统允许一个Activity覆盖掉Intent发布系统而首先处理此tag Intent,要求将要处理Tag Intent的Activity运行在前台,当一个NFC tag被扫描到时,系统会先检测前台的Activity是否支持处理此Intent,如果支持,即将此Intent传给此Activity,如果不支持, 则转到Intent发布系统。

        使用Intent发布系统

        Intent发布系统指定的3个intent有不同的优先级。通常当一个tag被检测到之后,Intent就被启动(start)了,这个启动遵循以下行为:

        • 假如Activity在AndroidManifest.xml文件里声明了处理android.nfc.action.TECH_DISCOVERED intent ,则必须创建一个Xml格式的资源文件,并加上Activity支持的技术到tech-list集合里。这样Activity将被认作能处理这些 tech-list的处理者,如果tag使用的技术在定义的列表里,Activity将接收此Intent。可以用getTechList()来获得 tag支持的技术。

          例如:如果一个tag被检测到支持MifareClassic, NdefFormatable, 和 NfcA,tech-list集合必须指定了其中的一项或者多项来告诉系统该Activity能处理此Intent。

          下面是一个资源文件例子,定义了所有的技术。可以根据需要删掉不需要的项,将此文件以任意名字+.xml保存到<project-root>/res/xml文件夹。

          使用前台发布系统

          前台发布系统允许一个Activity拦截tag Intent 获得最高优先级的处理,这种方式可以用下面的方法实现:

          1. 使用NFC tag上的数据

            NFC tag上的数据以字节存放,可以将其转换成其他想要的格式。当往tag写东西时,必须以字节格式来写。Android提供API来写符合NDEF标准的信息,使用此标准能保证数据在往tag写时能被所有Android NFC设备支持。

            很多tag使用他们自己的标准来存储数据,这些标准也被Android支持。但必须自己实现协议栈来读写这些tag。可以在android.nfc.tech里找到所有支持的技术,并且可以在TagTechnology接口里对该技术有个简单了解。

            为了方便使用NDEF消息,Android用NdefRecord和NdefMessage包装原始字节数据为NDEF消息。一个NdefMessage 是保存0个或多个NdefRecords的容器,每个NdefRecord有自己的唯一类型名字格式,记录类型和ID来与其他记录区分开。可以存储不同类 型,不同的长度的记录到同一个NdefMessage。NFC tag容量的限制决定NdefMessage的大小。

            支持Ndef和NdefFormatable技术的tag可以返回和接受NdefMessage对象为参数来进行读写操作。需要创建自己的逻辑来为其他在android.nfc.tech的tag技术实现读写字节的操作。

            读NFC tag

            当NFC tag靠近NFC设备时,相应的Intent将在设备上被创建。然后通知合适的程序来处理此Intent。下面的方法可以处理TAG_DISCOVERED intent并且使用迭代器来获得包含在NDEF tag负载中的数据。

            写NFC tag

            往NFC tag写东西涉及到构造一个NDEF消息和使用与tag匹配的Tag技术。下面的代码展示怎样写一个简单的文本到NdefFormatable tag:

            点对点数据交换

            前台推送技术支持简单点对点的数据交换,可以用enableForegroundNdefPush(Activity, NdefMessage)方法来打开此功能。

            使用此功能需要满足以下条件:

            • 在Activity里覆盖onResume()和onPause()的回调来正确处理前台推送的生命周期。必须在Activity位于前台并在主线程里调 用enableForegroundNdefPush(Activity, NdefMessage) (可以在onResume()里调用来保证这点)。
              public void onResume() {    super.onResume();    if (mAdapter != null)        mAdapter.enableForegroundNdefPush(this, myNdefMessage);}public void onPause() {    super.onPause();    if (mAdapter != null)        mAdapter.disableForegroundNdefPush(this);}

              当Activity位于前台,可以靠近另外一个NFC设备来推送数据。可参考例子ForegroundNdefPush来了解点对点数据交换。

热点排行