在 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-dataandroid: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;@Overrideprotected 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) {// 设备不支持 NFCToast.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 功能。根据具体需求,你可能需要进一步扩展和优化代码。