跳到主要内容

Android NFC

介绍

NFC(Near Field Communication,近场通信)是一种短距离无线通信技术,允许设备在彼此靠近时(通常为 4 厘米以内)进行数据交换。Android 设备支持 NFC 功能,开发者可以利用它实现多种应用场景,例如移动支付、门禁系统、数据传输等。

NFC 技术基于 RFID(射频识别)技术,具有低功耗、快速连接和安全性高的特点。在 Android 中,NFC 通常用于以下场景:

  • 读取 NFC 标签中的数据。
  • 与其他支持 NFC 的设备进行数据交换。
  • 实现基于 NFC 的支付功能(如 Google Pay)。

本文将逐步介绍如何在 Android 应用中使用 NFC 技术,并提供代码示例和实际案例。


NFC 的工作原理

NFC 通信基于两种模式:

  1. 主动模式:两个设备都可以发送和接收数据。
  2. 被动模式:一个设备主动发送数据,另一个设备被动接收数据(例如 NFC 标签)。

NFC 支持三种数据传输模式:

  • 读/写模式:设备可以读取或写入 NFC 标签中的数据。
  • 点对点模式:两个设备可以直接交换数据。
  • 卡模拟模式:设备可以模拟一张 NFC 卡(如支付卡)。

在 Android 中使用 NFC

1. 配置权限

首先,在 AndroidManifest.xml 中添加 NFC 权限:

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

2. 检查 NFC 支持

在代码中检查设备是否支持 NFC:

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

3. 处理 NFC 标签

当设备检测到 NFC 标签时,系统会发送一个 ACTION_NDEF_DISCOVEREDACTION_TAG_DISCOVERED 的 Intent。我们可以通过以下代码处理这些 Intent:

java
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
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];
}
// 处理 NFC 数据
processNdefMessages(messages);
}
}
}

private void processNdefMessages(NdefMessage[] messages) {
for (NdefMessage message : messages) {
for (NdefRecord record : message.getRecords()) {
String payload = new String(record.getPayload());
Log.d("NFC", "读取到的数据: " + payload);
}
}
}

4. 写入 NFC 标签

要向 NFC 标签写入数据,可以使用以下代码:

java
NdefRecord record = NdefRecord.createTextRecord("en", "Hello, NFC!");
NdefMessage message = new NdefMessage(new NdefRecord[]{record});

nfcAdapter.setOnNdefPushCompleteCallback(new NfcAdapter.OnNdefPushCompleteCallback() {
@Override
public void onNdefPushComplete(NfcEvent event) {
runOnUiThread(() -> Toast.makeText(MainActivity.this, "数据写入成功", Toast.LENGTH_SHORT).show());
}
}, this);

nfcAdapter.setNdefPushMessage(message, this);

实际案例:读取公交卡信息

假设我们需要开发一个应用,用于读取公交卡的余额信息。以下是实现步骤:

  1. 检测 NFC 标签:当用户将公交卡靠近设备时,系统会触发 ACTION_TAG_DISCOVERED
  2. 读取数据:通过 NFC 读取公交卡的特定数据块。
  3. 解析数据:根据公交卡的协议解析余额信息。
java
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
if (tag != null) {
byte[] tagId = tag.getId();
String tagIdHex = bytesToHex(tagId);
Log.d("NFC", "标签 ID: " + tagIdHex);
// 进一步读取和解析数据
}
}
}

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

总结

NFC 是一种强大的短距离通信技术,适用于多种场景,如移动支付、数据传输和门禁系统。通过本文,您已经了解了如何在 Android 中使用 NFC 技术,包括读取和写入 NFC 标签、处理 NFC 数据以及实现实际应用。

提示

在实际开发中,请确保设备支持 NFC 功能,并遵循相关安全规范,尤其是在处理敏感数据时。


附加资源


练习

  1. 编写一个应用,读取 NFC 标签中的文本数据并显示在屏幕上。
  2. 尝试实现两个 Android 设备之间的 NFC 数据交换。
  3. 研究如何模拟 NFC 卡,并尝试实现一个简单的支付功能。