扫描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
相关产品推荐
相关产品推荐

