ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

android – 方法NdefRecord.createTextRecord(“en”,“string”)在API级别21下无法运行

2019-09-26 11:35:38  阅读:277  来源: 互联网

标签:ndef android nfc backwards-compatibility


当我在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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有