当前位置: 首页 > 知识库问答 >
问题:

如何将NDEF记录写入NFC标签?

蒋阳华
2023-03-14

如何将NDEF消息写入NFC标记?我必须更改清单文件吗?到目前为止,我有生成NDEF消息的代码:

    public NdefRecord createTextRecord(String payload, Locale locale, boolean encodeInUtf8) {
    byte[] langBytes = locale.getLanguage().getBytes(Charset.forName("US-ASCII"));
    Charset utfEncoding = encodeInUtf8 ? Charset.forName("UTF-8") : Charset.forName("UTF-16");
    byte[] textBytes = payload.getBytes(utfEncoding);
    int utfBit = encodeInUtf8 ? 0 : (1 << 7);
    char status = (char) (utfBit + langBytes.length);
    byte[] data = new byte[1 + langBytes.length + textBytes.length];
    data[0] = (byte) status;
    System.arraycopy(langBytes, 0, data, 1, langBytes.length);
    System.arraycopy(textBytes, 0, data, 1 + langBytes.length, textBytes.length);
    NdefRecord record = new NdefRecord(NdefRecord.TNF_WELL_KNOWN,
            NdefRecord.RTD_TEXT, new byte[0], data);
    return record;
}

如何发现标签?有人能帮我吗?

共有1个答案

丌官玺
2023-03-14

我会忽略谷歌文档中的内容,以便在https://developer.android.com/guide/topics/connectivity/nfc/nfc和用于在https://developer.android.com/guide/topics/connectivity/nfc/advanced-nfc#read-写入,因为这提供了非常糟糕的用户写入标签的体验,并且由于用户行为导致大量写入失败。

要获得可靠的写入NFC与Android你应该使用更新和更好的enableReaderModeAPIhttps://developer.android.com/reference/android/nfc/NfcAdapter

使用这个较新的API可以减少失败的写入和损坏的卡,因为您可以控制通知声音发生的时间。使用旧的基于Intent的系统,系统应用程序暂停您的应用程序,然后读取卡并发出通知声音,然后用户在应用程序恢复之前使用卡的方式,并有机会处理卡数据并写入卡片。

使用较新的enableReaderModeAPI,您可以关闭系统通知声音,并且您的应用程序不会暂停以读取NFC卡,然后您可以读取和写入该卡,当您成功写入该卡时,您可以自己发出通知声音。

由于任何错误都是无声的,因此用户将继续尝试出示卡,直到收到成功通知。不需要额外的逻辑来在每次显示一张卡或不同的卡时写入相同的消息。

一些示例代码(改编自我的应用程序NFC低级别读写(不是Ndef Tag技术))


public class NFCActivity extends AppCompatActivity implements NfcAdapter.ReaderCallback{

private NfcAdapter mNfcAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_nfc);

        mNfcAdapter = NfcAdapter.getDefaultAdapter(this);

        // Rest of Activity setup
     }

