Android NFC framework introduction and develop guide
更新时间:2023-05-31 11:47:01 阅读量: 实用文档 文档下载
Android system NFC framework introduction and develop guide
Android NFC Basics 1.
2.
3. 4.
5.
6. 7. 8. 9.
10.
11.
12.
13.
14.
15.
16.
17. The Tag Dispatch System How NFC tags are mapped to MIME types and URIs How NFC Tags are Dispatched to Applications Requesting NFC Access in the Android Manifest Filtering for Intents ACTION_NDEF_DISCOVERED ACTION_TECH_DISCOVERED ACTION_TAG_DISCOVERED Obtaining information from intents Creating Common Types of NDEF Records TNF_ABSOLUTE_URI TNF_MIME_MEDIA TNF_WELL_KNOWN with RTD_TEXT TNF_WELL_KNOWN with RTD_URI TNF_EXTERNAL_TYPE Android Application Records Beaming NDEF Messages to Other Devices
This document describes the basic NFC tasks you perform in Android. It explains how to send and receive NFC data in the form of NDEF messages and describes the Android framework APIs that support these features. For more advanced topics, including a discussion of working with There are two major uses cases when working with NDEF data and Android:
Reading NDEF data from an NFC tag Beaming NDEF messages from one device to another with discovered NFC tags, appropriately categorizes the data, and starts an application that is
interested in the categorized data. An application that wants to handle the scanned NFC tag can The Android Beam feature allows a device to push an NDEF message onto another device by physically tapping the devices together. This interaction provides an easier way to send data than other wireless technologies like Bluetooth, because with NFC, no manual device discovery or pairing is required. The connection is automatically started when two devices come into range. Android Beam is available through a set of NFC APIs, so any application can transmit information between devices. For example, the Contacts, Browser, and YouTube applications use Android Beam to share contacts, web pages, and videos with other devices.
Android system NFC framework introduction and develop guide
The Tag Dispatch System
Android-powered devices are usually looking for NFC tags when the screen is unlocked, unless NFC is disabled in the device's Settings menu. When an Android-powered device discovers an NFC tag, the desired behavior is to have the most appropriate activity handle the intent without asking the user what application to use. Because devices scan NFC tags at a very short range, it is likely that making users manually select an activity would force them to move the device away from the tag and break the connection. You should develop your activity to only handle the NFC tags that your activity cares about to prevent the Activity Chooser from appearing.
To help you with this goal, Android provides a special tag dispatch system that analyzes scanned NFC tags, parses them, and tries to locate applications that are interested in the scanned data. It does this by:
1. Parsing the NFC tag and figuring out the MIME type or a URI that identifies the data
payload in the tag.
2. Encapsulating the MIME type or URI and the payload into an intent. These first two steps
are described in How NFC tags are mapped to MIME types and URIs.
3. Starts an activity based on the intent. This is described in How NFC Tags are Dispatched
to Applications.
How NFC tags are mapped to MIME types and URIs
Before you begin writing your NFC applications, it is important to understand the different types of NFC tags, how the tag dispatch system parses NFC tags, and the special work that the tag dispatch system does when it detects an NDEF message. NFC tags come in a wide array of technologies and can also have data written to them in many different ways. Android has the NDEF data is encapsulated inside a message (NdefMessage) that contains one or more records (NdefRecord). Each NDEF record must be well-formed according to the specification of the type of record that you want to create. Android also supports other types of tags that do not contain NDEF data, which you can work with by using the classes in the android.nfc.tech package. types of tags involves writing your own protocol stack to communicate with the tags, so we recommend using NDEF when possible for ease of development and maximum support for Android-powered devices.
Note:to construct NDEF records.
Android system NFC framework introduction and develop guide
Now that you have some background in NFC tags, the following sections describe in more detail how Android handles NDEF formatted tags. When an Android-powered device scans an NFC tag containing NDEF formatted data, it parses the message and tries to figure out the data's MIME type or identifying URI. To do this, the system reads the first NdefRecord inside the NdefMessage to determine how to interpret the entire NDEF message (an NDEF message can have multiple NDEF records). In a well-formed NDEF message, the first NdefRecord contains the following fields:
3-bit TNF (Type Name Format)
Indicates how to interpret the variable length
type field. Valid values are described in Variable length type
Describes the type of the record. If using TNF_WELL_KNOWN, use this field to specify the
Record Type Definition (RTD). Valid RTD Variable length ID
A unique identifier for the record. This field is
not used often, but if you need to uniquely
identify a tag, you can create an ID for it.
Variable length payload
The actual data payload that you want to read
or write. An NDEF message can contain
multiple NDEF records, so don't assume the
full payload is in the first NDEF record of the
NDEF message.
The tag dispatch system uses the TNF and type fields to try to map a MIME type or URI to the NDEF message. If successful, it encapsulates that information inside of a ACTION_NDEF_DISCOVERED intent along with the actual payload. However, there are cases when the tag dispatch system cannot determine the type of data based on the first NDEF record. This happens when the NDEF data cannot be mapped to a MIME type or URI, or when the NFC tag does not contain NDEF data to begin with. In such cases, a Tag object that has information about the tag's technologies and the payload are encapsulated inside of a ACTION_TECH_DISCOVERED intent instead.
Android system NFC framework introduction and develop guide
It also describes which TNFs cannot be mapped to a MIME type or URI. In these cases, the tag dispatch system falls back to ACTION_TECH_DISCOVERED.
For example, if the tag dispatch system encounters a record of type TNF_ABSOLUTE_URI, it maps the variable length type field of that record into a URI. The tag dispatch system
encapsulates that URI in the data field of an ACTION_NDEF_DISCOVERED intent along with other information about the tag, such as the payload. On the other hand, if it encounters a record of type TNF_UNKNOWN, it creates an intent that encapsulates the tag's technologies instead.
Table 1. Supported TNFs and their mappings
Table 2. Supported RTDs for TNF_WELL_KNOWN
and their mappings
Android system NFC framework introduction and develop guide
How NFC Tags are Dispatched to Applications
When the tag dispatch system is done creating an intent that encapsulates the NFC tag and its identifying information, it sends the intent to an interested application that filters for the intent. If more than one application can handle the intent, the Activity Chooser is presented so the user can select the Activity. The tag dispatch system defines three intents, which are listed in order of highest to lowest priority:
1. ACTION_NDEF_DISCOVERED: This intent is used to start an Activity when a tag that
contains an NDEF payload is scanned and is of a recognized type. This is the highest
priority intent, and the tag dispatch system tries to start an Activity with this intent before any other intent, whenever possible.
2. ACTION_TECH_DISCOVERED: If no activities register to handle the
ACTION_NDEF_DISCOVERED intent, the tag dispatch system tries to start an application with this intent. This intent is also directly started (without starting
ACTION_NDEF_DISCOVERED first) if the tag that is scanned contains NDEF data that
cannot be mapped to a MIME type or URI, or if the tag does not contain NDEF data but is of a known tag technology.
3. ACTION_TAG_DISCOVERED: This intent is started if no activities handle the
ACTION_NDEF_DISCOVERED or ACTION_TECH_DISCOVERED intents.
The basic way the tag dispatch system works is as follows:
Android system NFC framework introduction and develop guide
1. Try to start an Activity with the intent that was created by the tag dispatch system when
parsing the NFC tag (either ACTION_NDEF_DISCOVERED or ACTION_TECH_DISCOVERED).
2. If no activities filter for that intent, try to start an Activity with the next lowest priority intent
(either ACTION_TECH_DISCOVERED or ACTION_TAG_DISCOVERED) until an application filters for the intent or until the tag dispatch system tries all possible intents.
3. If no applications filter for any of the intents, do nothing.
Figure 1. Tag Dispatch System
Whenever possible, work with NDEF messages and the ACTION_NDEF_DISCOVERED intent, because it is the most specific out of the three. This intent allows you to start your application at a more appropriate time than the other two intents, giving the user a better experience. Requesting NFC Access in the Android Manifest
Before you can access a device's NFC hardware and properly handle NFC intents, declare these items in your AndroidManifest.xml file:
The NFC <uses-permission> element to access the NFC hardware:
The minimum SDK version that your application can support. API level 9 only supports
limited tag dispatch via ACTION_TAG_DISCOVERED, and only gives access to NDEF
messages via the EXTRA_NDEF_MESSAGES extra. No other tag properties or I/O
Android system NFC framework introduction and develop guide
operations are accessible. API level 10 includes comprehensive reader/writer support as well as foreground NDEF pushing, and API level 14 provides an easier way to push
NDEF messages to other devices with Android Beam and extra convenience methods to create NDEF records.
The uses-feature element so that your application shows up in the Android Market
only for devices that have NFC hardware:
If your application uses NFC functionality, but that functionality is not crucial to your application, you can omit the uses-feature element and check for NFC avalailbility at runtime by checking to see if getDefaultAdapter() is null. Filtering for NFC Intents
To start your application when an NFC tag that you want to handle is scanned, your application can filter for one, two, or all three of the NFC intents in the Android manifest. However, you usually want to filter for the ACTION_NDEF_DISCOVERED intent for the most control of when your application starts. The ACTION_TECH_DISCOVERED intent is a fallback for ACTION_NDEF_DISCOVERED when no applications filter for ACTION_NDEF_DISCOVERED or for when the payload is not NDEF. Filtering for ACTION_TAG_DISCOVERED is usually too general of a category to filter on. Many applications will filter for ACTION_NDEF_DISCOVERED or ACTION_TECH_DISCOVERED before ACTION_TAG_DISCOVERED, so your application has a low probability of starting. ACTION_TAG_DISCOVERED is only available as a last resort for
applications to filter for in the cases where no other applications are installed to handle the ACTION_NDEF_DISCOVERED or ACTION_TECH_DISCOVEREDintent.
Because NFC tag deployments vary and are many times not under your control, this is not always possible, which is why you can fallback to the other two intents when necessary. When you have control over the types of tags and data written, it is recommended that you use NDEF to format your tags. The following sections describe how to filter for each type of intent.
ACTION_NDEF_DISCOVERED
Android system NFC framework introduction and develop guide
To filter for ACTION_NDEF_DISCOVERED intents, declare the intent filter along with the type of data that you want to filter for. The following example filters for ACTION_NDEF_DISCOVERED intents with a MIME type of text/plain:
The following example filters for a URI in the form of
/index.html.
ACTION_TECH_DISCOVERED
If your activity filters for the ACTION_TECH_DISCOVERED intent, you must create an XML
resource file that specifies the technologies that your activity supports within a tech-list set. Your activity is considered a match if a tech-list set is a subset of the technologies that are supported by the tag, which you can obtain by calling getTechList().
For example, if the tag that is scanned supports MifareClassic, NdefFormatable, and NfcA, your tech-list set must specify all three, two, or one of the technologies (and nothing else) in order for your activity to be matched.
The following sample defines all of the technologies. You can remove the ones that you do not need. Save this file (you can name it anything you wish) in the <project-root>/res/xml folder.
Android system NFC framework introduction and develop guide
You can also specify multiple tech-list sets. Each of the tech-list sets is considered
independently, and your activity is considered a match if any single tech-list set is a subset of the technologies that are returned by getTechList(). This provides AND and OR semantics for matching technologies. The following example matches tags that can support the NfcA and Ndef technologies or can support the NfcB and Ndef technologies:
Android system NFC framework introduction and develop guide
In your AndroidManifest.xml file, specify the resource file that you just created in the <meta-data> element inside the <activity> element like in the following example:
For more information about working with tag technologies and the ACTION_TECH_DISCOVERED ACTION_TAG_DISCOVERED
To filter for ACTION_TAG_DISCOVERED use the following intent filter:
Obtaining information from intents
If an activity starts because of an NFC intent, you can obtain information about the scanned NFC tag from the intent. Intents can contain the following extras depending on the tag that was scanned:
EXTRA_TAG (required): A Tag object representing the
scanned tag.
Android system NFC framework introduction and develop guide
EXTRA_NDEF_MESSAGES (optional): An array of NDEF
messages parsed from the tag. This extra is mandatory
on intents.
{@link android.nfc.NfcAdapter#EXTRA_ID
(optional): The low-level ID of the tag. To obtain these extras, check to see if your activity was launched with one of the NFC intents to ensure that a tag was scanned, and then obtain the extras out of the intent. The following
example checks for the ACTION_NDEF_DISCOVERED intent and gets the NDEF messages from an intent extra.
Alternatively, you can obtain a Tag object from the intent, which will contain the payload and allow you to enumerate the tag's technologies:
Creating Common Types of NDEF Records
This section describes how to create common types of NDEF records to help you when writing to NFC tags or sending data with Android Beam. It also describes how to create the corresponding
Android system NFC framework introduction and develop guide
intent filter for the record. All of these NDEF record examples should be in the first NDEF record of the NDEF message that you are writing to a tag or beaming.
TNF_ABSOLUTE_URI
Given the following TNF_ABSOLUTE_URI NDEF record, which is stored as the first record inside of an NdefMessage:
the intent filter would look like this:
TNF_MIME_MEDIA
Given the following
TNF_MIME_MEDIA NDEF record, which is stored as the first record inside of an NdefMessage:
Android system NFC framework introduction and develop guide
TNF_WELL_KNOWN with RTD_TEXT
Given the following TNF_WELL_KNOWN NDEF record, which is stored as the first record inside of an NdefMessage:
Android system NFC framework introduction and develop guide
TNF_WELL_KNOWN with RTD_URI
Given the following TNF_WELL_KNOWN NDEF record, which is stored as the first record inside of an NdefMessage:
the intent filter would look like this:
Android system NFC framework introduction and develop guide
TNF_EXTERNAL_TYPE
Given the following TNF_EXTERNAL_TYPE NDEF record, which is stored as the first record inside of an NdefMessage:
the intent filter would look like this:
Use TNF_EXTERNAL_TYPE for more generic NFC tag deployments to better support both Android-powered and non-Android-powered devices.
Note: URNs for TNF_EXTERNAL_TYPE have a canonical format of:
urn:nfc:ext::externalType, however the NFC Forum RTD
specification declares that the urn:nfc:ext: portion of the URN must be ommitted
from the NDEF record. So all you need to provide is the domain ( in the
example) and type (externalType in the example) separated by a colon. When
dispatching TNF_EXTERNAL_TYPE, Android converts the
urn:nfc:ext::externalType URN to a
vnd.android.nfc://ext/:externalType URI, which is what the
intent filter in the example declares.
Android system NFC framework introduction and develop guide
Android Application Records
Introduced in Android 4.0 (API level 14), an Android Application Record (AAR) provides a
stronger certainty that your application is started when an NFC tag is scanned. An AAR has the package name of an application embedded inside an NDEF record. You can add an AAR to any NDEF record of your NDEF message, because Android searches the entire NDEF message for AARs. If it finds an AAR, it starts the application based on the package name inside the AAR. If the application is not present on the device, Android Market is launched to download the application.
AARs are useful if you want to prevent other applications from filtering for the same intent and potentially handling specific tags that you have deployed. AARs are only supported at the
application level, because of the package name constraint, and not at the Activity level as with If a tag contains an AAR, the tag dispatch system dispatches in the following manner:
1. Try to start an Activity using an intent filter as normal. If the Activity that matches the
intent also matches the AAR, start the Activity.
2. If the Activity that filters for the intent does not match the AAR, if multiple Activities can
handle the intent, or if no Activity handles the intent, start the application specified by the AAR.
3. If no application can start with the AAR, go to the Android Market to download the
application based on the AAR.
Note:is discovered. With this method, the activity must be in the foreground to override AARs and the intent dispatch system.
If you still want to filter for scanned tags that do not contain an AAR, you can declare intent filters as normal. This is useful if your application is interested in other tags that do not contain an AAR. For example, maybe you want to guarantee that your application handles proprietary tags that you deploy as well as general tags deployed by third parties. Keep in mind that AARs are specific to Android 4.0 devices or later, so when deploying tags, you most likely want to use a
combination of AARs and MIME types/URIs to support the widest range of devices. In addition, when you deploy NFC tags, think about how you want to write your NFC tags to enable support for the most devices (Android-powered and other devices). You can do this by defining a relatively unique MIME type or URI to make it easier for applications to distinguish.
Android provides a simple API to create an AAR, createApplicationRecord(). All you need to do is embed the AAR anywhere in your NdefMessage. You do not want to use the first record of your NdefMessage, unless the AAR is the only record in the NdefMessage. This is because
Android system NFC framework introduction and develop guide
the Android system checks the first record of an NdefMessage to determine the MIME type or URI of the tag, which is used to create an intent for applications to filter. The following code shows you how to create an AAR:
Beaming NDEF Messages to Other Devices
Android Beam allows simple peer-to-peer data exchange between two Android-powered devices. The application that wants to beam data to another device must be in the foreground and the device receiving the data must not be locked. When the beaming device comes in close enough contact with a receiving device, the beaming device displays the "Touch to Beam" UI. The user can then choose whether or not to beam the message to the receiving device.
Note: Foreground NDEF pushing was available at API level 10, which provides similar
functionality to Android Beam. These APIs have since been deprecated, but are available to support older devices. See enableForegroundNdefPush() for more
information.
You can enable Android Beam for your application by calling one of the two methods:
setNdefPushMessage(): Accepts an NdefMessage to set as the message to beam. Automatically beams the message when two devices are in close enough proximity. setNdefPushMessageCallback(): Accepts a callback that contains a
createNdefMessage() which is called when a device is in range to beam data to. The callback lets you create the NDEF message only when necessary. An activity can only push one NDEF message at a time, so setNdefPushMessageCallback() takes precedence over setNdefPushMessage() if both are set. To use Android Beam, the following general guidelines must be met:
The activity that is beaming the data must be in the foreground. Both devices must have their screens unlocked. You must encapsulate the data that you are beaming in an NdefMessage object. The NFC device that is receiving the beamed data must support the com.android.npp
NDEF push protocol or NFC Forum's SNEP (Simple NDEF Exchange Protocol). The
com.android.npp protocol is required for devices on API level 9 (Android 2.3) to API
Android system NFC framework introduction and develop guide
level 13 (Android 3.2). com.android.npp and SNEP are both required on API level 14 (Android 4.0) and later.
Note: If your activity enables Android Beam and is in the foreground, the standard dispatching.
To enable Android Beam:
1. Create an NdefMessage that contains the NdefRecords that you want to push onto the
other device.
2. Call setNdefPushMessage() with a NdefMessage or call setNdefPushMessageCallback passing in a NfcAdapter.CreateNdefMessageCallback object in the onCreate() method of your activity. These methods require at least one activity that you want to enable with
Android Beam, along with an optional list of other activities to activate.
In general, you normally use setNdefPushMessage() if your Activity only needs to push the same NDEF message at all times, when two devices are in range to communicate. You use setNdefPushMessageCallback when your application cares about the current context of the application and wants to push an NDEF message depending on what the user is doing in your application.
The following sample shows how a simple activity calls NfcAdapter.CreateNdefMessageCallback in the onCreate() method of an activity (see for the complete sample). This example also has methods to help you create a MIME record:
Android system NFC framework introduction and develop guide
public class Beam extends Activity implements CreateNdefMessageCallback { NfcAdapter mNfcAdapter; TextView textView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceSt ate); setContentView(yout.main); TextView textView = (TextView) findViewById(R.id.textView); // Check for available NFC Adapter mNfcAdapter = NfcAdapter.getDefaultAdapter(this); if (mNfcAdapter == null) { Toast.makeText(this, "NFC is not available", Toast.LENGTH_LONG).show(); finish(); return; } // Register callback mNfcAdapter.setNdefPushMessage Callback(this, this); } @Override public NdefMessage createNdefMessage(NfcEvent event) { String text = ("Beam me up, Android!\n\n" + "Beam Time: " + System.currentTimeMillis()); NdefMessage msg = new NdefMessage( new NdefRecord[] { createMimeRecord( "application/c om.example.android.beam", text.getBytes()) /** * The Android Application Record (AAR) is commented out. When a device * receives a push with an AAR in it, the application specified in the AAR * is guaranteed to run. The AAR overrides the tag dispatch system. * You can add it back in to
Android system NFC framework introduction and develop guide
guarantee that this * activity starts when receiving a beamed message. For now, this code * uses the tag dispatch system. */ //,NdefRecord.createApplicat ionRecord("com.example.android.beam") }); return msg; } @Override public void onResume() { super.onResume(); // Check to see that the Activity started due to an Android Beam if (NfcAdapter.ACTION_NDEF_DISCOVERED.equ als(getIntent().getAction())) { processIntent(getIntent()) ; } } @Override public void onNewIntent(Intent intent) { // onResume gets called after this to handle the intent setIntent(intent); } /** * Parses the NDEF Message from the intent and prints to the TextView */ void processIntent(Intent intent) { textView = (TextView) findViewById(R.id.textView); Parcelable[] rawMsgs = intent.getParcelableArrayExtra( NfcAdapter.EXTRA_NDEF_ MESSAGES); // only one message sent during the beam NdefMessage msg = (NdefMessage) rawMsgs[0]; // record 0 contains the MIME type, record 1 is the AAR, if present
Android system NFC framework introduction and develop guide
Note that this code comments out an AAR, which you can remove. If you enable the AAR, the application specified in the AAR always receives the Android Beam message. If the application is not present, the Android Market is started to download the application. Therefore, the following intent filter is not technically necessary for Android 4.0 devices or later if the AAR is used:
With this intent filter, the com.example.android.beam application now can be started when it scans an NFC tag or receives an Android Beam with an AAR of type
com.example.android.beam, or when an NDEF formatted message contains a MIME record of type application/com.example.android.beam.
Even though AARs guarantee an application is started or downloaded, intent filters are
recommended, because they let you start an Activity of your choice in your application instead of always starting the main Activity within the package specified by an AAR. AARs do not have
正在阅读:
Android NFC framework introduction and develop guide05-31
初中数学教师教学反思02-21
耳科习题06-13
多普勒效应综合试验10-04
街道党工委办事处年度工作总结报告08-04
人教版六年级上册数学第八单元数学广角 数与形单元教案及教学反思09-04
2017大连高考语文试题及双基试题04-10
对加强基层服务型党组织建设的思考08-10
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- introduction
- framework
- Android
- develop
- guide
- NFC
- 毕业设计:涡轮减速箱体加工工艺规程及工艺装备的设计
- 消防验收规范标准(最新完整版)
- 《煤矿机电设备管理》课程简介与标准
- 北京市政府采购货物招标文件范本
- 申请清华MBA提前面试必须了解的
- 宁夏高中名校2016届高三上学期第三次月考数学(文)试题(含答案)
- 低碳经济下公共交通运输管理研究
- 数控刀片磨的磨削程序
- 2015江西教师资格证统考《保教知识与能力》(幼儿园)笔试大纲
- 杭州碧桂园I标提高门窗抱框定位尺寸准确率
- 光阳幼儿园中班元宵节活动教案主题班会
- Exact edge singularities and dynamical correlations in spin-12 chains
- 湘教版高中地理必修二 第二章区域可持续发展 试卷
- “数字化校园”硬件平台建设规划草案2013.1.8
- 新乡医学院教研室预防题库
- 论高层建筑地下室防水工程施工质量的控制
- 教师如何听课评课
- 九年级英语感叹句
- 导线复测的各项精度要求
- 上海交大昂立英语抚州分校2011年新世纪一下期末考试试卷