nfc 安卓开发

NFC(Near Field Communication)是一种短距离无线通信技术,最初用于支付业务,现在已广泛应用于智能门锁、智能家居等场景。Android提供了NFC API,开发者能够很方便地在Android设备上进行NFC功能的开发。

## 基础知识

### 标签类型

NFC标签有多种类型,常见的有Mifare Classic 1K、Mifare Ultralight、NDEF、Felica等。其中,Mifare Classic 1K和Mifare Ultralight的写入操作要求特定密码验证,具有一定的安全性。

### 射频场

NFC技术使用13.56MHz频率进行通信。NFC设备能够为周围5厘米内的另一NFC设备建立射频场,射频场是一种能够传输数据的空间。当两个设备的射频场相接触时,它们就可以通过NFC技术进行通信。

### NDEF

NDEF(NFC Data Exchange Format)是一种标准的数据交换格式,是NFC设备之间交换数据的基础。NDEF消息包含一个或多个NDEF记录,每个记录可包含一些元数据和有效负载。NDEF记录有多种类型,比如文本类型、URI类型等。

## NFC编程

### 检测NFC

要使应用程序与NFC交互,必须先将应用程序注册为NFC Android配置文件。在AndroidManifest.xml文件中添加NFC配置,如下所示:

```xml

android:name="android.hardware.nfc"

android:required="true" />

android:name="android.permission.NFC" />

```

此外,还需要在Activity中通过调用以下代码启用前台调度模式,以便在未锁定屏幕的情况下以最佳方式处理NFC标签:

```java

@Override

protected void onResume() {

super.onResume();

if (NfcAdapter.getDefaultAdapter(this) != null) {

NfcAdapter.getDefaultAdapter(this).enableForegroundDispatch(this, pendingIntent, null, null);

}

}

```

### 读取标签

在前台调度模式下,当用户将NFC标签靠近设备时,系统将自动调用Activity的onNewIntent()方法。在该方法中,您可以检查传入的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];

}

// TODO: 根据业务需求处理messages数据

}

}

}

```

此方法接收一个Intent对象作为参数,该Intent对象包含要处理的标签信息。如果Action等于ACTION_NDEF_DISCOVERED,则表示检测到了一个NDEF标签。EXTRA_NDEF_MESSAGES是一个数组,其中包含从标签读取的NDEF消息。

可以通过以下代码检查标签是否支持NDEF:

```java

if (techList != null) {

for (String tech : techList) {

if (tech.equals(Ndef.class.getName())) {

return true;

}

}

}

```

如果返回true,则表示该标签基于NDEF协议。

### 写入标签

要写入NFC标签,必须先将数据封装为NDEF消息。例如,以下代码使用NdefRecord和NdefMessage API创建带有文本记录的NDEF消息:

```java

NdefRecord record = NdefRecord.createTextRecord(Locale.getDefault().getLanguage(), "Hello world");

NdefMessage message = new NdefMessage(new NdefRecord[] {record});

```

调用以下代码写入NDEF消息到NFC标签:

```java

Tag tag;

Ndef ndef = Ndef.get(tag);

try {

ndef.connect();

ndef.writeNdefMessage(message);

} catch (IOException | FormatException e) {

e.printStackTrace();

} finally {

try {

ndef.close();

} catch (IOException e) {

e.printStackTrace();

}

}

```

此示例将消息写入连接的NFC标签。

## 结论

NFC技术的应用已经非常普及,而且在未来还将继续得到广泛发展。在应用中集成NFC功能可以为用户提供更多便利性和体验。Android提供了完善的NFC API,开发者能够利用这些API进行NFC功能的开发。本文简要介绍了NFC技术的相关知识,并提供了一些示例代码,希望对您理解和应用NFC技术有所帮助。

川公网安备 51019002001728号