如何在 Android 中正确扫描 NFC Type V(NFC-V)标签

花韻仙語

花韻仙語

2026-07-27

470人浏览

原创

如何在 Android 中正确扫描 NFC Type V(NFC-V)标签

本文详解 Android 应用中扫描 NFC-V 标签的完整实现,重点解决 onNewIntent() 中 intent.getAction() 为 null 的常见问题,涵盖 PendingIntent 权限配置、enableReaderMode 替代方案及 NfcV 技术适配要点。

本文详解 android 应用中扫描 nfc-v 标签的完整实现,重点解决 `onnewintent()` 中 `intent.getaction()` 为 null 的常见问题,涵盖 `pendingintent` 权限配置、`enablereadermode` 替代方案及 nfcv 技术适配要点。

在 Android 开发中,扫描 NFC-V(ISO/IEC 15693)标签需特别注意技术适配与生命周期管理。你遇到的 intent.getAction() 返回 null,根本原因在于 enableForegroundDispatch 配置不完整:虽然 AndroidManifest.xml 声明了 TECH_DISCOVERED intent-filter,但 enableForegroundDispatch() 的第三个参数(intentFilters)传入了 null,导致系统无法匹配并填充 Intent Action;同时第四个参数(techLists)也未指定支持的 NFC 技术栈,NFC-V 标签因此被忽略。

✅ 正确配置 Foreground Dispatch(兼容旧 API)

若仍需使用 enableForegroundDispatch,请修正 onResume() 中的调用:

@Override
protected void onResume() {
    super.onResume();
    if (nfcAdapter != null && nfcAdapter.isEnabled()) {
        Intent intent = new Intent(this, MainActivity.class)
                .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(
                this, 0, intent,
                PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_IMMUTABLE); // ⚠️ 必须含 FLAG_MUTABLE(Android 12+)

        // ✅ 显式声明 intent filter:匹配 TECH_DISCOVERED
        IntentFilter techFilter = new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED);
        IntentFilter[] filters = new IntentFilter[]{techFilter};

        // ✅ 显式声明支持的 NFC 技术:必须包含 NfcV.class
        String[][] techLists = new String[][]{
                new String[]{NfcV.class.getName()}
        };

        nfcAdapter.enableForegroundDispatch(this, pendingIntent, filters, techLists);
    }
}

? 注意事项:

Android开发教程与笔记pdf版
Android开发教程与笔记pdf版

Android文件存取与数据库编程知识,文件操作主要是读文件、写文件、读取静态文件等,同时还介绍了创建添加文件内容并保存,打开文件并显示内容;数据库编程方面主要介绍了SQLite数据库的使用、包括创建、删除、打开数据库、非查询SQL操作指令、查询SQL指令-游标Cursors等知识。

下载
  • PendingIntent.FLAG_MUTABLE 是 Android 12(API 31+)强制要求——NFC 系统服务需向该 PendingIntent 注入 EXTRA_TAG 和 ACTION 字段,不可变 PendingIntent 会静默失败;
  • filters 和 techLists 均不可为 null,否则前台分发机制无法识别 NFC-V 标签;
  • onNewIntent() 中务必用 NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction()) 安全判空,避免 NullPointerException。

✅ 推荐方案:使用 enableReaderMode(现代、可靠、线程安全)

enableReaderMode 是 Google 推荐的 NFC 新 API,规避了 Intent 分发的复杂性,直接在主线程回调中获取 Tag 对象,并天然支持后台线程操作(如读写),显著提升稳定性:

public class MainActivity extends AppCompatActivity implements NfcAdapter.ReaderCallback {

    private NfcAdapter nfcAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        nfcAdapter = NfcAdapter.getDefaultAdapter(this);
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (nfcAdapter != null && nfcAdapter.isEnabled()) {
            nfcAdapter.enableReaderMode(
                    this,
                    this, // ReaderCallback 实例
                    NfcAdapter.FLAG_READER_NFC_V // 仅监听 NFC-V 标签
                            | NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK
                            | NfcAdapter.FLAG_READER_NO_PLATFORM_SOUNDS,
                    null
            );
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (nfcAdapter != null) {
            nfcAdapter.disableReaderMode(this);
        }
    }

