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

扫描NFC标签时NDEF_DISCOVERED动作未触发onNewIntent()回调

问题原因

从日志可见,触发的是携带dat=https://sdm.nfcdeveloper.com/...的NDEF_DISCOVERED Intent,说明你的NFC标签是URI类型的NDEF记录,但当前过滤规则仅配置了MIME类型匹配(*/*),和系统发出的Intent不匹配,导致系统无法直接路由到你的应用,弹出了应用选择对话框。

解决步骤

1. 修正Manifest的Intent Filter

针对URI类型的NDEF记录,添加对应的<data>匹配规则,可选择匹配指定域名或整个HTTPS scheme:

<!-- 匹配URI类型的NDEF记录 -->
<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
    <!-- 匹配指定域名的HTTPS URI -->
    <data android:scheme="https" android:host="sdm.nfcdeveloper.com" />
    <!-- 可选:若需匹配所有HTTPS URI,仅保留scheme即可 -->
    <!-- <data android:scheme="https" /> -->
</intent-filter>

<!-- 保留TAG_DISCOVERED作为兜底规则,单独放在一个intent-filter中 -->
<intent-filter>
    <action android:name="android.nfc.action.TAG_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

注意:不要将NDEF_DISCOVERED和TAG_DISCOVERED放在同一个intent-filter内,否则会降低NDEF_DISCOVERED的匹配优先级。

2. 修正ForegroundDispatch的IntentFilter

同样需要添加URI匹配规则,替换原有的MIME类型过滤逻辑:

private fun enableForegroundMode() {
    val filters = arrayOfNulls<IntentFilter>(1)
    val techList = arrayOf<Array<String>>()

    filters[0] = IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED).apply {
        addCategory(Intent.CATEGORY_DEFAULT)
        // 匹配指定域名的HTTPS URI
        addDataScheme("https")
        addDataHost("sdm.nfcdeveloper.com")
        // 可选:匹配所有HTTPS URI
        // addDataScheme("https")
    }

    mPendingIntent = PendingIntent.getActivity(
        this, 0, 
        Intent(this, javaClass).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 
        FLAG_IMMUTABLE
    )
    mAdapter.enableForegroundDispatch(this, mPendingIntent, filters, techList)
}

3. 关键注意事项

  • 确保enableForegroundDispatch在onResume()中调用,disableForegroundDispatch在onPause()中调用,避免后台状态下仍占用NFC资源:
    override fun onResume() {
        super.onResume()
        mAdapter?.let { enableForegroundMode() }
    }
    
    override fun onPause() {
        super.onPause()
        mAdapter?.disableForegroundDispatch(this)
    }
    
  • 若标签包含多种类型的NDEF记录,可以添加多个IntentFilter分别匹配不同类型(如MIME类型+URI类型)。

内容的提问来源于stack exchange,提问作者Shahal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 15:15:57