Android NFC功能开发指南

news/2025/2/26 17:48:35

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


http://www.niftyadmin.cn/n/5869013.html

相关文章

数据分析七大步骤

在工作中&#xff0c;我们可能都遭遇过面对一堆数据&#xff0c;费尽心思进行分析&#xff0c;结果却惨不忍睹&#xff0c;仿佛“一顿操作猛如虎&#xff0c;一看结果0:5”。更糟糕的是&#xff0c;有时我们甚至完全找不到数据分析的头绪。 别急&#xff0c;朋友们&#xff01…

Docker小游戏 | 使用Docker部署star-battle太空飞船射击小游戏

Docker小游戏 | 使用Docker部署star-battle太空飞船射击小游戏 前言项目介绍项目简介项目预览二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署star-battle网页小游戏下载镜像创建容器检查容器状态检查服务端口安全设置四、访问star-battle网页小游戏五、总…

Python游戏编程之赛车游戏6-1

通过Python的pygame模块可以实现赛车游戏&#xff0c;如图1所示。 图1 赛车游戏 从图1中可以看出&#xff0c;玩家通过键盘的左右键操作蓝色汽车躲避红色汽车的撞击&#xff0c;每成功躲避过一辆红色汽车&#xff0c;则玩家得一分。当蓝色汽车被红色汽车撞击后&#xff0c;游戏…

es-head(es库-谷歌浏览器插件)

1.下载es-head插件压缩包&#xff0c;并解压缩 2.谷歌浏览器添加插件 3.使用

SV基础(二):数据类型

文章目录 **1. Verilog 的 4 值数据类型****硬件建模的必要性****2. Testbench 中的问题****Verilog 的局限性****3. SystemVerilog 的 2 值数据类型****示例:明确的 2 值操作****4. 何时使用 2 值 vs 4 值****5. 关键优势****6. 注意事项**7. 有符号数与无符号数详解**无符号…

PostgreSQL的学习心得和知识总结(一百七十)|深入理解PostgreSQL数据库之 处理HAVING子句 的使用和实现

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

【Linux】Ubuntu服务器的安装和配置管理

ℹ️大家好&#xff0c;我是练小杰&#xff0c;今天周二了&#xff0c;哪吒的票房已经到了138亿了&#xff0c;饺子导演好样的&#xff01;&#xff01;每个人的成功都不是必然的&#xff0c;坚信自己现在做的事是可以的&#xff01;&#xff01;&#x1f606; 本文是有关Ubunt…

批量将gitlab仓库转移到gitea中

前言 单位有一个机器&#xff0c;机器里是个vm esxi里面跑着一个虚拟机里面跑着一个gitlab&#xff0c;经历了岁月变迁&#xff0c;网改了一遍&#xff0c;办公室改了一遍&#xff0c;机器折腾来折腾去&#xff0c;可能闪到腰了吧&#xff0c;gitlab总是访问不到&#xff0c;寻…