Android NFC功能开发指南

发布于:2025-02-26 ⋅ 阅读:(191) ⋅ 点赞:(0)

在 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 功能。根据具体需求,你可能需要进一步扩展和优化代码。


网站公告

今日签到

点亮在社区的每一天
去签到