Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Android上使用NFC从扇区读取数据_Java_Android_Nfc_Mifare - Fatal编程技术网

Java 如何在Android上使用NFC从扇区读取数据

Java 如何在Android上使用NFC从扇区读取数据,java,android,nfc,mifare,Java,Android,Nfc,Mifare,我正试图从一个项目的NFC卡上读取数据。它使用Mifare classic 1k,有16个扇区 我能够连接到卡,并且我正在尝试读取数据(我知道我想要的数据在第二扇区-第二块)。我可以很好地扫描卡,它会显示卡的大小,这样可以确保正确扫描卡,但我在记录“data.readBlock(2)”时获得的数据与我用于验证它的密钥相同 我从代码中了解到: 卡连接 Auth==true 我可以获得卡的整体详细信息,如扇区计数/块计数 protected void onNewIntent(Intent inten

我正试图从一个项目的NFC卡上读取数据。它使用Mifare classic 1k,有16个扇区

我能够连接到卡,并且我正在尝试读取数据(我知道我想要的数据在第二扇区-第二块)。我可以很好地扫描卡,它会显示卡的大小,这样可以确保正确扫描卡,但我在记录“data.readBlock(2)”时获得的数据与我用于验证它的密钥相同

我从代码中了解到: 卡连接 Auth==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中的数据:
扇区2中的数据块2

实际=“扇区2中的数据:[B@4df9e32"


每次扫描卡时,上述实际结果都会发生变化。

您得到的是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卡片阅读,所以不要急于下结论。正如医学界所说:

想想马,而不是斑马


通过将内存位置转换为字符串,然后将该字符串转换为UTF-8格式,我最终解决了此问题。为帮助干杯

嗨,Jacob,感谢您的响应。我尝试了此操作,它返回了一个“[4]”我假设是块的大小。你可能知道我是NFC的新手,那么你对如何打印块中的数据有什么其他建议吗?谢谢!你正在尝试通过对扇区2进行身份验证来读取扇区0中的块2。块编号不会重新启动每个扇区。因此,如果你想读取扇区2的区块2区块编号应该是9。请记住区块计数和扇区计数都从0开始。就我个人而言,这是我过去在这个主题上的开始。我已经查看了链接,我从中得到了一些东西…虽然都是数字,而不是我知道的卡上的实际字符串。非常混乱,有什么想法吗例如,如果我将扇区更改为9:[83、88、48、48、49、51、54、55、48、56、32、35、35、35、35]如果您原来的问题已经解决,请单击我的答案旁边的复选标记。您现在看到的是存储在卡上的字节,这绝对是您应该得到的。我建议在继续之前更好地掌握您正在处理的内容。您需要将这些字节处理为您需要的字节,然后o您需要知道信息是如何存储在卡中的。