如何在Android上使用NFC读取扇区中的数据

时间:2019-10-22 19:14:29

标签: java android nfc mifare

我正在尝试从用于项目的NFC卡中读取数据。它使用的是Mifare classic 1k,有16个扇区。

我能够连接到卡,并且正在尝试读取数据(我知道我想要的数据在第二个扇区-第二个块中)。我可以对卡进行精细扫描,它可以显示卡的大小,从而确保可以正确扫描卡,但是登录“ data.readBlock(2)”时获得的数据与密钥相同我用来对其进行身份验证...

我从代码中了解到: 卡连接 验证== true 我可以获得卡的整体详细信息,例如扇区数/块数

protected void onNewIntent(Intent intent){
            super.onNewIntent(intent);
            Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
            MifareClassic tag = MifareClassic.get(tagFromIntent) ;
            try {
                //Variables
                int sectorCount = tag.getSectorCount();
                int tagSize = tag.getSize();
                boolean auth;
                //Keys
                byte[] defaultKeys = new byte[]{};
                defaultKeys = MifareClassic.KEY_DEFAULT;
                //Connecting to tag
                tag.connect();
                //auth = true
                auth = tag.authenticateSectorWithKeyA(2, defaultKeys);
                byte[] data = tag.readBlock(2);
                Log.i("OnNewIntent", "Data in sector 2: " + Arrays.toString(data));
            } catch (IOException e) {
                e.printStackTrace();
            }

Expected =“扇区2中的数据:The data in sector 2 block 2

Actual =“扇区2中的数据:[B @ 4df9e32”

每次扫描卡时,实际结果都会更改

我在其他地方寻求帮助,但找不到,因为我的身份验证似乎与其他人不同。任何帮助将不胜感激,谢谢。

2 个答案:

答案 0 :(得分:0)

您得到的是Java用于将其保留在内存中的对象引用。要获取可读版本的数据,请使用:

Arrays.toString(data);

顺便说一句,您可能需要更改代码以检查验证是否成功:

authSuccessful = mfc.authenticateSectorWithKeyA(sector, key);

if(authSuccessful){
    // Read the block
    creditBlock = mfc.readBlock(block);

    String bytesString = Arrays.toString(creditBlock);
    Log.i(TAG, bytesString);

} else {
    Log.e(TAG, "Auth Failed");
}

最后,我很确定您要尝试的只是阅读标准的Mifare卡,因此请避免得出结论。正如他们在医学中所说的:

  

想想马而不是斑马

答案 1 :(得分:0)

我终于解决了此问题,方法是将内存位置转换为字符串,然后将该字符串转换为UTF-8格式。为帮助喝彩