方法 NdefRecord.createTextRecord("en" , "string") 在 API 级别 21 以下不起作用
Method NdefRecord.createTextRecord("en" , "string") not working below API level 21
当我在带有 Android Lollipop (5.x) 或 Marshmallow (6.0) 的设备上使用此代码时,它工作正常:
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public NdefMessage createNdfMessage(String content) {
NdefRecord record = NdefRecord.createTextRecord("en", content);
NdefMessage msg = new NdefMessage(new NdefRecord[]{record});
return msg;
}
但是当我在 Android 4.2.2(API 级别 17)的设备上尝试此操作时,我的应用程序崩溃了。我如何使用此代码在 21 级以下的 API 级别(即方法 NdefRecord.createTextRecord
可用的 API 级别)创建文本记录?
是的,createTextRecord是在API21引入的,所以之前的版本不能调用。
https://developer.android.com/reference/android/nfc/NdefRecord.html
在调用 createTextRecord 之前检查您的 API 等级是否为 21。
public NdfeMessage create(String content){
int currentapiVersion = android.os.Build.VERSION.SDK_INT;
if (currentapiVersion >= android.os.Build.VERSION_CODES.LOLLIPOP){
NdefRecord record = NdefRecord.createTextRecord("en", content);
NdefMessage msg = new NdefMessage(new NdefRecord[]{record});
return msg;
} else{
return null;
}
}
NdefRecord.createTextRecord()
方法是在 API 级别 21 中引入的。因此,它在 API 级别以下的平台上不可用。但是,您可以轻松 assemble 自己的文本记录。文本记录的有效载荷由状态字节、语言代码字段和文本字段组成:
+-------------+---------------+--------------------------+
| Status byte | Language code | Text |
| (1 byte) | (n byte) | (m byte) |
+-------------+---------------+--------------------------+
- 状态字节在第7位表示文本域的字符编码(
0
=UTF-8,1
=UTF-16),长度n
位 5..0 中的语言代码。位 6 必须始终为零。
- 语言代码字段包含以 US-ASCII 编码的 IANA 语言代码(例如 "en")。
您可以使用此方法创建文本记录:
public static NdefRecord createTextRecord(String language, String text) {
byte[] languageBytes;
byte[] textBytes;
try {
languageBytes = language.getBytes("US-ASCII");
textBytes = text.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
throw new AssertionError(e);
}
byte[] recordPayload = new byte[1 + (languageBytes.length & 0x03F) + textBytes.length];
recordPayload[0] = (byte)(languageBytes.length & 0x03F);
System.arraycopy(languageBytes, 0, recordPayload, 1, languageBytes.length & 0x03F);
System.arraycopy(textBytes, 0, recordPayload, 1 + (languageBytes.length & 0x03F), textBytes.length);
return new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, null, recordPayload);
}
NdefRecord r = createTextRecord("en", content);
当我在带有 Android Lollipop (5.x) 或 Marshmallow (6.0) 的设备上使用此代码时,它工作正常:
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public NdefMessage createNdfMessage(String content) {
NdefRecord record = NdefRecord.createTextRecord("en", content);
NdefMessage msg = new NdefMessage(new NdefRecord[]{record});
return msg;
}
但是当我在 Android 4.2.2(API 级别 17)的设备上尝试此操作时,我的应用程序崩溃了。我如何使用此代码在 21 级以下的 API 级别(即方法 NdefRecord.createTextRecord
可用的 API 级别)创建文本记录?
是的,createTextRecord是在API21引入的,所以之前的版本不能调用。 https://developer.android.com/reference/android/nfc/NdefRecord.html
在调用 createTextRecord 之前检查您的 API 等级是否为 21。
public NdfeMessage create(String content){
int currentapiVersion = android.os.Build.VERSION.SDK_INT;
if (currentapiVersion >= android.os.Build.VERSION_CODES.LOLLIPOP){
NdefRecord record = NdefRecord.createTextRecord("en", content);
NdefMessage msg = new NdefMessage(new NdefRecord[]{record});
return msg;
} else{
return null;
}
}
NdefRecord.createTextRecord()
方法是在 API 级别 21 中引入的。因此,它在 API 级别以下的平台上不可用。但是,您可以轻松 assemble 自己的文本记录。文本记录的有效载荷由状态字节、语言代码字段和文本字段组成:
+-------------+---------------+--------------------------+ | Status byte | Language code | Text | | (1 byte) | (n byte) | (m byte) | +-------------+---------------+--------------------------+
- 状态字节在第7位表示文本域的字符编码(
0
=UTF-8,1
=UTF-16),长度n
位 5..0 中的语言代码。位 6 必须始终为零。 - 语言代码字段包含以 US-ASCII 编码的 IANA 语言代码(例如 "en")。
您可以使用此方法创建文本记录:
public static NdefRecord createTextRecord(String language, String text) {
byte[] languageBytes;
byte[] textBytes;
try {
languageBytes = language.getBytes("US-ASCII");
textBytes = text.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
throw new AssertionError(e);
}
byte[] recordPayload = new byte[1 + (languageBytes.length & 0x03F) + textBytes.length];
recordPayload[0] = (byte)(languageBytes.length & 0x03F);
System.arraycopy(languageBytes, 0, recordPayload, 1, languageBytes.length & 0x03F);
System.arraycopy(textBytes, 0, recordPayload, 1 + (languageBytes.length & 0x03F), textBytes.length);
return new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, null, recordPayload);
}
NdefRecord r = createTextRecord("en", content);