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技术有所帮助。