android – 方法NdefRecord.createTextRecord(“en”,“string”)在API级别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级别)?
解决方法:
NdefRecord.createTextRecord()方法是在API级别21中引入的.因此,它在API级别以下的平台上不可用.但是,您可以轻松地自己组装文本记录.文本记录的有效负载由状态字节,语言代码字段和文本字段组成:
+-------------+---------------+--------------------------+ | Status byte | Language code | Text | | (1 byte) | (n byte) | (m byte) | +-------------+---------------+--------------------------+
>状态字节表示位7中文本字段(0 = UTF-8,1 = UTF-16)的字符编码,以及位5..0中语言代码的长度n.位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);
标签:ndef,android,nfc,backwards-compatibility 来源: https://codeday.me/bug/20190926/1820052.html