You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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中添加技术过滤配置:

  1. 在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>
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 17:57:48