方法NdefRecord.createTextRecord(" en"," string")在API级别21以下不工作

时间:2016-06-17 07:14:41

标签: android nfc backwards-compatibility ndef

当我在使用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级别)?

2 个答案:

答案 0 :(得分:5)

方法NdefRecord.createTextRecord()是在API级别21中引入的。因此,它不适用于API级别以下的平台。但是,您可以轻松地自己组装文本记录。文本记录的有效负载由状态字节,语言代码字段和文本字段组成:

+-------------+---------------+--------------------------+
| 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);

答案 1 :(得分: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;
    }
}