NdefRecord.createTextRecord("en", "string")在API 21以下版本不起作用。

3

当我在使用安卓棒棒糖(5.x)或棉花糖(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;
}

但是当我在一个安卓4.2.2(API级别17)的设备上尝试时,我的应用程序会崩溃。如何在低于21的API级别上使用此代码来创建文本记录(NdefRecord.createTextRecord方法可用的API级别)?

2个回答

7
方法NdefRecord.createTextRecord()引入了API 21。因此,在该API级别以下的平台上不可用。但是,您可以轻松地自己组装文本记录。文本记录的有效负载包括状态字节、语言代码字段和文本字段:
+-------------+---------------+--------------------------+
| 状态字节    | 语言代码      | 文本                     |
| (1 字节)    | (n 字节)      | (m 字节)                 |
+-------------+---------------+--------------------------+
  • 状态字节在第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);

0

是的,createTextRecord 是在 API 21 中引入的,因此您不能在之前的版本中调用它。 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;
    }
}

但我也想从API级别低于21的设备中编写纯文本。 - Syed Muhammad Arslan
你可以从API级别10编写消息,但是在级别21以下无法编写新记录,这不是同一件事情。https://developer.android.com/reference/android/nfc/tech/Ndef.html#writeNdefMessage(android.nfc.NdefMessage) - Erik Minarini
1
API 21以下并不意味着您不能编写记录,但它意味着NdefRecord.createTextRecord不可用。正如其他答案所述,您仍然可以通过其他方式创建它。 - Aritz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接