📜  Android-NFC指南(1)

📅  最后修改于: 2023-12-03 15:29:22.421000             🧑  作者: Mango

Android NFC指南

简介

NFC(Near Field Communication)是一种短距离无线通信技术,可以用于数据交换和身份认证等。在Android系统中,NFC被广泛应用于移动支付、门禁卡等场景。

本指南将介绍如何在Android应用中使用NFC功能,包括启用NFC、读写NFC标签、处理NFC推送等。

启用NFC

要使用NFC功能,首先需要在AndroidManifest.xml文件中添加以下权限:

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

此外,还需要在AndroidManifest.xml文件中声明应用支持NFC:

<uses-feature
    android:name="android.hardware.nfc"
    android:required="true" />

可以通过如下代码判断设备是否支持NFC:

PackageManager pm = getPackageManager();
if (!pm.hasSystemFeature(PackageManager.FEATURE_NFC)) {
    // 设备不支持NFC
    return;
}
读写NFC标签

要读写NFC标签,需要使用Android系统提供的NfcAdapter类。可以通过如下代码获取NfcAdapter实例:

NfcManager manager = (NfcManager) getSystemService(Context.NFC_SERVICE);
NfcAdapter adapter = manager.getDefaultAdapter();
if (adapter == null) {
    // 设备不支持NFC
    return;
}

在获取到NfcAdapter实例后,可以使用以下步骤进行NFC标签读写:

  1. 创建一个PendingIntent对象,用于接收NFC事件。
Intent intent = new Intent(this, getClass());
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
  1. 在onResume()方法中启用NFC前台调度,以接收NFC事件。
adapter.enableForegroundDispatch(this, pendingIntent, null, null);
  1. 在onPause()方法中禁用NFC前台调度。
adapter.disableForegroundDispatch(this);
  1. 在onNewIntent()方法中处理NFC事件。
@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);

    if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
        // 获取NFC标签ID
        byte[] tagId = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);
        String tagIdStr = ByteArrayToHexString(tagId);

        // 读取NFC标签内容
        Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        Ndef ndef = Ndef.get(tag);
        if (ndef != null) {
            try {
                ndef.connect();
                NdefMessage ndefMessage = ndef.getNdefMessage();
                if (ndefMessage != null) {
                    NdefRecord[] records = ndefMessage.getRecords();
                    for (NdefRecord record : records) {
                        byte[] payload = record.getPayload();
                        String text = new String(payload, Charset.forName("UTF-8"));
                        Log.d(TAG, "NFC Tag Content: " + text);
                    }
                }
            } catch (IOException | FormatException e) {
                e.printStackTrace();
            }
        }
    }
}

private String ByteArrayToHexString(byte[] bytes) {
    StringBuilder sb = new StringBuilder();
    for (byte b : bytes) {
        sb.append(String.format("%02X", b));
    }
    return sb.toString();
}

上面的代码演示了如何获取NFC标签ID并读取NFC标签内容。

处理NFC推送

除了读写NFC标签,还可以使用NFC推送功能,在两个设备之间交换数据。实现NFC推送功能需要以下步骤:

  1. 在AndroidManifest.xml文件中为应用添加一个NDEF推送记录过滤器,用于指定要交换的NDEF数据类型。
<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />

    <category android:name="android.intent.category.DEFAULT" />

    <data android:mimeType="text/plain" />
</intent-filter>
  1. 在onResume()方法中启用NFC前台调度,以接收NFC推送事件。
adapter.enableForegroundDispatch(this, pendingIntent, new IntentFilter[]{new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED)}, null);
  1. 在onPause()方法中禁用NFC前台调度。
adapter.disableForegroundDispatch(this);
  1. 在onNewIntent()方法中处理NFC推送事件。
@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);

    if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
        // 读取NFC数据
        Parcelable[] rawMessages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
        if (rawMessages != null) {
            NdefMessage[] messages = new NdefMessage[rawMessages.length];
            for (int i = 0; i < rawMessages.length; i++) {
                messages[i] = (NdefMessage) rawMessages[i];
            }
            NdefRecord[] records = messages[0].getRecords();
            byte[] payload = records[0].getPayload();
            String text = new String(payload, Charset.forName("UTF-8"));
            Log.d(TAG, "Received NFC Push Message: " + text);
        }
    }
}

上面的代码演示了如何处理NFC推送事件并读取传输的数据。

总结

本指南介绍了Android应用中如何使用NFC功能。通过学习NFC标签读写与NFC推送功能的实现方法,相信你已经能够灵活运用NFC技术了。