@Override
    protected void onResume() {
        super.onResume();

        if(mNfcAdapter!= null) {
            Bundle options = new Bundle();
            // Work around for some broken Nfc firmware implementations that poll the card too fast
            options.putInt(NfcAdapter.EXTRA_READER_PRESENCE_CHECK_DELAY, 250);

            // Enable ReaderMode for all types of card and disable platform sounds
            mNfcAdapter.enableReaderMode(this,
                    this,
                    NfcAdapter.FLAG_READER_NFC_A |
                            NfcAdapter.FLAG_READER_NFC_B |
                            NfcAdapter.FLAG_READER_NFC_F |
                            NfcAdapter.FLAG_READER_NFC_V |
                            NfcAdapter.FLAG_READER_NFC_BARCODE |
                            NfcAdapter.FLAG_READER_NO_PLATFORM_SOUNDS,
                    options);
        }

    }

    @Override
    protected void onPause() {
        super.onPause();
        if(mNfcAdapter!= null)
            mNfcAdapter.disableReaderMode(this);
    }
    
   // This method is run in another thread when a card is discovered
   // !!!! This method cannot cannot direct interact with the UI Thread
   // Use `runOnUiThread` method to change the UI from this method
   public void onTagDiscovered(Tag tag) {

      // Read and or write to Tag here to the appropriate Tag Technology type class
      // in this example the card should be an Ndef Technology Type 
      Ndef mNdef = Ndef.get(tag);

      // Check that it is an Ndef capable card
      if (mNdef!= null) {

      // If we want to read
      // As we did not turn on the NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK
      // We can get the cached Ndef message the system read for us.

      NdefMessage mNdefMessage = mNdef.getCachedNdefMessage();


      // Or if we want to write a Ndef message

      // Create a Ndef Record
      NdefRecord mRecord = NdefRecord.createTextRecord("en","English String");

      // Add to a NdefMessage
      NdefMessage mMsg = new NdefMessage(mRecord);
      
      // Catch errors
      try {
          mNdef.connect();
          mNdef.writeNdefMessage(mMsg);

          // Success if got to here
          runOnUiThread(() -> {
             Toast.makeText(getApplicationContext(),
               "Write to NFC Success",
               Toast.LENGTH_SHORT).show();
          });

          // Make a Sound
          try {
              Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
              Ringtone r = RingtoneManager.getRingtone(getApplicationContext(),
                  notification);
              r.play();
              } catch (Exception e) {
                 // Some error playing sound
              }
          
      } catch (FormatException e) {
        // if the NDEF Message to write is malformed
      } catch (TagLostException e) {
        // Tag went out of range before operations were complete
      } catch (IOException e){
        // if there is an I/O failure, or the operation is cancelled
      } finally {
        // Be nice and try and close the tag to
        // Disable I/O operations to the tag from this TagTechnology object, and release resources. 
         try {
                mNdef.close();
             } catch (IOException e) {
               // if there is an I/O failure, or the operation is cancelled
             }
      }

   }

}

 类似资料:
  • 我想将简单的文本数据写入我的恩智浦MiFARE DesFire EV1(NDEF Type 4标签)。但是,写入过程总是失败,并显示 为了写作,我得到NFC标签,我使用函数: 第三行()的结果如下: 由此我假设,标签的格式正确(作为NDEF)。现在,当调用<code>ndef时。connect()它只显示

  • 问题内容: 我已经实现了通过低级通信方法与NTAG216进行交互的代码(紧随NTAG212 Mifare Ultralight withAuthentication和NTAG216的数据表之后)。 到目前为止,我取得了以下成就: 如果未设置密码或新标签/空白标签,请在NTAG216上设置密码写保护。 如果已设置密码,请使用PWD_AUTH并比较PACK进行身份验证。 读取数据。 写入/覆盖数据。

  • 我已经实现了通过低级通信方法与NTAG216交互的代码(遵循NTAG212 Mifare Ultralight与身份验证和NTAG216的数据表)。 如果未设置或如果新/空白标签,请在NTAG216上设置密码写入保护。 如果已设置密码,请使用PWD_AUTH并比较PACK进行身份验证。 读取数据。 写入/覆盖数据。 检测我在其他应用程序中写入标签的NDEF消息。换句话说,我可以使用方法写入标签,也

  • 我正在做一个NFC应用程序。为了启动我的应用程序,我使用了一个NDEF标签,里面有一条AAR NDEF记录。 这很好。但是现在我想直接用应用程序读取标签内容。我该怎么做? (当我从手机上取下标签并再次触摸它时,它已经起作用了,但我想取消这一步。) 舱单: 我只想让NDEF_发现我的意图。但我总是有行动。主要/类别。我的调试器的启动意图。 任何帮助都将不胜感激。我是基于这个做我的工作的: Andro

  • 我在这个回答中使用了Michael Roland提供的示例,并修改了bytes命令结构以匹配这个回答。 扫描标签后,我收到了来自读者的 个回复。但是,当我使用 NFC 工具扫描标签时,我没有看到它有 NDEF 记录(照片)。如果我检查内存,我可以看到从块 4 开始写入的数据,如下所示。 同时,如果我使用NFC工具的写标签功能来写NDEF消息,然后再次扫描标签,它确实有效。除了从块4开始的块以外的块

  • 我正在尝试使用ACR122U NFC阅读器在Windows窗体应用程序(用C#编写)中创建并写入NFC标记的NDEF消息。 我使用Andreas Jakl的NDEF库创建了NDEF消息的原始字节。这是C#代码: 我得到的输出是D1 01 04 54 02 65 6E 31(十六进制)。