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)) {
...
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)) {
...