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

将 ndef 消息写入 NFC 标记失败,并显示 java.io.exception

鲁波光
2023-03-14

我想将简单的文本数据写入我的恩智浦MiFARE DesFire EV1(NDEF Type 4标签)。但是,写入过程总是失败,并显示 IOExcetion

为了写作,我得到NFC标签,我使用函数

private void write(String mimeType, String text, Tag tag) throws IOException, FormatException {
    NdefRecord[] records = {createRecord(mimeType, text)};
    NdefMessage message = new NdefMessage(records);
    Ndef ndef = Ndef.get(tag);
    ndef.connect();
    ndef.writeNdefMessage(message);
    ndef.close();
}

第三行(Ndef ndef=Ndef.get(标签))的结果如下:

TAG: Tech [android.nfc.tech.IsoDep, android.nfc.tech.NfcA, android.nfc.tech.Ndef]

由此我假设,标签的格式正确(作为NDEF)。现在,当调用<code>ndef时。connect()它只显示java.io。exception</code>,而没有关于错误的任何其他信息。被调用的代码的其他部分被附加。

@Override
public void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    String action = intent.getAction();
    if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
        tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        if (tag != null) {
            String serialId = Utility.bytesToHex(tag.getId());
            Log.d("[WriteCard]", "Serial Number: " + serialId);
            Toast.makeText(this, serialId, Toast.LENGTH_SHORT).show();
        }
    }
}

// When the write Button is clicked
public void onClick(View view)    {
    if (nfc_adapter == null) {
        Toast.makeText(this, "No NFC", Toast.LENGTH_SHORT).show();
        return;
    } 
    int id = view.getId();
    Intent intent = getIntent();
    try {
        write("type/1", spinner_location.toString(), tag);
    }
    catch(Exception e)  {
        Log.d("[WriteCard]", e.toString());
        Toast.makeText(this,  e.toString(), Toast.LENGTH_SHORT).show();
    }
}

恩智浦标签信息应用报告以下内容:

  • IC类型:MiFARE DESFire EV1
  • 类型4标签
  • NFC数据集访问:读取

附加信息:使用Android应用程序(如NFC TagWriter by NXP或wakdev NFC Tools)的编写过程没有任何问题,因此我假设标签正常工作。


共有1个答案

贡正诚
2023-03-14
匿名用户

真正尝试在单击按钮时写入标记总是不可靠的,而且在现实生活中使用enableForeGroundDispatch也是不可靠的。你提到的两个应用程序并没有按照你想要的方式来做。

文档中还提到了< code>connect和< code>writeNdefMessage

可能导致射频活动并可能阻塞。不得从主应用程序线程调用。

您从主(UI)线程调用这些。

你的按钮只需要设置“当标签进入范围时,立即写文本”的动作

例如,类似的东西

private String text;

@Override
public void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    String action = intent.getAction();
    if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
        tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        if (tag != null) {
            if(text.isEmpty()) {
               // Nothing to write so read
               String serialId = Utility.bytesToHex(tag.getId());
               Log.d("[WriteCard]", "Serial Number: " + serialId);
               Toast.makeText(this, serialId, Toast.LENGTH_SHORT).show();
             } else {
               // Have some text to write 
               try {
                  write("type/1", text, tag);
                } catch(Exception e)  {
                  Log.d("[WriteCard]", e.toString());
                  Toast.makeText(this,  e.toString(), Toast.LENGTH_SHORT).show();
                }
               // Reset the write trigger
               text = "";
        }
    }
}

// When the write Button is clicked
public void onClick(View view)    {
    text = spinner_location.toString();
}

此外,在尝试写入之前,您确实需要检查您的标签是否是格式化的Ndef标签。

例如,类似的东西

private void write(String mimeType, String text, Tag tag) throws IOException, FormatException {
    NdefRecord[] records = {createRecord(mimeType, text)};
    NdefMessage message = new NdefMessage(records);
    Ndef ndef = Ndef.get(tag);
    if(ndef != null) {
       // It's an already formatted Ndef Tag
       ndef.connect();
       ndef.writeNdefMessage(message);
       ndef.close();
    } else {
       // Try and format at write
       .... "get(tag)" for Ndef formattable type and check not null
    }
}

最后一点是使用旧的enableFore领导调度是不可靠的,所以使用更新更好的enableReaderModelonTagDis的API代替。

这也解决了错误线程上的调用连接等问题,因为 onTagDiscovery 会自动在它自己的线程中。

此外,当您禁用“平台”声音时,它还启用 ReaderMode,它不会提示您用户在您有机会写入之前从范围中删除标签(您可以在成功写入后播放自己的声音)

有关enableReaderMode示例,请参见https://stackoverflow.com/a/64921434/2373819。

 类似资料:
  • 如何将NDEF消息写入NFC标记?我必须更改清单文件吗?到目前为止,我有生成NDEF消息的代码: 如何发现标签?有人能帮我吗?

  • 我正在尝试创建一个 NFC 标签,该标签将触发两个单独的操作: 打开蓝牙连接 启动应用程序(或前往游戏商店) 我使用 nfc-eclipse-plugin 创建了一个包含两个合适记录的消息,但是,当写入标签时,它总是只触发第一个操作。两者都单独工作,但第二个总是被忽略。 我知道一个NFC标签上的2个NDEF消息/记录的答案-Android说你不能在一个标签上有两条独立的消息,只有一条消息中的多条记

  • 类似的问题 - 如何在Android中读取检测到的NFC标签(NDEF内容)详细信息? 我希望我的android应用程序能够读取和解析检测到的NDEF消息。 我已经编辑了AndroidManifest.xml来检测nfc标签,并添加了意图过滤器,如下所示 我相信这很好,因为当我使用SDK附带的NFCDemo示例应用程序创建MockNDEF标签时,当我可以选择处理这些生成的标签的应用程序列表出现时,

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

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

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