【问题标题】:Method NdefRecord.createTextRecord("en" , "string") not working below API level 21方法 NdefRecord.createTextRecord("en" , "string") 在 API 级别 21 下不起作用
【发布时间】:2016-06-17 07:14:41
【问题描述】:

当我在装有 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 级别)上创建文本记录?

【问题讨论】:

    标签: android nfc backwards-compatibility ndef


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      是的,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 的设备写入纯文本
      • API级别10可以写消息,但是21级别以下不能写新记录,不一样。 developer.android.com/reference/android/nfc/tech/…
      • API 低于 21 并不意味着你不能写记录,而是意味着 NdefRecord.createTextRecord 不可用。您仍然可以按照其他答案所述以其他方式创建它。
      猜你喜欢
      • 2013-09-06
      • 1970-01-01
      • 2017-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多