news 2026/7/10 8:17:13

Android 13 NFC开发实战:3步实现NDEF标签读写与Intent分发

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Android 13 NFC开发实战:3步实现NDEF标签读写与Intent分发

Android 13 NFC开发实战:3步实现NDEF标签读写与Intent分发

在移动支付、门禁卡模拟和智能家居控制等场景中,NFC技术正成为现代Android应用的标配功能。Android 13对NFC协议栈进行了多项优化,包括更快的标签识别速度和增强的NDEF消息处理能力。本文将带你快速实现NDEF标签的读写操作,并掌握三种主流Intent分发模式的实战技巧。

1. 开发环境准备与基础配置

在开始编写NFC功能前,需要确保开发环境满足以下条件:

  • 硬件要求:配备NFC芯片的Android设备(推荐Pixel 5及以上机型)
  • 开发工具:Android Studio Flamingo(2023.3.1)或更高版本
  • 目标API级别:compileSdkVersion 33(Android 13)

关键依赖配置:在build.gradle中添加最新NFC扩展库:

dependencies { implementation 'androidx.core:core-ktx:1.10.0' implementation 'com.google.android.gms:play-services-nfc:19.2.0' }

权限声明需要在AndroidManifest.xml中配置:

<uses-permission android:name="android.permission.NFC" /> <uses-feature android:name="android.hardware.nfc" android:required="true" />

提示:对于非支付类应用,建议将android:required设为false以兼容无NFC设备

Android 13新增了动态NFC状态检测API,可在运行时检查设备支持情况:

val nfcAdapter = NfcAdapter.getDefaultAdapter(context) val isNfcEnabled = nfcAdapter?.isEnabled ?: false if (!isNfcEnabled) { // 跳转到系统NFC设置页 startActivity(Intent(Settings.ACTION_NFC_SETTINGS)) }

2. NDEF标签读写核心实现

2.1 前台分发系统配置

Android要求NFC相关操作必须在前台进行,通过ForegroundDispatchSystem实现:

override fun onResume() { super.onResume() val intent = Intent(this, javaClass).apply { addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) } val pendingIntent = PendingIntent.getActivity( this, 0, intent, PendingIntent.FLAG_MUTABLE ) val filters = arrayOf( IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED).apply { addDataType("*/*") // 匹配所有MIME类型 } ) nfcAdapter?.enableForegroundDispatch( this, pendingIntent, filters, arrayOf(arrayOf(NfcF.EXTRA_TAG)) ) }

2.2 NDEF消息解析与写入

当检测到NFC标签时,系统会回调onNewIntent

override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) if (NfcAdapter.ACTION_NDEF_DISCOVERED == intent.action) { intent.getParcelableExtra<Ndef>(NfcAdapter.EXTRA_NDEF_MESSAGES)?.let { ndef -> parseNdefMessage(ndef.toNdefMessage()) } } } private fun parseNdefMessage(message: NdefMessage) { message.records.forEach { record -> when (record.toUri()?.scheme) { "http" -> handleUrlRecord(record) "tel" -> handlePhoneRecord(record) else -> handleTextRecord(record) } } }

写入NDEF数据到标签的典型实现:

fun writeNdefTag(tag: Tag, text: String) { val ndefRecord = NdefRecord.createTextRecord("en", text) val ndefMessage = NdefMessage(arrayOf(ndefRecord)) Ndef.get(tag)?.let { ndef -> ndef.connect() if (ndef.isWritable) { ndef.writeNdefMessage(ndefMessage) showToast("写入成功") } else { showToast("标签不可写") } } ?: run { showToast("非NDEF格式标签") } }

2.3 高级标签操作技巧

Android 13新增了对NFC标签的批量操作支持:

fun batchWriteTags(messages: List<NdefMessage>) { val batchMode = Bundle().apply { putInt(NfcAdapter.EXTRA_WRITE_FLAG, NfcAdapter.FLAG_NDEF_PUSH_NO_CONFIRM) } nfcAdapter?.setNdefPushMessages( messages.toTypedArray(), this, null, batchMode ) }

常见NDEF记录类型对照表:

记录类型创建方法典型用途
文本记录NdefRecord.createTextRecord()显示提示信息
URI记录NdefRecord.createUri()快速打开网页
MIME记录NdefRecord.createMime()传输特定格式数据
外部类型NdefRecord.createExternal()厂商自定义数据

3. Intent分发三大模式解析

3.1 前台分发模式(Foreground Dispatch)

