Most visited

Recently visited

Added in API level 9

NdefRecord

public final class NdefRecord
extends Object implements Parcelable

java.lang.Object
   ↳ android.nfc.NdefRecord


代表不可变的NDEF记录。

NDEF(NFC数据交换格式)是一种轻量级二进制格式,用于封装类型化数据。 它由NFC论坛规定,用于与NFC进行传输和存储,但是它与传输无关。

NDEF定义消息和记录。 NDEF记录包含类型化数据,例如MIME类型媒体,URI或自定义应用程序有效内容。 NDEF消息是一个或多个NDEF记录的容器。

此类表示逻辑(完整)NDEF记录,不能用于表示分块(部分)NDEF记录。 但是, NdefMessage(byte[])可用于解析包含分块记录的消息,并将返回一个带未分块(完整)记录的消息。

逻辑NDEF记录始终包含一个3位的TNF(类型名称字段),为记录的其余部分提供高级键入。 其余的字段是可变长度的,并不总是存在的:

包括 createMime(String, byte[])createExternal(String, String, byte[])等帮助 createUri(Uri) ,用于创建具有正确设置的tnf,类型,id和有效负载字段的格式良好的NDEF记录,请尽可能使用这些助手。

如果您知道自己在做什么以及要单独设置字段,请使用构造函数NdefRecord(short, byte[], byte[], byte[]) 只有使用此构造函数才能执行基本验证,因此可以创建不符合严格NFC论坛规范的记录。

NDEF记录的二进制表示包括附加标志以指示NDEF消息的位置,为NDEF记录的分块提供支持,并打包可选字段。 这个类不公开这些细节。 要将NDEF记录写成二进制文件,必须先将它放入NdefMessage ,然后调用toByteArray()

即使在没有NFC硬件的Android设备上, NdefMessageNdefRecord实现始终可用。

NdefRecord旨在是不可变的(并且是线程安全的),但它们可能包含可变字段。 因此,注意不要修改传入构造函数的可变字段,也不要修改getter方法获得的可变字段,除非这些修改明确标记为安全。

也可以看看:

Summary

Constants

short TNF_ABSOLUTE_URI

表示类型字段包含由RFC 3986定义的绝对URI BNF构造。

short TNF_EMPTY

表示记录为空。

short TNF_EXTERNAL_TYPE

指示类型字段包含外部类型名称。

short TNF_MIME_MEDIA

表示类型字段包含由RFC 2046定义的媒体类型的BNF构造。

short TNF_UNCHANGED

指示有效载荷是分块NDEF记录的中间或最终块。

short TNF_UNKNOWN

指示有效负载类型未知。

short TNF_WELL_KNOWN

指示类型字段包含一个众所周知的RTD类型名称。

Inherited constants

From interface android.os.Parcelable

Fields

public static final Creator<NdefRecord> CREATOR

public static final byte[] RTD_ALTERNATIVE_CARRIER

RTD替代载波类型。

public static final byte[] RTD_HANDOVER_CARRIER

RTD切换载波类型。

public static final byte[] RTD_HANDOVER_REQUEST

RTD切换请求类型。

public static final byte[] RTD_HANDOVER_SELECT

RTD切换选择类型。

public static final byte[] RTD_SMART_POSTER

RTD智能海报类型。

public static final byte[] RTD_TEXT

RTD文本类型。

public static final byte[] RTD_URI

RTD URI类型。

Public constructors

NdefRecord(short tnf, byte[] type, byte[] id, byte[] payload)

从其组件字段构建NDEF记录。

NdefRecord(byte[] data)

此构造函数在API级别16中已弃用。 NdefMessage(byte[])改为使用NdefMessage(byte[])

Public methods

static NdefRecord createApplicationRecord(String packageName)

创建一个新的Android应用程序记录(AAR)。

static NdefRecord createExternal(String domain, String type, byte[] data)

创建一个包含外部(应用程序特定)数据的新NDEF记录。

static NdefRecord createMime(String mimeType, byte[] mimeData)

创建一个包含MIME数据的新NDEF记录。

static NdefRecord createTextRecord(String languageCode, String text)

创建一个包含UTF-8文本数据的新NDEF记录。

static NdefRecord createUri(Uri uri)

创建一个包含URI的新NDEF记录。

static NdefRecord createUri(String uriString)

创建一个包含URI的新NDEF记录。

int describeContents()

