当前位置: 首页 > 知识库问答 >
问题:

在Android 5.1中无法通过NFC读取Mifare Classic卡

秦鸿羽
2023-03-14

我正在使用NFC读取Mifare Classic 1K卡。

该代码适用于所有Android5.0及以下版本的Android设备,但当我在Android5.1设备上测试代码时,它不起作用。

我的代码,

MifareClassic mfc = MifareClassic.get(tagFromIntent);

当我在Android5.1中扫描卡片时,返回null,否则在5.1以下的版本中,它可以正常工作。

@SuppressLint("InlinedApi")
public String AuthenticateCard(Context context, Intent nfcIntent) {
    String blockData = null;

    //Get an instance of the TAG from the NfcAdapter
    Tag tagFromIntent = nfcIntent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
    String idFromIntent = ByteArrayToHexString(tagFromIntent.getId());

    Log.v("onNewIntent()", "NfcAdapter TAG : " + tagFromIntent
            + "NfcAdapter ID : " + idFromIntent);

    Log.v("onNewIntent()", "TAG TYPE : " + tagFromIntent.describeContents());

    //Get an instance of the Mifare classic card from this TAG intent

    //It works successfully with android 5.0 or below versions but returns null in devices with android 5.1.
    MifareClassic mfc = MifareClassic.get(tagFromIntent);


    try {
        // Connect to card
        mfc.connect();
         // authenticate the sector
        if (mfc.authenticateSectorWithKeyA(MY_SECTOR, MY_KEY)) {

            for (int k = 0; k < 1; ++k) {
                int block = mfc.sectorToBlock(MY_SECTOR) + k;
                byte[] data = null;

                try {
                     // Read the block
                    data = mfc.readBlock(block);
                } catch (IOException e) {
                    Log.e("IOException", "\n" + "Block " + block
                            + " data: " + e.getMessage());
                    continue;
                }
                 // Convert the data into a string from Hex format.
                blockData = ByteArrayToHexString(data);

                // reading first 8 bytes only
                blockData = blockData.substring(0, 8);
            }

            if (blockData != null) {
                mp = MediaPlayer.create(context, R.raw.served);
            } else {
                mp = MediaPlayer.create(context, R.raw.coins);
            }

        } else {
            Toast.makeText(context, R.string.not_valid_rfid,
                    Toast.LENGTH_SHORT).show();
            mp = MediaPlayer.create(context, R.raw.professionals);
        }

        mfc.close();

    } catch (IOException e) {
        mp = MediaPlayer.create(context, R.raw.coins);
        Toast.makeText(context, R.string.error_while_scanning,
                Toast.LENGTH_SHORT).show();
    } catch (NullPointerException e) {
        // TODO: handle exception
        mp = MediaPlayer.create(context, R.raw.coins);
        Toast.makeText(context, R.string.error_while_scanning,
                Toast.LENGTH_SHORT).show();
    }finally {
        try {
            if (mfc != null)
                mfc.close();
            if (mp != null)
                mp.start();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    return blockData;
}

共有1个答案

秋建义
2023-03-14

您遇到的问题可能与升级到Android5.1无关。相反,为标记获取MIFAREClassic对象的实例只能在支持MIFARE Classic的平台上工作。因此,

MifareClassic.get(tagFromIntent)

将在不支持MIFARE Classic的平台上返回null。这基本上意味着您的应用程序只能在恩智浦NFC芯片组的设备上运行。

  • 对于Nexus 7,只有2012年版本支持MIFARE Classic。2013年版本(Broadcom芯片)将无法读取MIFARE Classic。
  • Nexus 5将无法从MIFARE Classic读取数据。
  • 大多数(全部?)索尼Xperia应该可以正常工作。
  • 三星Galaxy S4(可能还有Note 3和Note 4)将无法从MIFARE Classic读取数据。S3和S5工作正常。
  • Nexus 6具有Broadcom NFC芯片,因此无法从MIFARE Classic读取数据。
if (getPackageManager().hasSystemFeature("com.nxp.mifare")) { ... }

不是识别支持MIFARE Classic器件的非常可靠的方法

 类似资料:
  • 我一直在到处寻找答案,但没有任何帮助。 这是我的代码: 当我试图读取URL时,下面出现了一个异常。 任何帮助都会很好。我正在尝试读取url内部的图像,并将其与现有文件进行比较。这里没有任何问题给出答案。 编辑: 我尝试在命令行“keytool-list-keystore keystore”中输入,但它只显示给我TrustedCertentries。还没有解决方案奏效。

  • 我使用下面的示例代码来读取NFC标签,但它不是多次读取标签(有时读取3次,有时读取6-7次)。在我的应用程序中,我需要连续读取nfc标签。 https://github.com/andijakl/NfcDemo

  • 问题内容: 这是我的客户代码 这是服务器代码 但是即使我这样修改它,我也不会在fromClient中接收任何内容 我没有结果 问题答案: 客户端需要调用或导致将缓冲的数据推送到服务器。(如果您打算写入更多数据,请刷新,否则关闭。) 服务器端需要在实例上使用readInt读取数据。使用DataOutputStream写入的数据应使用DataInputStream读取。 最后,摆脱BufferedRe

  • 在我们的docker-swarm中运行kafka connect,使用以下撰写文件: kafka connect节点成功启动,我可以设置任务并查看这些任务的状态······ 我是否在撰写文件或任务配置中缺少某些配置?

  • 在问题[1]中,我了解到如果您想在Android下使用NFC标签,则不必采用NDEF格式。我想在Win 8.1 in. Net下执行此操作。我的情况是这样的: 我有一个RFID卡Mifare Classic 1K,其中存储了一个ID。(由制造商记录)该ID由我们的考勤系统通过通常的RFID读取器(例如Gigatek的PROMAG MFR120)读取。我们不在卡上写任何东西,我们只需要读取ID。但是

  • 我正在尝试从/到我的NTAG216标签读取/写入NDEF消息。 作为此开发的基础,我使用Microsoft NFC示例中的PcscSdk:https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/Nfc 我能够成功连接到卡。它被识别为Mifare Ultralight,我可以读/写上面的前16个块。如果我请