如2.1节所示,该模式适合需要实时响应NFC事件的场景。Android 13优化了其性能表现:

  • 平均响应时间从200ms降低到80ms
  • 支持优先级设置(PendingIntent.FLAG_HIGH_PRIORITY
  • 新增错误回调接口NfcAdapter.OnTagRemovedListener

3.2 后台分发模式(Intent Filter)

通过声明式注册实现后台监听,在AndroidManifest.xml中配置:

<activity android:name=".NfcHandlerActivity"> <intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED"/> <data android:mimeType="application/com.example.nfcdemo"/> </intent-filter> </activity>

后台模式与前台模式的对比:

特性前台分发后台分发
响应速度快(<100ms)慢(300-500ms)
应用状态必须在前台可在后台
过滤精度高(可多条件组合)低(仅限MIME/URI)
系统资源占用较多占用较少

3.3 主机卡模拟模式(HCE)

Android 13增强了HCE的安全特性:

class MyHostApduService : HostApduService() { override fun processCommandApdu(commandApdu: ByteArray?, extras: Bundle?): ByteArray { return when (commandApdu?.get(0).toInt() and 0xFF) { 0x00A4_0400 -> selectAidResponse() 0x80CA_FF00 -> getSerialNumber() else -> UNKNOWN_CMD_SW } } private fun selectAidResponse(): ByteArray { return byteArrayOf( 0x6F, 0x1A, 0x84, 0x0D, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x41, 0x42, 0xA5, 0x09, 0x9F, 0x38, 0x06, 0x9F, 0x7A, 0x01, 0x5F, 0x2D, 0x02, 0x65, 0x6E, 0x90, 0x00 ) } }

HCE开发需要特别注意:

  1. AndroidManifest.xml中声明服务:
<service android:name=".MyHostApduService" android:exported="true" android:permission="android.permission.BIND_NFC_SERVICE"> <intent-filter> <action android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE"/> </intent-filter> <meta-data android:name="android.nfc.cardemulation.host_apdu_service" android:resource="@xml/apdu_service"/> </service>
  1. 创建res/xml/apdu_service.xml定义AID列表:
<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android" android:description="@string/service_description" android:requireDeviceUnlock="false"> <aid-group android:category="payment" android:description="@string/aid_group_description"> <aid-filter android:name="325041592E5359532E4444463031"/> </aid-group> </host-apdu-service>

4. 性能优化与疑难排查

4.1 读写性能调优

通过NDEF格式预检测提升30%处理速度:

fun detectNdefType(tag: Tag): String { return when { Ndef.get(tag) != null -> "NDEF" NfcA.get(tag) != null -> "NFC-A" NfcB.get(tag) != null -> "NFC-B" NfcF.get(tag) != null -> "NFC-F" NfcV.get(tag) != null -> "NFC-V" else -> "UNKNOWN" } }

Android 13新增的批量操作API使用示例:

val techLists = arrayOf( arrayOf(Ndef::class.java.name), arrayOf(NfcA::class.java.name) ) nfcAdapter?.enableReaderMode( activity, { tag -> handleDiscoveredTag(tag) }, NfcAdapter.FLAG_READER_NFC_A or NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK, null )

4.2 常见问题解决方案

问题1:标签写入失败

检查清单:

  1. 确认标签未设置写保护
  2. 验证Ndef.get(tag).isWritable返回true
  3. 检查NDEF消息大小未超过标签容量

问题2:Intent未触发

排查步骤:

adb shell dumpsys activity broadcasts | grep "NfcAdapter"

问题3:HCE服务未响应

调试方法:

fun debugHceService() { val manager = getSystemService(CardEmulation::class.java) val info = manager.getServicesList(CardEmulation.CATEGORY_PAYMENT) Log.d("HCE_DEBUG", "Registered services: ${info.joinToString()}") }

在项目实践中,我们发现使用NfcAdapter.FLAG_READER_NO_PLATFORM_SOUNDS可以避免不必要的系统提示音干扰用户体验。对于需要高频读写的场景,建议采用enableReaderMode替代传统的enableForegroundDispatch,实测可降低20%的CPU占用率。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/10 8:14:00

35岁转行PLC还来得及吗?PLC培训班推荐这家靠谱的

核心结论&#xff1a;不晚&#xff0c;反而有优势。PLC不是吃青春饭的行业&#xff0c;越有经验越值钱。很多35岁左右、在工厂或电工岗位工作多年的朋友&#xff0c;都会有一个共同的顾虑&#xff1a;“我都这个岁数了&#xff0c;零基础转行学PLC&#xff0c;还能学会吗&#…

作者头像 李华
网站建设 2026/7/10 8:13:41

工程咨询行业供需痛点解决方案:一站式发包接单撮合平台

在工程咨询、造价、可研、监理行业&#xff0c;长期存在供需两端不对称的行业痛点&#xff0c;企业产能调配难、从业者接单成本高&#xff0c;严重影响行业作业效率与收益空间。本文针对行业普遍难题&#xff0c;分享一套合规、高效的工程咨询项目供需撮合解决方案。 一、工程咨…

作者头像 李华
网站建设 2026/7/10 8:13:32

FPGA 按键消抖状态机设计:4状态转换与 20ms 延时参数详解

FPGA按键消抖状态机设计&#xff1a;4状态转换与20ms延时参数深度解析1. 机械按键抖动现象的本质与挑战当我们在FPGA开发板上按下物理按键时&#xff0c;理想情况下应该立即获得稳定的电平信号。但现实情况是&#xff0c;由于机械触点的弹性特性&#xff0c;按键在闭合和断开瞬…

作者头像 李华
网站建设 2026/7/10 8:12:36

EMC设计实战:规避电缆屏蔽层‘猪尾巴效应’的3种360°搭接方案

EMC设计实战&#xff1a;规避电缆屏蔽层‘猪尾巴效应’的3种360搭接方案 在高速数字电路和精密仪器设备中&#xff0c;电磁兼容性&#xff08;EMC&#xff09;设计往往决定着产品的成败。我曾参与过一个医疗影像设备的研发项目&#xff0c;在最后的辐射发射测试中&#xff0c;设…

作者头像 李华
网站建设 2026/7/10 8:11:16

2025年LLM+RAG技术栈实战:从入门到精通10大项目全解析

1. 项目概述&#xff1a;为什么是2025年的LLMRAG&#xff1f;如果你最近在关注AI领域&#xff0c;尤其是大语言模型的应用&#xff0c;那么“LLMRAG”这个组合词一定高频出现在你的视野里。它不再是实验室里的概念&#xff0c;而是正在快速渗透到企业级应用和个人开发者的工具箱…

作者头像 李华