当前位置:文档之家› NFC简明教程

NFC简明教程


权限申明: <uses-permission android:name=”android.permission.NFC” /> 最低版本要求,NFC 是指 Android2.3 (Level 10) 才开始支持的,因此最低版本要求必须指定为 10. <uses-sdk android:minSdkVersion=”10″/> 如果需要在 Android Market 上发布,需要指定手机支持 NFC 功能。

android.nfc.tech 中则定义了可以对 Tag 进行的读写操作的类,这些类按照其使用的技术类型可以分成不同的类 如:NfcA, NfcB, NfcF,以及 MifareClassic 等。 常见的 Tag 为 Mifare ,后面的例子将以这种 Tag 为例介绍 NFC 读写方法。 本例参考 ApiDemos 中 NFC 的 ForegoundDispatch 来介绍编写 Android NFC 的基本步骤, 因为手边只有 MifareClassic 类型的 Tag ,需要对 ForegoundDispatch 的代码做些修改来检测 MifareClassic 的类型的 NFC Tag,读写其他类型 的 NFC Tag 的基本步骤是一致的。 1. 在 Android manifest 文件中申明和 NFC 相关的权限和功能选项:

NfcManager 可以用来管理 Android 设备中指出的所有 NFC Adapter,但由于大部分 Android 设备只支持一 个 NFC Adapter ,可以直接使用 getDefaultAapater 来获取系统支持的 Adapter。 NfcAdapter 为一 NFC Adapter 对象,可以用来定义一个 Intent 使系统在检测到 NFC Tag 时通知你定义的 Activity,并提供用来注册 forground tag 消息发送的方法等。 NdefMessage 和 NdefRecord NDEF 为 NFC forum 定义的数据格式。 Tag 代表一个被动式 Tag 对象,可以代表一个标签,卡片,钥匙扣等。当 Android 设备检测到一个 Tag 时, 会创建一个 Tag 对象,将其放在 Intent 对象,然后发送到相应的 Activity。
Near Field Communication (NFC) 为一短距离无线通信技术,通常有效通讯距离为 4 厘米以内。NFC 工作频率为 13.65 兆赫兹,通信速率为 106 kbit/秒到 848kbit/秒。 NFC 通信总是由一个发起者(initiator)和一个接受者(target)组成。通常 initiator 主动发送电磁场(RF)可以为 被动式接受者(passive target) 提供电源。其工作的基本原理和收音机类似。正是由于被动式接受者可以通过发起 者提供电源,因此 target 可以有非常简单的形式,比如标签,卡,sticker 的形式. NFC 也支持点到点的通信(peer to peer) 此时参与通信的双方都有电源支持。 和其它无线通信方式如 Bluetooth 相比,NFC 支持的通信带宽和距离要小的多,但是它成本低,如价格标签可能只 有几分钱,也不需要配对,搜寻设备等,通信双方可以在靠近的瞬间完成交互。 在 Android NFC 应用中,Android 手机通常是作为通信中的发起者,也就是作为 NFC 的读写器。Android 手机也可 以模拟作为 NFC 通信的接受者且从 Android 2.3.3 起也支持 P2P 通信。 Android 对 NFC 的支持主要在 android.nfc 和 android.nfc.tech 两个包中。 android.nfc 包中主要类如下:
@Override public void onCreate(Bundle savedState) { super.onCreate(savedState);
setContentView(yout.foreground_dispatch); mText = (TextView) findViewById(R.id.text); mText.setText("Scan a tag");
本例 NFCDemoActivity 支持两种 NFC 消息发送机制,上面的 XML 指明了 Intent 消息发送机制,其中 <meta-data android:name=”android.nfc.action.TECH_DISCOVERED” android:resource=”@xml/filter_nfc” /> 的 filter_nfc 指明了支持处理的 NFC Tag 类型,filter_nfc.xml 定义如下: <resources xmlns:xliff=”urn:oasis:names:tc:xliff:document:1.2″> <!– capture anything using NfcF –> <tech-list> <tech>android.nfc.tech.NfcA</tech> <tech>android.nfc.tech.MifareClassic</tech> <tech>android.nfc.tech.MifareUltralight</tech> </tech-list> </resources> 因为我只有 MifareClassic 类型的 Tag,所以只定义了 MifareClassic 相关的 Tag 类型,如果你可以处理所有 Android 支持的 NFC 类型,可以定义为: <resources xmlns: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> 有了这个 Manifest 中的申明, 当 Android 检测到有 Tag 时, 会显示 Activity 选择窗口, 如上图中的 Reading Example 。 当 NFCDemoActiviy 在前台运行时,我们希望只有它来处理 Mifare 类型的 Tag,此时可以使用前台消息发送机制, 下面的代码基本和 ApiDemos 中的 NFC 示例类似: public class NFCDemoActivity extends Activity { private NfcAdapter mAdapter; private PendingIntent mPendingIntent; private IntentFilter[] mFilters; private String[][] mTechLists; private TextView mText; private int mCount = 0;
<uses-feature android:name=”android.hardware.nfc” android:required=”true” /> 为 Activity 申明它支持处理 NFC Tag 比如我们的示例 Activity 在 Manifest 的申明如下: <activity android:name=”.NFCDemoActivity” android:label=”@string/app_name” android:launchMode=”singleTop”> <intent-filter> <action android:name=”android.intent.action.MAIN” /> <category android:name=”UNCHER” /> </intent-filter> <intent-filter> <action android:name=”android.nfc.action.NDEF_DISCOVERED”/> <data android:mimeType=”text/plain” /> </intent-filter> <intent-filter> <action android:name=”android.nfc.action.TAG_DISCOVERED” > </action> <category android:name=”android.intent.category.DEFAULT” > </category> </intent-filter> <!– Add a technology filter –> <intent-filter> <action android:name=”android.nfc.action.TECH_DISCOVERED” /> </intent-filter> <meta-data android:name=”android.nfc.action.TECH_DISCOVERED” android:resource=”@xml/filter_nfc” /> </activity> 三种 Activity NDEF_DISCOVERED ,TECH_DISCOVERED,TAG_DISCOVERED 指明的先后顺序非常重要, 当 Android 设备 检测到有 NFC Tag 靠近时,会根据 Action 申明的顺序给对应的 Activity 发送含 NFC 消息的 Intent. 2. Android NFC 消息发送机制 当 Android 设备检测到有 NFC Tag 时,理想的行为是触发最合适的 Activity 来处理检测到的 Tag,这是因为 NFC 通常是在非常近的距离才起作用(<4m) ,如果此时需要用户来选择合适的应用来处理 Tag,很容易断开与 Tag 之间 的通信。因此你需要选择合适的 Intent filter 只处理你想读写的 Tag 类型。 Android 系统支持两种 NFC 消息发送机制:Intent 发送机制和前台 Activity 消息发送机制。
相关主题