当前位置: 首页 > news >正文

Android NFC功能开发指南

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

相关文章:

  • 深度求索DeepSeek:AI大模型的全域应用与技术突破
  • 8. 示例:对32位数据总线实现位宽和值域覆盖
  • BUG: 解决新版本SpringBoot3.4.3在创建项目时勾选lombok但无法使用的问题
  • 本地部署DeepSeek R1满血版大模型
  • deepseek 70b 部署需要的配置
  • Spring Boot电影评论网站系统设计与实现
  • 【redis】数据类型之hyperloglog
  • 了解模型压缩与加速
  • 【Arxiv 大模型最新进展】北大 Parenting 方法登场:参数魔法解锁检索增强语言模型新高度!
  • leetcode_动态规划和递归 509. 斐波那契数
  • Compose 动画,让页面动起来
  • 2014年下半年试题一:论软件需求管理
  • 创建型模式 - 建造者模式 (Builder Pattern)
  • ProGuard加密混淆SpringBoot应用代码
  • RTSP中RTP/RTCP协议栈、NTP同步及QoS机制
  • hutool工具类的DateUtil和LocalDateTimeUtil
  • AMD GPU 的 Context Roll机制
  • MyBatis简明教程
  • python爬虫学习第十一篇爬取指定类型数据
  • C 语言结构体:从入门到进阶的全面解析
  • 做外贸的几个网站/百度联盟官网登录入口
  • 如何制作网站板块/哪个平台可以免费推广
  • 做网站添加支付功能要多少钱/百度的链接
  • 网站论坛怎么做 csdn/2023网站seo
  • 中小企业网络组网案例/147seo工具
  • 完整网站开发视频教程/西安seo顾问培训