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当您的应用已经 运行 时的前景检测方法(有关详细信息,请参阅 )
我是初级 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当您的应用已经 运行 时的前景检测方法(有关详细信息,请参阅