`
qilixiang012
  • 浏览: 210719 次
文章分类
社区版块
存档分类
最新评论

android nfc(官方翻译)

 
阅读更多

为了充分详细的学习nfc相关的知识,决定阅读官方英文文档,并翻译下来供大家阅读。


NFC Basics

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 Android Beam™


The Tag Dispatch System

Parsing the NFC tag and figuring out the MIME type or a URI that identifies the data payload in the tag.

解析NFC标签,计算出MINE类型或者一个URI,用于标示数据负载的身份

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.

封装MIME类型或者URI和负载放入intent对象,这两步由How NFC tags are mapped to MIME types and URIs描述。

Starts an activity based on the intent. This is described in How NFC Tags are Dispatched to Applications.

启动一个activity根据这个intent对象,这部分由How NFC Tags are Dispatched to Applications.描述


How NFC tags are mapped to MIME types and URIs(NFC标签是如何映射到MINE类型和URI的?)

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 most support for the NDEF standard, which is defined by the NFC Forum.

在你开始写NFC应用之前,理解不同类型的NFC标签,标签调度系统如何解析NFC标签,当标签调度系统检测到NDECmessage所要做的特殊工作,NFC标签来着不同类型的技术,写入标签有不同的方式,Android推荐使用NDEF标准,它是由NFC社区发起的

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. To learn more about these technologies, see the Advanced NFC topic. Working with these other 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.

NDEF数据封装在一个由多个NdefRecord组成的NdefMessage中,每一个NDEF记录必须是格式良好的根据你要创建的具体类型,Android也支持其他不包含NDEF数据的类型,你能够使用android.nfc.tech进行工作,为了学习这些技术,请看Advanced NFC topic,操作这些标签会牵涉到你自己的协议栈和标签进行交流,因此为了简化开发和最大化支持android设备,我们建议使用NDEF尽可能。

Note: To download complete NDEF specifications, go to the NFC Forum Specification Download site and see Creating common types of NDEF records for examples of how to construct NDEF records.

注意:为了下载完整的NDEF详情,去NFC社区下载然后阅读如何构建公共类型的NDEF记录的例子。

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:

现在你要具有NFC标签的背景,如下部分描述如何如何处理NDEF格式标签的更多详情。当一个android支持的设别检测到NFC包含NDEF格式的标签后,解析里面的信息然后试图计算数据的MIME类型和URI身份,为了读取它,系统阅读NDEF信息的第一个记录然后说明整个NDEF信息(一个NDEF信息有多个NDEF记录),在一个格式良好的NDEF信息内,第一个NdefRecord包含如下字段:

3-bit TNF (Type Name Format)

Indicates how to interpret the variable length type field. Valid values are described in described in Table 1.

指明了如何解析可变长度字段,有效值被描述在表1.

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 values are described in Table 2.

详细record的类型,如有使用了TNF_WELL_KNOWN,使用这个字段具体得记录的类型,有效的RTD值被描述在表2。

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.

record唯一的身份,这个字段不是经常使用的,除非你需要唯一确定一个标签,你可以为它创建一个ID

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.

确切的你将要读写的数据的payload,一个DNEFmessage能包含大量的NDEF records,所以不要假定所有的payload在NDEFmessage的第一个NDEF record。

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.

标签调度系统使用TNF和type字段尝试映射一个MIME类型或者URI到一个NDEF message。如果成功,它将封装信息进一个ACTION_NDEF_DISCOVERED的intent伴随了确切的payload,这儿关心当调度系统不能决定数据的类型根据第一个NDEF record,这个情况发生在当NDEF data不能映射到一个MIME类型或者一个URI或者当NFC标签不包含NDEF的头信息时,这些情况,一个标签对象的的信息技术和负载将由ACTION_TECH_DISCOVERED的intent取代

Table 1. describes how the tag dispatch system maps TNF and type fields to MIME types or URIs. 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.

表1:描述标签调度系统映射TNF and type field到一个MIME类型或者URIs。它也描述了TNFs不能被映射的MIME类型和 URI,如果这样的话,标签调度系统将回落给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.

例如:如果标签 调度系统检测到一个TNF_ABSOLUTE_URI类型的记录,它映射记录的the variable length type field到一个URI,标签调度系统封装URI数据和相应payload的到ACTION_NDEF_DISCOVEREDintent,另一个方面,如果遇到一个TNF_UNKNOWN的记录,它将创建一个tag's technologies 封装取代(ACTION_TECH_DISCOVERED)。

Table 1.Supported TNFs and their mappings

Type Name Format (TNF) Mapping
TNF_ABSOLUTE_URI URI based on the type field.
TNF_EMPTY Falls back toACTION_TECH_DISCOVERED.
TNF_EXTERNAL_TYPE URI based on the URN in the type field. The URN is encoded into the NDEF type field in a shortened form:<domain_name>:<service_name>. Android maps this to a URI in the form:vnd.android.nfc://ext/<domain_name>:<service_name>.
TNF_MIME_MEDIA MIME type based on the type field.
TNF_UNCHANGED Invalid in the first record, so falls back toACTION_TECH_DISCOVERED.
TNF_UNKNOWN Falls back toACTION_TECH_DISCOVERED.
TNF_WELL_KNOWN MIME type or URI depending on the Record Type Definition (RTD), which you set in the type field. SeeTable 2.for more information on available RTDs and their mappings.

Table 2.Supported RTDs for TNF_WELL_KNOWN and their mappings

Record Type Definition (RTD) Mapping
RTD_ALTERNATIVE_CARRIER Falls back toACTION_TECH_DISCOVERED.
RTD_HANDOVER_CARRIER Falls back toACTION_TECH_DISCOVERED.
RTD_HANDOVER_REQUEST Falls back toACTION_TECH_DISCOVERED.
RTD_HANDOVER_SELECT Falls back toACTION_TECH_DISCOVERED.
RTD_SMART_POSTER URI based on parsing the payload.
RTD_TEXT MIME type oftext/plain.
RTD_URI URI based on payload.

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:

当标签调度系统完成创建一个封装了NFC标签和它的身份信息的Intent后,它将发送由过滤器过滤后的intent到对应的应用,如果一个intent有多个应用可以处理,用户根据Activity Chooser选择器选择启动的Activity,标签调度系统定义了三种intent类型,优先级由高到低。



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:

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

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 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.

api只包含有限的标签,需要通过ACTION_TAG_DISCOVERED调度,仅仅给了访问NDEF messages通过EXTRA_NDEF_MESSAGES 的extra,没有其他标签属性和I/O操作是可用的。api10包含了全部的读/写操作支持和前台NDEF推送 ,api14包含了更简单的方式推送NDEF信息到其他的设备通过Android Beam和额外创建NDEF records便利的方法。

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

The uses-feature element so that your application shows up in Google Play only for devices that have NFC hardware:

声明该属性后Google Play将显示你的应用必须支持NFC设备:

<uses-feature android:name="android.hardware.nfc" android:required="true" />
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.

如果你的应用中的NFC功能不是主要的功能,可以忽略uses-feature元素,然后在代码中通过getDefaultAdapter()是否为null动态检测NFC的可用性。


Filtering for NFC Intents

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.

因为NFC标签部署变化的和很多时候不在你的控制之下,这个部署并不总是可用的所以你可以在必要时回调其他两种标签,当你拥有了以上几种类型标签的写操作时,建议使用NDEF格式化你的标签,以下部分描述如何过滤每种类型的intent

ACTION_NDEF_DISCOVERED:

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:

过滤ACTION_NDEF_DISCOVERED的intent,使用你想要过滤的数据类型的intent filter,如下使用text/plain类型的MIME进行过滤的ACTION_NDEF_DISCOVERED的intent:

<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <data android:mimeType="text/plain" />
</intent-filter>
The following example filters for a URI in the form of http://developer.android.com/index.html
<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
    <category android:name="android.intent.category.DEFAULT"/>
   <data android:scheme="http"
              android:host="developer.android.com"
              android:pathPrefix="/index.html" />
</intent-filter>

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().

如果你的Activity过滤ACTION_TECH_DISCOVERED的intent,你必须创建一个XML资源文件,这个资源文件在一个tech-list集合中具体指定你的Activity支持的技术,你的Activity被认为是匹配的如果你的标签调用getTechList()返回的集合支持了tech-list集合中所列出的所有的技术。

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.

如下例子定义了所有的技术,你可以移除你不需要的那些,保存这个文件在/res/xml文件夹下

<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>
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:

也可以指定多个tech-list集合,每个tech-list都是独立的,你的Activity调用getTechList()返回的技术同任何单一一个tech-list set中的技术全部匹配时才被认为是匹配的两个文件是之间是OR关系,文件之内是AND关系。下面的例子匹配了支持NfcA and Ndef technologies的标签或者是NfcB and Ndef technologies技术的标签:

<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>
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:
<activity>
...
<intent-filter>
    <action android:name="android.nfc.action.TECH_DISCOVERED"/>
</intent-filter>

<meta-data android:name="android.nfc.action.TECH_DISCOVERED"
    android:resource="@xml/nfc_tech_filter" />
...
</activity>
For more information about working with tag technologies and the ACTION_TECH_DISCOVERED intent, see Working with Supported Tag Technologies in the Advanced NFC document.

ACTION_TAG_DISCOVERED:

To filter for ACTION_TAG_DISCOVERED use the following intent filter:

<intent-filter>
<action android:name="android.nfc.action.TAG_DISCOVERED"/>
</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:

如果由于一个NFC的Intent启动的Activity,你可以通过从被扫描到的intent获取信息,被扫描的intent可以包含如下extras

EXTRA_TAG (required): A Tag object representing the scanned tag.
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.

为了获取这些extras,检测你的Activity通过一个NFC intent被发起以确保一个标签被扫描到,然后从intent获取extras,如下例子检测ACTION_NDEF_DISCOVERED的intent然后从intent extra中获取NDEF messages。

public void onResume() {
    super.onResume();
    ...
    if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
        Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
        if (rawMsgs != null) {
            msgs = new NdefMessage[rawMsgs.length];
            for (int i = 0; i < rawMsgs.length; i++) {
                msgs[i] = (NdefMessage) rawMsgs[i];
            }
        }
    }
    //process the msgs array
}
Alternatively, you can obtain a Tag object from the intent, which will contain the payload and allow you to enumerate the tag's technologies:

另外,你可以获取一个标签对象,并从标签对象上可以获取payload并且允许你枚举出所有的tag's technologies

Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

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. Starting with Android 4.0 (API level 14), the createUri() method is available to help you create URI records automatically. Starting in Android 4.1 (API level 16), createExternal() and createMime() are available to help you create MIME and external type NDEF records. Use these helper methods whenever possible to avoid mistakes when manually creating NDEF records.
这部分描述了创建公共的NDEFrecords当你需要写标签或发送数据到给一个Android Beam,从Android 4.0 (API level 14)起createUri()是可用的帮助你自动创建URI records,从Android 4.1 (API level 16)起createExternal() and createMime()是可用的帮助你创建MIME and external type NDEF records,使用帮助方法尽可能来避免因为手动创建NDEFrecords时出现错误

This section also describes how to create the corresponding 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.

这部分描述了如何创建对应intent filter对应的record,所有这些NDEF record 例子都应该在你写标签或者beaming的NDEF message的第一个NDEF record

TNF_ABSOLUTE_URI:

Note: We recommend that you use the RTD_URI type instead of TNF_ABSOLUTE_URI, because it is more efficient.

建议使用RTD_URI替代TNF_ABSOLUTE_URI

You can create a TNF_ABSOLUTE_URI NDEF record in the following way:

NdefRecord uriRecord = new NdefRecord(
    NdefRecord.TNF_ABSOLUTE_URI ,
    "http://developer.android.com/index.html".getBytes(Charset.forName("US-ASCII")),
    new byte[0], new byte[0]);
The intent filter for the previous NDEF record would look like this:
<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:scheme="http"
        android:host="developer.android.com"
        android:pathPrefix="/index.html" />
</intent-filter>

TNF_MIME_MEDIA:

You can create a TNF_MIME_MEDIA NDEF record in the following ways.

Using the createMime() method:

NdefRecord mimeRecord = NdefRecord.createMime("application/vnd.com.example.android.beam",
    "Beam me up, Android".getBytes(Charset.forName("US-ASCII")));
Creating the NdefRecord manually:
NdefRecord mimeRecord = new NdefRecord(
    NdefRecord.TNF_MIME_MEDIA ,
    "application/vnd.com.example.android.beam".getBytes(Charset.forName("US-ASCII")),
    new byte[0], "Beam me up, Android!".getBytes(Charset.forName("US-ASCII")));
The intent filter for the previous NDEF records would look like this:
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="application/vnd.com.example.android.beam" />
</intent-filter>

TNF_WELL_KNOWN with RTD_TEXT:

You can create a TNF_WELL_KNOWN NDEF record in the following way:

public NdefRecord createTextRecord(String payload, Locale locale, boolean encodeInUtf8) {
    byte[] langBytes = locale.getLanguage().getBytes(Charset.forName("US-ASCII"));
    Charset utfEncoding = encodeInUtf8 ? Charset.forName("UTF-8") : Charset.forName("UTF-16");
    byte[] textBytes = payload.getBytes(utfEncoding);
    int utfBit = encodeInUtf8 ? 0 : (1 << 7);
    char status = (char) (utfBit + langBytes.length);
    byte[] data = new byte[1 + langBytes.length + textBytes.length];
    data[0] = (byte) status;
    System.arraycopy(langBytes, 0, data, 1, langBytes.length);
    System.arraycopy(textBytes, 0, data, 1 + langBytes.length, textBytes.length);
    NdefRecord record = new NdefRecord(NdefRecord.TNF_WELL_KNOWN,
    NdefRecord.RTD_TEXT, new byte[0], data);
    return record;
}
the intent filter would look like this:
<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="text/plain" />
</intent-filter>

TNF_WELL_KNOWN with RTD_URI:

You can create a TNF_WELL_KNOWN NDEF record in the following ways.

Using the createUri(String) method:

NdefRecord rtdUriRecord1 = NdefRecord.createUri("http://example.com");
Using the createUri(Uri) method:
Uri uri = new Uri("http://example.com");
NdefRecord rtdUriRecord2 = NdefRecord.createUri(uri);
Creating the NdefRecord manually:
byte[] uriField = "example.com".getBytes(Charset.forName("US-ASCII"));
byte[] payload = new byte[uriField.length + 1];              //add 1 for the URI Prefix
byte payload[0] = 0x01;                                      //prefixes http://www. to the URI
System.arraycopy(uriField, 0, payload, 1, uriField.length);  //appends URI to payload
NdefRecord rtdUriRecord = new NdefRecord(
    NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_URI, new byte[0], payload);
The intent filter for the previous NDEF records would look like this:
<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:scheme="http"
        android:host="example.com"
        android:pathPrefix="" />
</intent-filter>

TNF_EXTERNAL_TYPE:

You can create a TNF_EXTERNAL_TYPE NDEF record in the following ways:

Using the createExternal() method:

byte[] payload; //assign to your data
String domain = "com.example"; //usually your app's package name
String type = "externalType";
NdefRecord extRecord = NdefRecord.createExternal(domain, type, payload);
Creating the NdefRecord manually:
byte[] payload;
...
NdefRecord extRecord = new NdefRecord(
    NdefRecord.TNF_EXTERNAL_TYPE, "com.example:externalType", new byte[0], payload);
The intent filter for the previous NDEF records would look like this:
<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:scheme="vnd.android.nfc"
        android:host="ext"
        android:pathPrefix="/com.example:externalType"/>
</intent-filter>
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:example.com: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 (example.com in the example) and type (externalType in the example) separated by a colon. When dispatching TNF_EXTERNAL_TYPE, Android converts the urn:nfc:ext:example.com:externalType URN to a vnd.android.nfc://ext/example.com:externalType URI, which is what the intent filter in the example declares.


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, Google Play is launched to download the application.

Android 4.0 (API level 14)引进的,一个Android Application Record (AAR)提供了更强的功能,当你的NFC标签被扫描会启动你的应用,一个AAR由一个应用的包名被嵌入在NDEF record。你能增加一个AAR到NDEF里任何一个NDEF record因为Android搜索全部NDEF message中的AAR,如果找到了AAR,它就启动AAR中包名对应的应用,如果应用不存在你的设备中,Google Play会被发起来下载对应的应用。

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 intent filtering. If you want to handle an intent at the Activity level, use intent filters.

AAR是有用的对于你想防止其他应用过滤相同的intent,和其他应用处理你部署的具体的标签,因为AARs仅仅支持应用水平(由包名常量指定),不能被过滤由其他的应用通过intent filtering,如果你想处理一个intent在Activity水平,使用intent filters。

If a tag contains an AAR, the tag dispatch system dispatches in the following manner:

如果一个标签包含一个AAR,标签调度系统采用如下方式进行调度:

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.

试图使用intent filter启动一个Activity正常情况下,如果由intent匹配的Activity也匹配AAR,启动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.
如果filter过滤的intent对应的Activity不匹配AAR,如果多个Activity能处理intent,或者没有应用能处理intent,启动由AAR具体指定的应用

3.If no application can start with the AAR, go to Google Play to download the application based on the AAR.
如果没有AAR所指定的应用,将打开Google Play下载AAR指定的应用


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 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:

android提供了一个简单的api,createApplicationRecord()创建AAR,你需要嵌入AAR在任何NdefMessage,你应该使用NdefMessage中的第一个record,除非NdefMessage只有一个record,因为android系统检查NdefMessage第一个record决定标签的MIME类型或者URI,那用来创建一个intent为应用来过滤,下面代码教你如何创建一个AAR:

NdefMessage msg = new NdefMessage(
        new NdefRecord[] {
            ...,
            NdefRecord.createApplicationRecord("com.example.android.beam")}




分享到:
评论

相关推荐

    NFC Forum Type 2-Tag 原文+翻译

    NFC Forum Type 2-Tag的规范(NFCForum-TS-Type-2-Tag_1.1.pdf)是NFC Forum组织发布的官方文档,详细定义了Type 2-Tag的结构、命令集和交互方式。这个标准确保了不同厂商生产的Type 2-Tag具备互操作性。Type 2-Tag...

    Android开发者中文手册

    Android Studio是官方推荐的Android开发环境,它提供了丰富的功能来帮助开发者更高效地编写和调试代码。 总而言之,Android开发者中文手册是一份全面、实用的资源,无论对于初学者还是经验丰富的开发者,都有着较高...

    android andbook 英文版 中文版

    而对于有经验的开发者,书中的高级主题如碎片(Fragments)、自定义视图(Custom Views)、多媒体处理、蓝牙和NFC通信、以及Google Play服务的集成等,会是提升专业技能的重要资源。 而中文版的《Android Andbook》...

    android qemu

    Android QEMU,全称为Quick Emulator,是一种基于动态二进制翻译技术的开源虚拟化工具,主要用于模拟不同的处理器架构,特别是在开发和测试Android系统时,它扮演着至关重要的角色。QEMU可以使得开发者在非ARM架构的...

    android中文API

    以上只是Android API的冰山一角,实际的Android开发中还包括更多如蓝牙通信、NFC、多进程、JNI、Gradle构建系统等内容。Android中文API文档的翻译,使得开发者能够更快速地找到对应功能的中文解释,降低学习曲线,...

    eoeAndroid特刊第十四期:Android2.3特色讲解 pdf

    eoeAndroid特刊第十四期:Android2.3特色讲解 pdf,目录:姜饼Android2.3的新特性介绍、有关NFC技术,Android2.3的模拟器Emulator安装教程,以及一些android2.3的翻译资料和实例教程等。

    Android21_SourceNote:对于Android原始码的一些注释和翻译-android

    Android 21支持多种网络协议和连接方式,源码中包含了网络栈的实现,如TCP/IP协议、Wi-Fi Direct、NFC等,这些都是通过Android的ConnectivityManager服务进行管理的。 9. **多媒体支持**: Android 21的多媒体...

    openhab-android:适用于Android的openHAB客户端

    适用于Android的openHAB客户端介绍此应用是openHAB的本地客户端,可轻松访问您的站点地图。 该文档可从。产品特点控制您的openHAB服务器和/或,例如,具有的帐户通过openHAB Cloud连接接收通知, 通过NFC标签更改...

    驱动综合能力面试-V1.21

    这份测试涵盖了多种Android设备中的关键驱动模块,包括触摸屏(TP)、摄像头、加速度计(G-sensor)、GPIO、Wi-Fi、蓝牙(BT)、HDMI、LCD、红外遥控(IR-Remote)、输入设备、音频编解码芯片、闪光灯、电源管理集成...

    Device_Info_HW_v4.25.4.apk

    现在支持检测LCD,触摸屏,相机,传感器,内存,闪存,音频,NFC,充电器,W-FI和电池;如果可能的话,则适用于您的设备。 我认为应用程序对于构建内核或android的用户和开发人员而言非常有趣和有用。 应用...

    三星P729官方原版用户手册

    ### 三星P729官方原版用户手册关键知识点总结 #### 一、关于本说明书 - **设备特点**:三星P729是一款采用了三星先进技术的设备,旨在为用户提供高质量的移动通信与娱乐体验。 - **使用前须知**:用户在使用设备...

    4_中文-1-1.doc

    第二部分的阅读和翻译涉及更深入的Linux和开源软件的话题,这部分内容主要介绍了Linux的发展历程,托瓦兹的贡献,以及他如何通过Linux基金会和开源代码开发实验室推动开源事业。Linux的普及和成功,不仅改变了软件...

    Huawei华为畅享 20Plus 5G 说明书-(FRL-AN00a&TN00,EMUI10.1.1_01).pdf

    3. **手机克隆**:该功能允许用户方便地从旧手机迁移到新手机,支持Android和iOS设备。通过手机克隆应用,用户可以选择要迁移的数据,如联系人、日历、图片和视频,实现无缝过渡。 **智慧功能** 1. **智慧语音**:...

Global site tag (gtag.js) - Google Analytics