Android 11升级至12后NFC Tap&Pay功能失效排查求助
问题排查与解决方案
1. 扩展Intent Action的处理范围
你的onNewIntent方法仅判断了NfcAdapter.ACTION_NDEF_DISCOVERED,但NFC标签触发的Action不止这一种:
NfcAdapter.ACTION_NDEF_DISCOVERED(仅含NDEF数据的标签)NfcAdapter.ACTION_TECH_DISCOVERED(含特定NFC技术的标签)NfcAdapter.ACTION_TAG_DISCOVERED(未匹配前两种的通用标签)
设备震动说明系统已检测到标签,但代码未处理非NDEF类型的触发逻辑,导致无后续反应。修改onNewIntent:
override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) when(intent.action) { NfcAdapter.ACTION_NDEF_DISCOVERED, NfcAdapter.ACTION_TECH_DISCOVERED, NfcAdapter.ACTION_TAG_DISCOVERED -> { val tagId = NfcUtil.getSuperTagId(intent) val rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES) val tagData = if (rawMsgs != null) NfcUtil.getSuperTagData(rawMsgs) else null onTagTapped(tagId, tagData) } } }
2. 检查Foreground Dispatch的Intent过滤器
确保NfcUtil.getIntentFilters(environment)返回的过滤器数组覆盖上述三种Action,若该方法仅配置了NDEF_DISCOVERED,需补充其他Action的过滤器:
示例(可在getIntentFilters中添加):
fun getIntentFilters(environment: String): Array<IntentFilter> { val ndefFilter = IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED).apply { try { addDataType("text/plain") // 匹配Manifest中的MIME类型 } catch (e: MalformedMimeTypeException) { throw RuntimeException("Invalid MIME type", e) } } val techFilter = IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED) val tagFilter = IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED) return arrayOf(ndefFilter, techFilter, tagFilter) }
3. 验证PendingIntent的兼容性
Android 12(SDK31)要求PendingIntent必须明确指定FLAG_IMMUTABLE或FLAG_MUTABLE。你当前使用的FLAG_IMMUTABLE适用于无需动态修改Intent内容的场景;若后续需要修改Intent参数,需改为FLAG_MUTABLE。
同时确认Intent.FLAG_ACTIVITY_SINGLE_TOP已添加,确保触发时回到当前Activity实例。
4. 补充TECH_DISCOVERED配置(可选)
若你的标签属于特定NFC技术类型(如Mifare Classic),需在Manifest中添加技术过滤配置:
- 在
res/xml目录下创建nfc_tech_filter.xml:
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <tech-list> <tech>android.nfc.tech.NfcA</tech> <tech>android.nfc.tech.NfcB</tech> <tech>android.nfc.tech.NfcF</tech> <!-- 添加你的标签支持的NFC技术 --> </tech-list> </resources>
- 在Manifest的Activity标签中添加:
<meta-data android:name="android.nfc.action.TECH_DISCOVERED" android:resource="@xml/nfc_tech_filter" />
5. 确认标签类型
检查你的NFC标签是否包含NDEF数据:若标签为空白或仅含非NDEF技术数据,Android 12的调度逻辑更严格,需确保代码覆盖对应的触发Action。
内容的提问来源于stack exchange,提问作者Shruti
相关产品推荐
相关产品推荐

