Nfc标签上的Id不是唯一的吗?

时间:2014-10-12 15:48:43

标签: android nfc

我正在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中读取唯一的只读标签?

2 个答案:

答案 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 "";
    }
}