android 如何读取 NFC Mifare Classic 1K 卡中的文本记录

How to read text record in a NFC Mifare Classic 1K card in android

enter image description here 我是从事 NFC reader 项目的 java 程序员新手。 我一直在尝试读取 Android 中 NFC 卡的内容,但无法正常工作。我只能检索 NFC 卡的 UID。 我浏览了 Android 中的 NFC 文档和一些教程,但我并不真正理解它。 我搜索了很多但没有明确的解决方案或关于读取 Mifare Classic 1K 文本记录的文章。我怎样才能做到这一点?真的,我什么都不知道,所以如果问题有点不清楚,请原谅。 我正在使用 NFC 工具桌面应用程序写入文本记录(下面的屏幕截图) 我将不胜感激任何帮助。提前致谢

这是我在 android

上获得意图后用来获取记录的代码片段

    private void readFromIntent(Intent intent) {
        System.out.println("Came huered ");
        String action = intent.getAction();
        if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)
                || NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)
                || NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
           
            Parcelable[] rawMessages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
            NdefMessage[] messages ;
            
            if (rawMessages != null) {
                messages = new NdefMessage[rawMessages.length];
                for (int i = 0; i < rawMessages.length; i++) {
                    messages[i] = (NdefMessage) rawMessages[i];
                    NdefRecord [] records = messages[i].getRecords();
                    System.out.println("RECORDS "+records);
                    //if you are sure you have text then you don't need to test TNF
                    for(NdefRecord record: records){
                        processRecord(record);
                    }
                }
            }
        }
    }
public void processRecord(NdefRecord record) {

        short tnf = record.getTnf();
        switch (tnf) {


            case NdefRecord.TNF_MIME_MEDIA: {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                    if (record.toMimeType().equals("MIME/Type")) {
                        // handle this as you want
                        System.out.println("HEREEEE");
                    } else {
                        //Record is not our MIME
                    }
                }
            }
            // you can write more cases
            default: {
                //unsupported NDEF Record
            }
        }
    }

您对记录的处理不是在寻找 Ndef 文本记录。

case NdefRecord.TNF_MIME_MEDIA: {

不适用于文本记录

使用

short tnf = record.getTnf();
byte[] type = record.getType();

if (tnf == NdefRecord.TNF_WELL_KNOWN &&
        Arrays.equals(type, NdefRecord.RTD_TEXT) {
  // Correct TNF and Type for Text record
  // Now process the Text Record encoding
}

请注意,toMimeType 实际上会将 RTD_TEXT 转换为 mime 类型,但为此

if (record.toMimeType().equals("MIME/Type")) {

需要

if (record.toMimeType().equals("text/plain")) {

有关处理文本记录,请参阅

更新

应该也说过

if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)
                || NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)
                || NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {

是错误的,因为当标签中没有 Ndef 数据时,您正试图解析 Ndef 数据。

应该是

if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {

更新2 我检查了 github link 你给的代码

它不会在 Ndef 记录上触发,因为您正在测试错误类型的 Intent

Intent 调度系统仅发送最高类型的 NFC Intent,其顺序为:-

ACTION_NDEF_DISCOVERED -> ACTION_TECH_DISCOVERED -> ACTION_TAG_DISCOVERED

因此,如果标签包含 NDEF 数据,则仅设置 ACTION_NDEF_DISCOVERED 的操作类型。

因此

public void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        if (intent.getAction().equals(NfcAdapter.ACTION_TAG_DISCOVERED)) {
...

永远不会触发 Intent 的处理

该代码应该是

public void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        if (intent.getAction().equals(NfcAdapter.ACTION_NDEF_DISCOVERED)) {
...