在安卓系统中获取NFC硬件ID

4
我希望做一些非常简单的事情,但我不能确定 Gingerbread API 中的方法是针对正在扫描的令牌的ID还是 Nexus S 上的硬件。我想要做的是获取设备的 NFC 芯片的唯一标识符,以便我可以进行注册(例如,当设备被放置在 RFID 读卡器上时,我可以将该设备与一个帐户关联)。当前 API 方法是否支持此操作?
最有前途的代码片段(但我无法测试,因为我没有设备)如下:
byte[] tagId = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);
4个回答

8

tagId被设置为一个字节数组。您需要解析该数组并将其转换为十六进制字符串。有很多方法可以做到这一点,但是以下代码可以在不使用外部库的情况下完成,并且易于理解:

String ByteArrayToHexString(byte [] inarray) 
    {
    int i, j, in;
    String [] hex = {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};
    String out= "";

    for(j = 0 ; j < inarray.length ; ++j) 
        {
        in = (int) inarray[j] & 0xff;
        i = (in >> 4) & 0x0f;
        out += hex[i];
        i = in & 0x0f;
        out += hex[i];
        }
    return out;
}

我没有标签可以测试,但为什么不使用以下代码: byte[] rawTagId = getIntent().getByteArrayExtra(NfcAdapter.EXTRA_ID); String tagId = new String(rawTagId); - Waza_Be

2
在2.3.3版本中,你可以使用Tag类。如果你从意图中获取了该对象,你可以使用getId()方法。
Tag myTag = (Tag) intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

如果你需要将byte[]中的标签ID转换为"String"类型,你需要将它从字节转换为十六进制。


我没有标签可以测试,但为什么不使用以下代码: byte[] rawTagId = getIntent().getByteArrayExtra(NfcAdapter.EXTRA_ID); String tagId = new String(rawTagId); - Waza_Be

2

当检测到标签时,NFC控制器将自动分派意图NfcAdapter.ACTION_TAG_DISCOVERED

  1. To handle such intent, you have to add an intent filter for this action android.nfc.action.TAG_DISCOVERED:

    < action android:name="android.nfc.action.TAG_DISCOVERED"/>
    < category android:name="android.intent.category.DEFAULT"/>
    
  2. Add the appropriate permission:

    < uses-permission android:name="android.permission.NFC" />
    
  3. Restrict your application only to supported devices:

    < uses-sdk android:minSdkVersion="9" />  
    < uses-feature android:name="android.hardware.nfc" />
    
  4. When you handle the intent, you can call the code you suggested:

    byte[] tagId = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);
    NdefMessage[] msgs = (NdefMessage[]) intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
    

更多信息请访问:

  1. OpenIntents

  2. O'Reilly的在线书籍 - 第18章


虽然它可以获取设备发现的标签,但似乎无法获取板载NFC硬件的详细信息。有什么方法可以做到这一点吗? - Matt
1
为什么不使用设备的IMEI或MEID?它们被认为是唯一的,而且您可以注册它们。 - Lior
因为当设备的 NFC 标记被读取器扫描时,信息并不会被传输(但这是 Android 更早获得设备的 NFC 标记之前可能会出现的情况)。 - Matt

0
我相信设备上的“NFC芯片唯一标识符”不存在。没有明显的理由需要它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接