在 Android 平台上开发 NFC(近场通信)功能,主要涉及以下几个步骤:
1. 权限声明
首先,在 AndroidManifest.xml
文件中声明 NFC 权限:
<uses-permission android:name="android.permission.NFC" />
运行 HTML
如果你的应用需要在前台处理 NFC 事件,还需要声明以下权限:
<uses-feature android:name="android.hardware.nfc" android:required="true" />
运行 HTML
2. 配置 AndroidManifest.xml
在 AndroidManifest.xml
中配置 activity
,使其能够处理 NFC 事件:
<activity android:name=".YourActivity"> <intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> <intent-filter> <action android:name="android.nfc.action.TECH_DISCOVERED" /> </intent-filter> <meta-data android:name="android.nfc.action.TECH_DISCOVERED" android:resource="@xml/nfc_tech_filter" /> </activity>
运行 HTML
3. 创建 NFC 技术过滤文件
在 res/xml
目录下创建一个 XML 文件(例如 nfc_tech_filter.xml
),用于指定支持的 NFC 技术:
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <tech-list> <tech>android.nfc.tech.Ndef</tech> </tech-list> </resources>
运行 HTML
4. 初始化 NFC 适配器
在你的 Activity 中初始化 NFC 适配器:
import android.nfc.NfcAdapter; import android.nfc.NfcManager; import android.content.Context; public class YourActivity extends AppCompatActivity { private NfcAdapter nfcAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); NfcManager manager = (NfcManager) getSystemService(Context.NFC_SERVICE); nfcAdapter = manager.getDefaultAdapter(); if (nfcAdapter == null) { // 设备不支持 NFC Toast.makeText(this, "设备不支持 NFC", Toast.LENGTH_SHORT).show(); finish(); } } }
5. 处理 NFC 事件
在 onNewIntent
方法中处理 NFC 事件:
@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]; } // 处理 NDEF 消息 processNdefMessages(messages); } } } private void processNdefMessages(NdefMessage[] messages) { for (NdefMessage message : messages) { for (NdefRecord record : message.getRecords()) { if (record.getTnf() == NdefRecord.TNF_WELL_KNOWN && Arrays.equals(record.getType(), NdefRecord.RTD_TEXT)) { // 处理文本记录 String text = new String(record.getPayload()); Toast.makeText(this, "NFC 数据: " + text, Toast.LENGTH_SHORT).show(); } } } }
6. 启用前台调度
在 onResume
和 onPause
方法中启用和禁用前台调度:
@Override protected void onResume() { super.onResume(); if (nfcAdapter != null) { PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); nfcAdapter.enableForegroundDispatch(this, pendingIntent, null, null); } } @Override protected void onPause() { super.onPause(); if (nfcAdapter != null) { nfcAdapter.disableForegroundDispatch(this); } }
7. 写入 NFC 标签
如果你想写入 NFC 标签,可以使用以下代码:
private void writeNdefTag(NdefMessage message, Tag tag) { Ndef ndef = Ndef.get(tag); if (ndef != null) { try { ndef.connect(); ndef.writeNdefMessage(message); Toast.makeText(this, "写入成功", Toast.LENGTH_SHORT).show(); } catch (IOException | FormatException e) { e.printStackTrace(); Toast.makeText(this, "写入失败", Toast.LENGTH_SHORT).show(); } finally { try { ndef.close(); } catch (IOException e) { e.printStackTrace(); } } } }
8. 测试 NFC 功能
确保你的设备支持 NFC 功能,并使用 NFC 标签进行测试。
9. 处理不同 NFC 标签类型
根据不同的 NFC 标签类型(如 NDEF、MIFARE 等),你可能需要处理不同的技术栈。可以参考 Android 官方文档了解更多细节。
10. 参考文档
-
Android NFC 官方文档
通过以上步骤,你可以在 Android 应用中实现基本的 NFC 功能。根据具体需求,你可能需要进一步扩展和优化代码。