Android 将Mifare Ultralight格式化为NDEF引发IO异常

Android 将Mifare Ultralight格式化为NDEF引发IO异常,android,format,nfc,mifare,ndef,Android,Format,Nfc,Mifare,Ndef,我想使用以下代码格式化从未使用过的MIFARE Ultralight卡: NdefFormatable formatable = NdefFormatable.get(tag); if (formatable != null) { String result = "Afifly"; try { formatable.connect(); try { formatable.format(new NdefMessage(new

我想使用以下代码格式化从未使用过的MIFARE Ultralight卡:

NdefFormatable formatable = NdefFormatable.get(tag);
if (formatable != null) {
    String result = "Afifly";
    try {
        formatable.connect();

        try {
            formatable.format(new NdefMessage(new NdefRecord(NdefRecord.TNF_EMPTY, null, null, null)));
        } catch (Exception e) {
            // let the user know the tag refused to format
            System.out.println("error ");//+getStackTrace(e));
            result = "Fail 1";
        }
    } catch (Exception e) {
        // let the user know the tag refused to connect
        System.out.println("eeeerrror 2"+e);
        result = "Fail 2";
    } finally {
        try {
            formatable.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return;
}
但是当调用方法
formattable.format(…)
时,它总是抛出IOException(没有任何有意义的消息)

我试着用其他几张牌,结果都一样。但是,这些卡可以使用NXP TagWriter进行格式化

我已找到问题/答案“”,但此解决方案不适用于我。我还是有同样的例外

标签的前四页(第0-3页)包含以下字节:

04 F1 E9 94 42 AB 4A 80 23 48 00 00 (all lock-bits cleared) 00 00 00 00 (no capability container) 04 F1 E9 94 42 AB 4A 80 23 48 00 00(所有锁定位已清除) 00(无容量容器)
因此,标记为空且未锁定。

在空MIFARE Ultralight标记上调用
NdefFormatable.format()
时,获取
IOException
的最可能原因是您的设备不支持该类型标记的“格式化”(即初始化为NFC论坛类型2标记)。如果是这样的话,您甚至可以看到
ndefforformable
技术,这显然是一个bug

在这种情况下,您唯一的选择是手动执行格式化过程(有关详细信息,请参阅NFC论坛类型2标记操作规范)。这也是各种标签书写应用程序(如NXP TagWriter)所做的。对于MIFARE Ultralight(MF0ICU1)标记(不要尝试将其用于更大的标记!),类似这样的方法可以工作:

NfcA nfcA = NfcA.get(tag);
if (nfcA != null) {
    try {
        nfcA.connect();
        nfcA.transceive(new byte[] {
            (byte)0xA2,  // WRITE
            (byte)0x03,  // page = 3
            (byte)0xE1, (byte)0x10, (byte)0x06, (byte)0x00  // capability container (mapping version 1.0, 48 bytes for data available, read/write allowed)
        });
        nfcA.transceive(new byte[] {
            (byte)0xA2,  // WRITE
            (byte)0x04,  // page = 4
            (byte)0x03, (byte)0x00, (byte)0xFE, (byte)0x00  // empty NDEF TLV, Terminator TLV
        });
    } catch (Exception e) {
    } finally {
        try {
            nfcA.close();
        } catch (Exception e) {
        }
    }
}

使用
tag.getTechList()
列举了哪些技术?IOException是否包含任何消息(
e.getMessage()
)?在你尝试使用
格式(…)
之前,标签第3-5页的内容是什么?列举了3种技术:
android.nfc.tech.NfcA
android.nfc.tech.MifareUltraLight
android.nfc.tech.ndeformable
e.getMessage()
打印出
null
,它给了我一个字节数组,包含值
4-15-23-10866-8574-1283572和6零
,所以如果是4字节的页面,它在第3页给了我
35720
,在第4页和第5页只给了0。。。当我调用
MifareUltralight.get(tag).readPages(0)
时,每一张未格式化的卡上都有不同的文字,标签确实是空的,并且没有锁定,因此如果您的Android设备支持该标签类型的格式化,格式化应该不起作用。您还可以尝试使用不同的NDEF消息(例如,包含非空记录的消息)。如果这不起作用,您的设备平台可能不支持使用
NdefFormatable
格式化该标记类型,即使它错误地提供了
NdefFormatable
标记技术。不幸的是,这种装置确实存在。如果是这样,我建议您手动执行格式化过程。谢谢您的回答。我尝试使用非空记录,但没有成功。。。如果我的设备平台不支持格式化,为什么格式化与tagwriter应用程序在同一设备上工作?他们正在使用其他不可靠的东西?这是怎么回事?@Phoenix感谢您发现并纠正了复制粘贴错误(错误的页码)。不知道为什么你的编辑被拒绝了…你知道如何在格式化一张卡片后,不用第二次触摸就刷新标签技术列表吗?格式化成功了,但我无法立即在卡片上写入,因为标签与格式化前的techlist相同,要刷新它,我需要将卡片拿出来,戴上它,用好的techlist检测它…@Phoenix不,这根本不可能(有一些邪恶且不稳定的技巧,如禁用和重新启用NFC发现,但不要尝试这样做…)如果需要立即编写NDEF消息,还需要使用低级命令来编写。您可以通过将NDEF消息填充到NDEF TLV。谢谢,但我最终决定使用
nfcA.transceive()
编写我自己的六位代码,以避免因ndefMessage而感到尴尬…感谢你的应用程序帮助我看到了我在上面写的东西!很抱歉“愚蠢”的评论,但它可以用于“模拟”吗Mifare Ultralight卡?例如,使用.connect()将数据发送到读卡器?