1. Android NFC开发入门:从零开始的环境配置
如果你刚接触Android NFC开发,可能会觉得各种协议和技术名词有点吓人。别担心,我刚开始接触NFC时也是一头雾水,但实际用起来就会发现它并没有想象中那么复杂。NFC(近场通信)技术让手机能够与标签、卡片或其他设备在近距离内进行数据交换,这在门禁系统、移动支付、智能海报等场景中非常实用。
在开始编码之前,我们需要先检查设备是否支持NFC功能。这个步骤很关键,因为不是所有Android设备都具备NFC硬件。我记得第一次测试时忘了做这个检查,结果在模拟器上调试了半天都没反应,后来才发现问题所在。通过NfcAdapter.getDefaultAdapter()方法可以获取设备的NFC适配器,如果返回null就说明设备不支持NFC。
接下来需要在AndroidManifest.xml中声明NFC权限。这里有个小细节需要注意:除了添加<uses-permission android:name="android.permission.NFC" />权限外,还需要在配置文件中指定支持的NFC技术类型。我一般会在res目录下创建xml文件夹,然后新建一个nfc_tech_filter.xml文件,里面列出应用需要处理的所有NFC协议类型。
<!-- res/xml/nfc_tech_filter.xml -->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<tech-list>
<tech>android.nfc.tech.Ndef</tech>
</tech-list>
<tech-list>
<tech>android.nfc.tech.NfcA</tech>
</tech-list>
<tech-list>
<tech>android.nfc.tech.NfcB</tech>
</tech-list>
<tech-list>
<tech>android.nfc.tech.NfcF</tech>
</tech-list>
<tech-list>
<tech>android.nfc.tech.NfcV</tech>
</tech-list>
</resources>
这样配置后,当设备检测到符合这些技术类型的NFC标签时,就会自动唤醒我们的应用。还有一个容易忽略的点是Activity的启动模式设置,需要将处理NFC的Activity的launchMode设置为singleTop,这样可以避免每次扫描标签时都创建新的Activity实例。
2. 深入理解NFC协议类型与技术特点
NFC技术包含多种协议类型,每种类型都有其特定的应用场景和技术特点。理解这些差异对于选择合适的技术方案至关重要。我在实际项目中接触过各种NFC标签,发现不同协议的兼容性和性能特点确实有很大差异。
Ndef(NFC Data Exchange Format) 是最常用的协议类型,它定义了一种标准的数据交换格式。Ndef消息可以包含多种类型的记录,如文本、URI、智能海报等。这种协议的优点是通用性强,几乎所有支持NFC的设备都能读取Ndef格式的数据。我经常用它来存储简单的配置信息或链接。
NfcA(ISO14443-3A) 基于ISO14443 Type A标准,常见于Mifare Classic和Mifare Ultralight标签。这种协议在门禁系统和交通卡中应用广泛,读写速度较快,但存储容量一般较小。我记得有一次做门禁项目时,就是使用NfcA协议与Mifare Classic卡片进行通信。
NfcB(ISO14443-3B) 同样基于ISO14443标准,但使用Type B协议。它在国内身份证和部分学生证中有应用,安全性相对较高,但兼容性不如NfcA。
NfcF(FeliCa) 是索尼开发的协议标准,在日本市场很常见。它的通信速度较快,支持加密功能。我在一个日本客户的项目中接触过这种协议,需要特别注意设备兼容性问题。
NfcV(ISO15693) 适用于远距离读取场景,读取距离可达1米左右。这种协议在物流管理和资产跟踪中很实用,但数据传输速率较低。
在实际开发中,我建议先明确应用场景需求,再选择合适的协议类型。如果只是简单的数据存储和读取,Ndef是最安全的选择;如果需要与现有卡片系统兼容,就要根据卡片类型选择对应的协议。
3. 实战NFC数据读取与处理
现在让我们进入最实用的部分:如何读取和处理NFC标签数据。这个过程就像是在解谜,每个标签都藏着不同的信息,我们需要用正确的方式去解读它们。
首先需要在Activity中初始化NFC适配器,并设置PendingIntent。这个Intent会在检测到NFC标签时被触发,相当于给系统一个回调通知。我通常会在onCreate和onResume方法中都进行初始化,确保NFC功能在Activity可见时处于活跃状态。
private NfcAdapter nfcAdapter;
private PendingIntent pendingIntent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
nfcAdapter = NfcAdapter.getDefaultAdapter(this);
if (nfcAdapter == null) {
Toast.makeText(this, "设备不支持NFC", Toast.LENGTH_SHORT).show();
finish();
return;
}
pendingIntent = PendingIntent.getActivity(
this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
}
@Override
protected void onResume() {
super.onResume();
if (nfcAdapter != null) {
nfcAdapter.enableForegroundDispatch(this, pendingIntent, null, null);
}
}
@Override
protected void onPause() {
super.onPause();
if (nfcAdapter != null) {
nfcAdapter.disableForegroundDispatch(this);
}
}
当检测到NFC标签时,系统会调用onNewInte


44

被折叠的 条评论
为什么被折叠?



