Android开发文档学习:NFC(近场通讯)(二)

来源:互联网 发布:mac网络重装系统失败 编辑:程序博客网 时间:2024/04/28 11:00

Android NFC API概述

Android中提供的与NFC相关的较高层的类都包含在android.nfc中,这个包中包含了用于与本地NFC适配器交互的类,用于代表已经识别的标签的类以及用来使用NDEF(Nfc Data Exchange Format )格式的类。

这个包中主要包括了如下几个类:

Show entries
Search: 
类名描述NfcManagerNFC的一个高级管理类,用于枚举出本机的NFC适配器。由于大多数的设备都只提供一个NFC适配器,因此在大多数情况下我们可以通过getDefaultAdapter(Context)这个静态的方法来得到本地的NFC适配器的引用。NfcAdapter该类代表了本地的NFC适配器。它定义了如何将NFC标签的信息传达给Activity的intent,并且提供了用于注册前台标签调度和前台的数据推送的方法。前台的基于NDEF的数据推送是目前Android仅提供的点到点支持方式。NdefMessage and NdefRecordNDEF是由NFC论坛所定义的一种数据结构,它是为了高效率的在NFC标签上存储数据,例如文本、url或者其他的数据格式。NdefMessage是用于封装需要传输或读取的数据的容器。而每一个NdefMessage包含了0个或若干个NdefRecord。每个NDEF的记录都包括一种有效类型的数据。在一条NDEF消息中的第一个记录的作用是向android的Activity调度一个标签。Tag该类代表了一个无源的NFC标签。这种标签可以来自于各种物体,比如通常所用的物理标签、卡片、钥匙卡或者也可以是一部可以仿真成NFC标签的电话机。当NFC识别设备发现了一个NFC标签,系统就会创建一个NFC Tag对象并在对象中封装一个intent。然后NFC的标签调度系统将会负责将这些intent调度到适当的Activity中。可以通过 getTechList() 方法来决定使用适合该Tag对象的读写标准并且可以使用 android.nfc.tech包所提供的相关类来创建与此相关的 TagTechnology 对象。
Showing 1 to 4 of 4 entries

 

Android.nfc.tech包主要是包括了一些用于查询特定标签的特性和I/O操作的类。所有的这些类都需要实现TagTechnology接口,它们包括NfcA、NfcB、NfcF、NfcV、IsoDep、Ndef、NdefFormtable、MifareClassic、MifareUltralight这几个类。

Android与NFC相关的类大致就是如上几个,下面我们简单的了解一下如何开始NFC的编程。

根据Android系统所遵循的权限机制,我们需要在AndroidManifest.xml中对需要使用的权限进行声明,这样在程序进行安装时将会提示用户该程序将会使用到哪些设备,让用户来决定是否赋予应用程序相应的权限,Android通过这样的机制来提高系统的安全性。因此当我们在应用程序中需要使用到NFC硬件的时候,我们应当在AndroidManifest.xml中加上:

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

另外还需要声明的是能够支持应用程序的最低SDK版本,由于对NFC的支持是在API 10以后才比较完善,因此我们需要使用:

1
<uses-sdk android:minSdkVersion="10"/>

android的应用程序都是通过上传到Android Market上供用户下载的,我们可以通过加入如下一段声明使我们的应用程序能够被归类到“支持NFC”的手机型号中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<uses-feature android:name="android.hardware.nfc" android:required="true" />1
<p style="text-indent: 2em;">最后,我们可以通过声明一些intent filter来告诉操作系统该Activity可以处理NFC数据,有三种声明的方式:
1        <intent-filter>
      <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
      <data android:mimeType="mime/type" />
    </intent-filter>
 
        <intent-filter>
      <action android:name="android.nfc.action.TECH_DISCOVERED"/>
      <meta-data android:name="android.nfc.action.TECH_DISCOVERED"
           android:resource="@xml/nfc_tech_filter.xml" />
    </intent-filter>
 
    <intent-filter>
      <action android:name="android.nfc.action.TAG_DISCOVERED"/>
    </intent-filter>

这三种intent filter的声明方式使用在特定的情况下。因此我们需要通过分析具体的应用程序来决定使用哪一种方式。具体怎么选择将在后面提到(标签调度系统)。

这里我们可以看一看一个完整的AndroidManifest.xml例子,取自于NFCDemo。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.nfc"
>
    <uses-permission android:name="android.permission.NFC" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <application
        android:icon="@drawable/icon"
        android:label="@string/app_name"
    >
    <activity android:name=".simulator.FakeTagsActivity"
        android:theme="@android:style/Theme.NoTitleBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
        <activity android:name="TagViewer"
            android:theme="@android:style/Theme.NoTitleBar"
        >
            <intent-filter>
                <action android:name="android.nfc.action.TAG_DISCOVERED"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
    </application>
    <uses-sdk android:minSdkVersion="9" />
    <uses-feature android:name="android.hardware.nfc" android:required="true" />
</manifest>
原创粉丝点击