我正在Android手机上阅读nfc标签,我写的标签有值,我这样读了:
@Override
protected String doInBackground(Tag... params) {
Tag tag = params[0];
Ndef ndef = Ndef.get(tag);
if (ndef == null) {
// NDEF is not supported by this Tag.
return null;
}
NdefMessage ndefMessage = ndef.getCachedNdefMessage();
NdefRecord[] records = ndefMessage.getRecords();
for (NdefRecord ndefRecord : records) {
if (ndefRecord.getTnf() == NdefRecord.TNF_WELL_KNOWN && Arrays.equals(ndefRecord.getType(), NdefRecord.RTD_TEXT)) {
try {
return readText(ndefRecord);
} catch (UnsupportedEncodingException e) {
Log.e(TAG, "Unsupported Encoding", e);
}
}
}
return null;
}
private String readText(NdefRecord record) throws UnsupportedEncodingException {
byte[] payload = record.getPayload();
String textEncoding = ((payload[0] & 128) == 0) ? "UTF-8" : "UTF-16"; // Get the Text Encoding
int languageCodeLength = payload[0] & 0063; // Get the Language Code
return new String(payload, languageCodeLength + 1, payload.length - languageCodeLength - 1, textEncoding); // Get the Text
}
NfcTag的唯一ID应该是只读的,我试过了:
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
mNfcId = tag.getId().toString();
但是这会在下次阅读时给出不同的结果! 如何从nfc Tag中读取唯一的只读标签?
答案 0 :(得分:1)
出于隐私原因,有些标签没有唯一的ID。大多数旅行证件和包含NFC芯片的信用卡都在其中。
另外:不要指望您可以阅读的ID的唯一性。这些很容易被伪造。此外,许多NFC标签制造商也不保证ID的全球唯一性。
答案 1 :(得分:0)
除了Nils在帖子中已经解释过的内容之外,在字节数组上使用toString()
不会为您提供有关字节数组内容的有用信息。而是使用这样的方法将UID字节数组转换为字符串表示形式:
public static String convertByteArrayToHexString (byte[] b) {
if (b != null) {
StringBuilder s = new StringBuilder(2 * b.length);
for (int i = 0; i < b.length; ++i) {
final String t = Integer.toHexString(b[i]);
final int l = t.length();
if (l > 2) {
s.append(t.substring(l - 2));
} else {
if (l == 1) {
s.append("0");
}
s.append(t);
}
}
return s.toString();
} else {
return "";
}
}