Android读取手机的NFC卡

介绍

近年来,随着移动支付和智能门禁系统的普及,NFC(Near Field Communication)技术也越来越受到关注。NFC技术可以实现手机与智能卡之间的无线通信,并且具有安全性高、传输速度快、操作简便等优点。在Android系统中,我们可以利用系统提供的API来读取手机上的NFC卡,并进行相应的操作。本文将介绍如何在Android平台上读取手机的NFC卡,并附带相应的代码示例。

准备工作

在开始之前,我们需要确保手机的硬件支持NFC功能,并且手机系统的版本在Android 4.0以上。另外,我们还需要在AndroidManifest.xml文件中添加相应的权限和过滤器,以便让应用程序能够正常地与NFC交互。

<uses-permission android:name="android.permission.NFC" />

<application ...>
    ...
    <activity ...>
        ...
        <intent-filter>
            <action android:name="android.nfc.action.TECH_DISCOVERED" />
        </intent-filter>
        <meta-data
            android:name="android.nfc.action.TECH_DISCOVERED"
            android:resource="@xml/nfc_tech_filter" />
    </activity>
    ...
</application>

上述代码中,android.permission.NFC权限用于允许应用程序访问NFC功能。<intent-filter><meta-data>用于告诉系统,当手机靠近NFC卡时,由我们的应用程序来处理相应的事件。

读取NFC卡

在Android中,我们可以通过NfcAdapter类来获取NFC适配器,并注册相应的回调方法来处理NFC事件。下面是一个简单的示例代码:

public class MainActivity extends AppCompatActivity {
    private NfcAdapter nfcAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        nfcAdapter = NfcAdapter.getDefaultAdapter(this);
        if (nfcAdapter == null) {
            // 设备不支持NFC
            Toast.makeText(this, "设备不支持NFC", Toast.LENGTH_SHORT).show();
            finish();
            return;
        }

        // 检查NFC是否已启用
        if (!nfcAdapter.isEnabled()) {
            Toast.makeText(this, "请在系统设置中启用NFC功能", Toast.LENGTH_SHORT).show();
            finish();
            return;
        }

        // 设置NFC事件的处理回调
        nfcAdapter.setNdefPushMessageCallback(new NfcAdapter.CreateNdefMessageCallback() {
            @Override
            public NdefMessage createNdefMessage(NfcEvent event) {
                // TODO: 构建要推送的NDEF消息
                return null;
            }
        }, this);
    }

    @Override
    protected void onResume() {
        super.onResume();
        Intent intent = new Intent(this, getClass());
        intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
        nfcAdapter.enableForegroundDispatch(this, pendingIntent, null, null);
    }

    @Override
    protected void onPause() {
        super.onPause();
        nfcAdapter.disableForegroundDispatch(this);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        // 处理新的NFC事件
        resolveIntent(intent);
    }

    private void resolveIntent(Intent intent) {
        String action = intent.getAction();
        if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)) {
            // 读取到NFC卡信息
            Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
            if (tag != null) {
                // TODO: 处理NFC卡信息
            }
        }
    }
}

上述代码中,onCreate()方法中首先获取到默认的NFC适配器,并检查设备是否支持NFC。然后,通过nfcAdapter.isEnabled()方法来检查NFC功能是否已启用。接下来,在setNdefPushMessageCallback()方法中设置了一个CreateNdefMessageCallback回调,用于构建要推送的NDEF消息。当手机靠近另一台支持NFC的设备时,将触发该回调。

onResume()方法中,我们通过enableForegroundDispatch()方法启用前台调度,以便在应用程序处于前台运行时能够正