Android NFC 读取记录获取空 Ndef 记录

Android NFC read Records getting a null Ndef Record

我是初级 android 开发人员,从事 Nfc Reader 项目。我使用 Mifare 卡。我只能读取卡的 UID,但无法读取我使用 Nfc Tools 和我的应用程序编写的记录,但在我的控制台中记录 Ndef 值时它给了我一个空值。有什么帮助吗?提前致谢 这是我的代码

public class MainActivity extends AppCompatActivity {
private TextView mNfcText;
private String mTagText;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mNfcText = (TextView) findViewById(R.id.textME);
}

@Override
public void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
   
    Ndef ndef = Ndef.get(detectedTag);
    System.out.println("NDEF >>>"+ndef); //gives null
    readNfcTag(intent);
    mNfcText.setText(mTagText);
}

/**
 * NFC READ
 */
private void readNfcTag(Intent intent) {
    if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
        Parcelable[] rawMsgs = intent.getParcelableArrayExtra(
                NfcAdapter.EXTRA_NDEF_MESSAGES);
        NdefMessage msgs[] = null;
        int contentSize = 0;
        if (rawMsgs != null) {
            msgs = new NdefMessage[rawMsgs.length];
            for (int i = 0; i < rawMsgs.length; i++) {
                msgs[i] = (NdefMessage) rawMsgs[i];
                contentSize += msgs[i].toByteArray().length;
            }
        }
        try {
            if (msgs != null) {
                NdefRecord record = msgs[0].getRecords()[0];
                String textRecord = parseTextRecord(record);
                mTagText += textRecord + "\n\ntext\n" + contentSize + " bytes";
            }
        } catch (Exception e) {
        }
    }
}

/**
 * PArser
 */
public static String parseTextRecord(NdefRecord ndefRecord) {
    
    if (ndefRecord.getTnf() != NdefRecord.TNF_WELL_KNOWN) {
        return null;
    }
    if (!Arrays.equals(ndefRecord.getType(), NdefRecord.RTD_TEXT)) {
        return null;
    }
    try {
       
        byte[] payload = ndefRecord.getPayload();
        String textEncoding = ((payload[0] & 0x80) == 0) ? "UTF-8" : "UTF-16";
        int languageCodeLength = payload[0] & 0x3f;
        String languageCode = new String(payload, 1, languageCodeLength, "US-ASCII");
        String textRecord = new String(payload, languageCodeLength + 1,
                payload.length - languageCodeLength - 1, textEncoding);
        System.out.println("Text "+textRecord);
        return textRecord;
    } catch (Exception e) {
        throw new IllegalArgumentException();
    }
}

您没有具体说明您使用的是哪种类型的卡(卡的型号类型),但大多数描述为“Mifare”的卡实际上并不完全符合 NFC 标准。

如果是 Mifare Classic Type 卡,尤其如此。

所以您的问题可能有 2 个原因。

1)Mifare 经典卡具有在其上存储 Ndef 数据的专有方法,并非每个 phone 硬件都支持从中读取 Ndef 数据或支持在 NfcA 低级协议以外的任何其他方式读取它们。而且您必须使用专有方法自己实现 reading/writing Ndef 数据。

最好使用符合 NFC 标准的卡,例如 NTAG21x 系列之一。

2) 当您的应用不是 运行 或通过 2当您的应用已经 运行 时的前景检测方法(有关详细信息,请参阅