描述此Parcelable实例的封送表示中包含的特殊对象的种类。

boolean equals(Object obj)

如果指定的NDEF记录包含相同的tnf,类型,id和有效载荷字段,则返回true。

byte[] getId()

返回可变长度ID。

byte[] getPayload()

返回可变长度的有效载荷。

short getTnf()

返回3位TNF。

byte[] getType()

返回可变长度类型字段。

int hashCode()

返回对象的哈希码值。

byte[] toByteArray()

此方法在API级别16中已弃用。 toByteArray()改为使用toByteArray()

String toMimeType()

将此记录映射到MIME类型,如果无法映射,则返回null。

String toString()

返回对象的字符串表示形式。

Uri toUri()

将此记录映射到URI,如果无法映射,则返回null。

void writeToParcel(Parcel dest, int flags)

将此对象平铺到一个包裹中。

Inherited methods

From class java.lang.Object
From interface android.os.Parcelable

Constants

TNF_ABSOLUTE_URI

Added in API level 9
short TNF_ABSOLUTE_URI

表示类型字段包含由RFC 3986定义的绝对URI BNF构造。

创建新记录时,首选 createUri(Uri) ,因为它提供了更紧凑的URI编码(#RTD_URI允许压缩常用URI前缀)。

也可以看看:

常量值:3(0x00000003)

TNF_EMPTY

Added in API level 9
short TNF_EMPTY

表示记录为空。

TNF_EMPTY记录中的类型,标识和有效负载字段为空。

常量值:0(0x00000000)

TNF_EXTERNAL_TYPE

Added in API level 9
short TNF_EXTERNAL_TYPE

指示类型字段包含外部类型名称。

用于编码自定义有效载荷。 创建新记录时,请使用助手createExternal(String, String, byte[])

NFCForum-TS-RTD_1.0中规定了外部类型的RTD格式。

请注意,此TNF不应与RTD_TEXT或RTD_URI常数一起使用。 这些都是众所周知的RTD常量,而不是外部RTD常量。

也可以看看:

常量值:4(0x00000004)

TNF_MIME_MEDIA

Added in API level 9
short TNF_MIME_MEDIA

表示类型字段包含由RFC 2046定义的媒体类型的BNF构造。

将其与MIME类型名称(如“image / jpeg”)一起使用,或使用帮助程序 createMime(String, byte[])

也可以看看:

常量值:2(0x00000002)

TNF_UNCHANGED

Added in API level 9
short TNF_UNCHANGED

指示有效载荷是分块NDEF记录的中间或最终块。

TNF_UNCHANGED不能用于这个类,因为所有的 NdefRecord都已经被取消了,但是它们可能以二进制格式出现。

常数值:6(0x00000006)

TNF_UNKNOWN

Added in API level 9
short TNF_UNKNOWN

指示有效负载类型未知。

NFC论坛解释说这应该被视为与“application / octet-stream”MIME类型类似。 有效载荷类型在记录中没有显式编码。

TNF_UNKNOWN记录中的类型字段为空。

常量值:5(0x00000005)

TNF_WELL_KNOWN

Added in API level 9
short TNF_WELL_KNOWN

指示类型字段包含一个众所周知的RTD类型名称。

使用 RTD_TEXT类型(如 RTD_TEXT )的 RTD_URI

RTD类型名称格式在NFCForum-TS-RTD_1.0中指定。

也可以看看:

常数值:1(0x00000001)

Fields

CREATOR

Added in API level 9
Creator<NdefRecord> CREATOR

RTD_ALTERNATIVE_CARRIER

Added in API level 9
byte[] RTD_ALTERNATIVE_CARRIER

RTD替代载波类型。 用于TNF_WELL_KNOWN。

也可以看看:

RTD_HANDOVER_CARRIER

Added in API level 9
byte[] RTD_HANDOVER_CARRIER

RTD切换载波类型。 用于TNF_WELL_KNOWN。

也可以看看:

RTD_HANDOVER_REQUEST

Added in API level 9
byte[] RTD_HANDOVER_REQUEST

RTD切换请求类型。 用于TNF_WELL_KNOWN。

也可以看看:

RTD_HANDOVER_SELECT

Added in API level 9
byte[] RTD_HANDOVER_SELECT

RTD切换选择类型。 用于TNF_WELL_KNOWN。

也可以看看:

RTD_SMART_POSTER

Added in API level 9
byte[] RTD_SMART_POSTER

RTD智能海报类型。 用于TNF_WELL_KNOWN。

也可以看看:

RTD_TEXT

Added in API level 9
byte[] RTD_TEXT

RTD文本类型。 用于TNF_WELL_KNOWN。

也可以看看:

RTD_URI

Added in API level 9
byte[] RTD_URI

RTD URI类型。 用于TNF_WELL_KNOWN。

也可以看看:

Public constructors

NdefRecord

Added in API level 9
NdefRecord (short tnf, 
                byte[] type, 
                byte[] id, 
                byte[] payload)

从其组件字段构建NDEF记录。

推荐使用佣工如{#createUri}或{ createExternal(String, String, byte[])如果可能的话,因为他们执行严格的验证该记录是否正确格式化为每NDEF规范。 但是如果你知道你在做什么,那么这个构造函数提供了最大的灵活性。

NdefRecord表示逻辑(完整)记录,并且不能表示NDEF记录块。

根据以下规则执行tnf,类型,标识和有效负载的基本验证:

  • The tnf paramter must be a 3-bit value.
  • Records with a tnf of TNF_EMPTY cannot have a type, id or payload.
  • Records with a tnf of TNF_UNKNOWN or 0x07 cannot have a type.
  • Records with a tnf of TNF_UNCHANGED are not allowed since this class only represents complete (unchunked) records.
This minimal validation is specified by NFCForum-TS-NDEF_1.0 section 3.2.6 (Type Name Format).

如果任何上述验证步骤失败,则引发 IllegalArgumentException

对类型,id和有效载荷字段不进行深入检查,因此可以创建符合3.2.6节的NDEF记录,但不能满足其他更严格的NDEF规范要求。 例如,考虑到tnf和类型,有效载荷可能无效。

要省略类型,id或有效负载字段,请将参数设置为空字节数组或null。

Parameters
tnf short: a 3-bit TNF constant
type byte: byte array, containing zero to 255 bytes, or null
id byte: byte array, containing zero to 255 bytes, or null
payload byte: byte array, containing zero to (2 ** 32 - 1) bytes, or null
Throws
if a valid record cannot be created

NdefRecord

Added in API level 9
NdefRecord (byte[] data)

此构造函数在API级别16中已被弃用。
改为使用NdefMessage(byte[])

从原始字节构建一个NDEF记录。

此方法已弃用, NdefMessage(byte[])改为使用NdefMessage(byte[]) 这是因为解析记录没有意义:NDEF二进制格式仅针对消息定义,并且记录标记MB和ME在整个消息的上下文之外没有意义。

此实现将尝试通过忽略MB和ME标志来解析单个记录,否则将遵循 NdefMessage(byte[])的规则。

Parameters
data byte: raw bytes to parse
Throws
FormatException if the data cannot be parsed into a valid record

Public methods

createApplicationRecord

Added in API level 14
NdefRecord createApplicationRecord (String packageName)

创建一个新的Android应用程序记录(AAR)。

该记录向其他Android设备指示应该用于处理整个NDEF消息的包。 您可以将此记录嵌入到消息的任何位置,以确保预期的包接收消息。

当Android设备调度包含一个或多个Android应用程序记录的NdefMessage ,这些记录中包含的应用程序将ACTION_NDEF_DISCOVERED出现在消息中的顺序成为ACTION_NDEF_DISCOVERED意图的首选目标。 这种调度行为首次添加到Android冰淇淋三明治中。

如果没有应用程序安装在设备上,市场链接将打开到第一个应用程序。

请注意,Android应用程序记录不会推翻名为 enableForegroundDispatch(Activity, PendingIntent, IntentFilter[], String[][])应用程序。

Parameters
packageName String: Android package name
Returns
NdefRecord Android application NDEF record

createExternal

Added in API level 16
NdefRecord createExternal (String domain, 
                String type, 
                byte[] data)

创建一个包含外部(应用程序特定)数据的新NDEF记录。

使用此方法将应用程序特定数据编码到NDEF记录中。 数据由域名(通常是您的Android软件包名称)和域特定类型来键入。 这些数据被打包成一个“NFC论坛外部类型”NDEF记录。

NFC论坛要求将外部记录中使用的域和类型视为不区分大小写,但Android意图过滤始终区分大小写。 因此,在创建NDEF记录之前,此方法将强制域和类型为小写。

如果域和类型存在严重问题(例如,如果任何一个字段为空),则会引发未经检查的异常 IllegalArgumentException ,因此如果将用户生成的数据传递到此方法中,则总是会捕获此异常。

有效载荷数据没有这样的限制。

为了提高效率,此方法可能不会创建数据字节数组的内部副本,因此请注意不要在仍使用返回的NdefRecord时修改数据字节数组。 参考规格:NFCForum-TS-RTD_1.0

Parameters
domain String: domain-name of issuing organization
type String: domain-specific type of data
data byte: payload as bytes
Returns
NdefRecord
Throws
if either domain or type are empty or invalid

createMime

Added in API level 16
NdefRecord createMime (String mimeType, 
                byte[] mimeData)

创建一个包含MIME数据的新NDEF记录。

使用此方法将MIME类型的数据编码到NDEF记录中,例如“text / plain”或“image / jpeg”。

mimeType参数将被标准化为normalizeMimeType(String)以遵循Android最佳惯例进行意图过滤,例如强制小写。 但是,如果mimeType参数存在严重问题(例如,如果它为空),则可能会抛出未经检查的异常IllegalArgumentException ,因此如果您将用户生成的数据传递到此方法中,请始终捕获此异常。

为了提高效率,此方法可能不会生成mimeData字节数组的内部副本,因此请注意不要在仍使用返回的NdefRecord的同时修改mimeData字节数组。

Parameters
mimeType String: a valid MIME type
mimeData byte: MIME data as bytes
Returns
NdefRecord an NDEF Record containing the MIME-typed data
Throws
if the mimeType is empty or invalid

createTextRecord

Added in API level 21
NdefRecord createTextRecord (String languageCode, 
                String text)

创建一个包含UTF-8文本数据的新NDEF记录。

调用者可以为提供的文本指定语言代码,否则将使用与当前默认语言环境对应的语言代码。 参考规格:NFCForum-TS-RTD_Text_1.0

Parameters
languageCode String: The languageCode for the record. If locale is empty or null, the language code of the current default locale will be used.
text String: The text to be encoded in the record. Will be represented in UTF-8 format.
Returns
NdefRecord
Throws
IllegalArgumentException if text is null

createUri

Added in API level 14
NdefRecord createUri (Uri uri)

创建一个包含URI的新NDEF记录。

使用此方法将URI(或URL)编码到NDEF记录中。

使用众所周知的URI类型表示: TNF_WELL_KNOWNRTD_URI 这是将NDEF中的URI最有效的编码。

uri参数将使用normalizeScheme()进行标准化,以便将方案设置为小写,以遵循Android最佳惯例进行意图过滤。 但是,如果uri参数存在严重问题(例如,如果它为空),则可能会抛出未经检查的异常IllegalArgumentException ,因此如果将用户生成的数据传递到此方法中,则总是会捕获此异常。

参考规范:NFCForum-TS-RTD_URI_1.0

Parameters
uri Uri: URI to encode.
Returns
NdefRecord an NDEF Record containing the URI
Throws
if the uri is empty or invalid

createUri

Added in API level 14
NdefRecord createUri (String uriString)

创建一个包含URI的新NDEF记录。

使用此方法将URI(或URL)编码到NDEF记录中。

使用众所周知的URI类型表示: TNF_WELL_KNOWNRTD_URI 这是将NDEF中的URI最有效的编码。

uriString参数将使用normalizeScheme()进行标准化,以将方案设置为小写,以遵循Android最佳惯例进行意图过滤。 但是,如果uriString参数存在严重问题(例如,如果它为空),则可能会抛出未经检查的异常IllegalArgumentException ,因此如果将用户生成的数据传递到此方法中,则总是会捕获此异常。

参考规范:NFCForum-TS-RTD_URI_1.0

Parameters
uriString String: string URI to encode.
Returns
NdefRecord an NDEF Record containing the URI
Throws
if the uriString is empty or invalid

describeContents

Added in API level 9
int describeContents ()

描述此Parcelable实例的封送表示中包含的特殊对象的种类。 例如,如果对象将在writeToParcel(Parcel, int)的输出中包含writeToParcel(Parcel, int) ,则此方法的返回值必须包含CONTENTS_FILE_DESCRIPTOR位。

Returns
int a bitmask indicating the set of special object types marshaled by this Parcelable object instance.

equals

Added in API level 9
boolean equals (Object obj)

如果指定的NDEF记录包含相同的tnf,类型,id和有效载荷字段,则返回true。

Parameters
obj Object: the reference object with which to compare.
Returns
boolean true if this object is the same as the obj argument; false otherwise.

getId

Added in API level 9
byte[] getId ()

返回可变长度ID。

如果此记录没有id字段,则返回空字节数组。

Returns
byte[]

getPayload

Added in API level 9
byte[] getPayload ()

返回可变长度的有效载荷。

如果此记录没有有效内容字段,则返回空字节数组。

Returns
byte[]

getTnf

Added in API level 9
short getTnf ()

返回3位TNF。

TNF是最高级的类型。

Returns
short

getType

Added in API level 9
byte[] getType ()

返回可变长度类型字段。

这应与TNF字段一起使用以确定有效载荷格式。

如果此记录没有类型字段,则返回空字节数组。

Returns
byte[]

hashCode

Added in API level 9
int hashCode ()

返回对象的哈希码值。 为了散列表的好处而支持此方法,例如由HashMap提供的HashMap

hashCode的总合同是:

  • Whenever it is invoked on the same object more than once during an execution of a Java application, the hashCode method must consistently return the same integer, provided no information used in equals comparisons on the object is modified. This integer need not remain consistent from one execution of an application to another execution of the same application.
  • If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.
  • It is not required that if two objects are unequal according to the equals(java.lang.Object) method, then calling the hashCode method on each of the two objects must produce distinct integer results. However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hash tables.

尽可能合理实用,由类Object定义的hashCode方法确实为不同的对象返回不同的整数。 (这通常通过将对象的内部地址转换为整数来实现,但Java TM编程语言不需要此实现技术。)

Returns
int a hash code value for this object.

toByteArray

Added in API level 9
byte[] toByteArray ()

此方法在API级别16中已被弃用。
改为使用toByteArray()

将此NDEF记录作为字节数组返回。

此方法已弃用,请改用toByteArray() 这是因为NDEF二进制格式没有为消息上下文之外的记录定义:如果不知道消息内部的位置,则无法设置MB和ME标志。

该实现将尝试通过始终设置MB和ME标志来序列化单个记录(换句话说,假设这是单记录NDEF消息)。

Returns
byte[]

toMimeType

Added in API level 16
String toMimeType ()

将此记录映射到MIME类型,如果无法映射,则返回null。

目前此方法将所有TNF_MIME_MEDIA记录视为MIME记录,以及一些TNF_WELL_KNOWN记录(如RTD_TEXT 如果这是一个MIME记录,则返回MIME类型作为字符串,否则返回null。

此方法不执行验证MIME类型实际上是有效的。 它总是试图返回一个包含该类型的字符串,如果这是一个MIME记录。

使用 normalizeMimeType(String)将返回的MIME类型标准化为小写。

MIME有效载荷可以使用 getPayload()获得。

Returns
String MIME type as a string, or null if this is not a MIME record

toString

Added in API level 9
String toString ()

返回对象的字符串表示形式。 通常, toString方法返回一个“文本表示”该对象的字符串。 结果应该是一个简洁但内容丰富的表述,对于一个人来说很容易阅读。 建议所有子类重写此方法。

ObjecttoString方法返回一个字符串,其中包含对象为实例的类的名称,符号字符“ @ ”以及对象的哈希代码的无符号十六进制表示形式。 换句话说,这个方法返回一个字符串,其值等于:

 getClass().getName() + '@' + Integer.toHexString(hashCode())
 

Returns
String a string representation of the object.

toUri

Added in API level 16
Uri toUri ()

将此记录映射到URI,如果无法映射,则返回null。

目前这种方法认为以下是URI记录:

If this is not a URI record by the above rules, then null is returned.

此方法不会执行验证,即URI实际上是有效的:它总是尝试创建并返回URI,如果此记录按上述规则显示为URI记录。

返回的URI将被标准化为使用 normalizeScheme()的小写方案。

Returns
Uri URI, or null if this is not a URI record

writeToParcel

Added in API level 9
void writeToParcel (Parcel dest, 
                int flags)

将此对象平铺到一个包裹中。

Parameters
dest Parcel: The Parcel in which the object should be written.
flags int: Additional flags about how the object should be written. May be 0 or PARCELABLE_WRITE_RETURN_VALUE.

Hooray!