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设备上, NdefMessage
和 NdefRecord
实现始终可用。
NdefRecord
旨在是不可变的(并且是线程安全的),但它们可能包含可变字段。 因此,注意不要修改传入构造函数的可变字段,也不要修改getter方法获得的可变字段,除非这些修改明确标记为安全。
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中已弃用。 |
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中已弃用。 |
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
|
short TNF_ABSOLUTE_URI
表示类型字段包含由RFC 3986定义的绝对URI BNF构造。
创建新记录时,首选 createUri(Uri)
,因为它提供了更紧凑的URI编码(#RTD_URI允许压缩常用URI前缀)。
也可以看看:
常量值:3(0x00000003)
short TNF_EMPTY
表示记录为空。
TNF_EMPTY记录中的类型,标识和有效负载字段为空。
常量值:0(0x00000000)
short TNF_EXTERNAL_TYPE
指示类型字段包含外部类型名称。
用于编码自定义有效载荷。 创建新记录时,请使用助手createExternal(String, String, byte[])
。
NFCForum-TS-RTD_1.0中规定了外部类型的RTD格式。
请注意,此TNF不应与RTD_TEXT或RTD_URI常数一起使用。 这些都是众所周知的RTD常量,而不是外部RTD常量。
常量值:4(0x00000004)
short TNF_MIME_MEDIA
表示类型字段包含由RFC 2046定义的媒体类型的BNF构造。
将其与MIME类型名称(如“image / jpeg”)一起使用,或使用帮助程序 createMime(String, byte[])
。
也可以看看:
常量值:2(0x00000002)
short TNF_UNCHANGED
指示有效载荷是分块NDEF记录的中间或最终块。
TNF_UNCHANGED不能用于这个类,因为所有的 NdefRecord
都已经被取消了,但是它们可能以二进制格式出现。
常数值:6(0x00000006)
short TNF_UNKNOWN
指示有效负载类型未知。
NFC论坛解释说这应该被视为与“application / octet-stream”MIME类型类似。 有效载荷类型在记录中没有显式编码。
TNF_UNKNOWN记录中的类型字段为空。
常量值:5(0x00000005)
short TNF_WELL_KNOWN
指示类型字段包含一个众所周知的RTD类型名称。
使用 RTD_TEXT
类型(如 RTD_TEXT
)的 RTD_URI
。
RTD类型名称格式在NFCForum-TS-RTD_1.0中指定。
常数值:1(0x00000001)
byte[] RTD_ALTERNATIVE_CARRIER
RTD替代载波类型。 用于TNF_WELL_KNOWN。
也可以看看:
byte[] RTD_HANDOVER_CARRIER
RTD切换载波类型。 用于TNF_WELL_KNOWN。
也可以看看:
byte[] RTD_HANDOVER_REQUEST
RTD切换请求类型。 用于TNF_WELL_KNOWN。
也可以看看:
byte[] RTD_HANDOVER_SELECT
RTD切换选择类型。 用于TNF_WELL_KNOWN。
也可以看看:
NdefRecord (short tnf, byte[] type, byte[] id, byte[] payload)
从其组件字段构建NDEF记录。
推荐使用佣工如{#createUri}或{ createExternal(String, String, byte[])
如果可能的话,因为他们执行严格的验证该记录是否正确格式化为每NDEF规范。 但是如果你知道你在做什么,那么这个构造函数提供了最大的灵活性。
NdefRecord
表示逻辑(完整)记录,并且不能表示NDEF记录块。
根据以下规则执行tnf,类型,标识和有效负载的基本验证:
TNF_EMPTY
cannot have a type, id or payload.TNF_UNKNOWN
or 0x07 cannot have a type.TNF_UNCHANGED
are not allowed since this class only represents complete (unchunked) records.如果任何上述验证步骤失败,则引发 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 (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 |
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 |
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 |
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 |
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 |
NdefRecord createUri (Uri uri)
创建一个包含URI的新NDEF记录。
使用此方法将URI(或URL)编码到NDEF记录中。
使用众所周知的URI类型表示: TNF_WELL_KNOWN
和RTD_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 |
NdefRecord createUri (String uriString)
创建一个包含URI的新NDEF记录。
使用此方法将URI(或URL)编码到NDEF记录中。
使用众所周知的URI类型表示: TNF_WELL_KNOWN
和RTD_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 |
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. |
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. |
byte[] getPayload ()
返回可变长度的有效载荷。
如果此记录没有有效内容字段,则返回空字节数组。
Returns | |
---|---|
byte[] |
byte[] getType ()
返回可变长度类型字段。
这应与TNF字段一起使用以确定有效载荷格式。
如果此记录没有类型字段,则返回空字节数组。
Returns | |
---|---|
byte[] |
int hashCode ()
返回对象的哈希码值。 为了散列表的好处而支持此方法,例如由HashMap
提供的HashMap
。
hashCode
的总合同是:
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. equals(Object)
method, then calling the hashCode
method on each of the two objects must produce the same integer result. 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. |
byte[] toByteArray ()
此方法在API级别16中已被弃用。
改为使用toByteArray()
将此NDEF记录作为字节数组返回。
此方法已弃用,请改用toByteArray()
。 这是因为NDEF二进制格式没有为消息上下文之外的记录定义:如果不知道消息内部的位置,则无法设置MB和ME标志。
该实现将尝试通过始终设置MB和ME标志来序列化单个记录(换句话说,假设这是单记录NDEF消息)。
Returns | |
---|---|
byte[] |
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 |
String toString ()
返回对象的字符串表示形式。 通常, toString
方法返回一个“文本表示”该对象的字符串。 结果应该是一个简洁但内容丰富的表述,对于一个人来说很容易阅读。 建议所有子类重写此方法。
类Object
的toString
方法返回一个字符串,其中包含对象为实例的类的名称,符号字符“ @
”以及对象的哈希代码的无符号十六进制表示形式。 换句话说,这个方法返回一个字符串,其值等于:
getClass().getName() + '@' + Integer.toHexString(hashCode())
Returns | |
---|---|
String |
a string representation of the object. |
Uri toUri ()
将此记录映射到URI,如果无法映射,则返回null。
目前这种方法认为以下是URI记录:
TNF_ABSOLUTE_URI
records.TNF_WELL_KNOWN
with a type of RTD_URI
.TNF_WELL_KNOWN
with a type of RTD_SMART_POSTER
and containing a URI record in the NDEF message nested in the payload. TNF_EXTERNAL_TYPE
records.此方法不会执行验证,即URI实际上是有效的:它总是尝试创建并返回URI,如果此记录按上述规则显示为URI记录。
返回的URI将被标准化为使用 normalizeScheme()
的小写方案。
Returns | |
---|---|
Uri |
URI, or null if this is not a URI record |
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 . |