You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

检测到NFC标签时显示Toast消息的实现问题

解决NFC标签检测无响应的问题

看起来你已经搭建了基础框架,但有几个关键配置和代码逻辑需要调整,才能让你的NFC检测正常工作。我帮你一步步梳理:

1. 修正Manifest的Intent Filter配置

你把启动Activity的MAIN action和NFC相关action放在同一个intent-filter里了,这会导致系统无法正确识别NFC意图。另外,TECH_DISCOVERED需要额外的meta-data指定支持的NFC技术类型。修改后的Manifest应该是这样:

<activity android:name=".MainActivity">
    <!-- 启动Activity的独立Intent Filter -->
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>

    <!-- NFC检测专属Intent Filter -->
    <intent-filter>
        <action android:name="android.nfc.action.TAG_DISCOVERED" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>

    <!-- 可选:如果要支持TECH_DISCOVERED,添加这个meta-data适配全类型NFC技术 -->
    <meta-data
        android:name="android.nfc.action.TECH_DISCOVERED"
        android:resource="@xml/nfc_tech_filter" />
</activity>

如果使用TECH_DISCOVERED,需要在res/xml目录下创建nfc_tech_filter.xml,内容如下(覆盖所有常见NFC技术,满足你“任意标签”的需求):

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <tech-list>
        <tech>android.nfc.tech.IsoDep</tech>
        <tech>android.nfc.tech.NfcA</tech>
        <tech>android.nfc.tech.NfcB</tech>
        <tech>android.nfc.tech.NfcF</tech>
        <tech>android.nfc.tech.NfcV</tech>
        <tech>android.nfc.tech.Ndef</tech>
        <tech>android.nfc.tech.NdefFormatable</tech>
        <tech>android.nfc.tech.MifareClassic</tech>
        <tech>android.nfc.tech.MifareUltralight</tech>
    </tech-list>
</resources>

2. 实现NFC前台调度系统

当你的Activity处于前台时,必须注册前台调度系统,才能优先接收NFC意图(否则系统可能把意图发给其他默认NFC应用)。修改你的MainActivity.kt代码:

class MainActivity : AppCompatActivity() {
    private var nfcAdapter: NfcAdapter? = null
    private var pendingIntent: PendingIntent? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 获取NFC适配器,先检查设备是否支持NFC
        nfcAdapter = NfcAdapter.getDefaultAdapter(this)
        if (nfcAdapter == null) {
            Toast.makeText(this, "设备不支持NFC功能", Toast.LENGTH_SHORT).show()
            finish()
            return
        }

        // 创建PendingIntent,确保NFC意图能发送到当前Activity
        pendingIntent = PendingIntent.getActivity(
            this,
            0,
            Intent(this, javaClass).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),
            PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
        )
    }

    override fun onResume() {
        super.onResume()
        // 前台调度:注册后让当前Activity优先捕获NFC事件
        nfcAdapter?.enableForegroundDispatch(this, pendingIntent, null, null)
    }

    override fun onPause() {
        super.onPause()
        // 注销前台调度,避免内存泄漏
        nfcAdapter?.disableForegroundDispatch(this)
    }

    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        // 校验是否为NFC相关意图,再触发Toast
        if (NfcAdapter.ACTION_TAG_DISCOVERED == intent.action ||
            NfcAdapter.ACTION_TECH_DISCOVERED == intent.action) {
            Toast.makeText(applicationContext, "NFC Tag Detected", Toast.LENGTH_LONG).show()
        }
    }
}

3. 两台三星设备互碰的注意事项

你用S6和S7互相靠近时要注意:默认状态下,两台设备都是读卡器模式,无法互相检测。你需要把其中一台设备切换为NFC卡模拟模式,比如:

  • 打开Samsung Pay,添加一张银行卡/交通卡,然后开启卡模拟功能
  • 或者使用第三方工具让设备模拟成NFC标签(部分设备需要root权限)

如果暂时没有卡模拟条件,建议先用实体NFC标签测试,这样更容易验证功能是否正常。

最后检查点

  • 确保两台设备的NFC功能都已开启(设置 -> 连接 -> NFC和支付)
  • 测试时保持Activity在前台,不要切到后台
  • 优先用实体标签验证功能,排除设备互碰的卡模拟问题

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

火山引擎 最新活动