    @Override
    public void onTagDiscovered(Tag tag) {
        // ✅ 直接获得非空 Tag 对象,无需解析 Intent
        Log.d("NFC", "NFC-V tag discovered: " + Arrays.toString(tag.getId()));

        // 尝试获取 NfcV 实例
        NfcV nfcv = NfcV.get(tag);
        if (nfcv != null) {
            try {
                nfcv.connect();
                // 示例:读取标签系统信息(UID)
                byte[] response = nfcv.transceive(new byte[]{
                        0x20, // Inventory command
                        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
                });
                Toast.makeText(this, "NFC-V tag connected", Toast.LENGTH_SHORT).show();
            } catch (IOException e) {
                Log.e("NFC", "NFC-V operation failed", e);
                Toast.makeText(this, "Tag operation failed", Toast.LENGTH_SHORT).show();
            } finally {
                try { nfcv.close(); } catch (IOException ignored) {}
            }
        }
    }
}

? 关键总结

  • 权限与声明:AndroidManifest.xml 中 缺一不可;
  • 技术匹配:NFC-V 标签必须通过 NfcV.class.getName() 或 FLAG_READER_NFC_V 显式声明,否则无法触发回调;
  • API 选择:优先采用 enableReaderMode —— 无 Intent 陷阱、线程可控、错误处理清晰、兼容 Android 4.4+;
  • 设备要求:确保测试机支持 NFC-V(部分低端机型仅支持 NFC-A/NFC-B),可使用 NFC Tools 验证标签类型。

通过以上任一方案,你均可稳定获取 NfcV 实例并执行后续操作(如读取块数据、写入、防冲突等),彻底解决 intent.getAction() == null 的核心问题。

相关专题

更多
android开发三大框架
android开发三大框架

android开发三大框架是XUtil框架、volley框架、ImageLoader框架。本专题为大家提供android开发三大框架相关的各种文章、以及下载和课程。

2023.08.14

753

4

android是什么系统
android是什么系统

Android是一种功能强大、灵活可定制、应用丰富、多任务处理能力强、兼容性好、网络连接能力强的操作系统。本专题为大家提供android相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.22

2058

5

android权限限制怎么解开
android权限限制怎么解开

android权限限制可以使用Root权限、第三方权限管理应用程序、ADB命令和Xposed框架解开。详细介绍:1、Root权限,通过获取Root权限,用户可以解锁所有权限,并对系统进行自定义和修改;2、第三方权限管理应用程序,用户可以轻松地控制和管理应用程序的权限;3、ADB命令,用户可以在设备上执行各种操作,包括解锁权限;4、Xposed框架,用户可以在不修改系统文件的情况下修改应用程序的行为和权限。

2023.09.19

3297

7

android重启应用的方法有哪些
android重启应用的方法有哪些

android重启应用有通过Intent、PendingIntent、系统服务、Runtime等方法。本专题为大家提供Android相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

382

5

Android语音播放功能实现方法
Android语音播放功能实现方法

实现方法有使用MediaPlayer实现、使用SoundPool实现两种。可以根据具体的需求选择适合的方法进行实现。想了解更多语音播放的相关内容,可以阅读本专题下面的文章。

2024.03.01

718

5

墨刀AI提示词教学
墨刀AI提示词教学

本合集由PHP中文网精心整理,为您提供全面的墨刀AI提示词教学。内容涵盖高质量原型撰写公式与实操窍门,助您轻松掌握AI设计工具。无论是零基础入门还是进阶技巧,都能让您快速上手,大幅提升产品设计与协作效率。

2026.08.04

8

21

墨刀AI完整入门
墨刀AI完整入门

PHP中文网为您倾力打造墨刀AI保姆级入门指南完整版!本合集从零基础讲起,涵盖AI生成原型、提示词优化、图片转原型及多轮对话等核心功能。无论您是新手还是进阶用户,都能轻松掌握产品设计全流程。快来PHP中文网,一键解锁高效设计技巧,让想法即刻成型!

2026.08.04

5

20

墨刀AI进阶技巧
墨刀AI进阶技巧

本合集由PHP中文网精心整理,为您提供墨刀AI核心进阶策略指南。内容涵盖高效提示词写作、原型智能生成与微调、结构化导图制作及行业分析报告输出等实战技巧。助您轻松掌握AI设计工具,大幅提升产品设计与团队协作效率。

2026.08.04

7

14

火山引擎实名认证失败怎么办
火山引擎实名认证失败怎么办

火山引擎实名认证失败可能与证件信息填写错误、姓名或企业信息不一致、证件照片不清晰、营业执照状态异常、手机号验证失败或审核资料不完整有关。本专题整理个人认证、企业认证、资料上传、审核退回、重新提交和认证不通过的常见处理方法。

2026.08.04

4

10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 39.5万人学习

Java 教程
Java 教程

共578课时 | 172万人学习

Uniapp从零开始实现新闻资讯应用
Uniapp从零开始实现新闻资讯应用

共64课时 | 8.6万人学习