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

为何检测到NFC标签时我的Activity无响应?

NFC标签检测Activity无响应的问题排查与修复

1. 未处理全量NFC触发动作

你的代码仅监听了ACTION_NDEF_DISCOVERED,该动作仅针对包含NDEF格式数据的NFC标签。如果标签无NDEF数据,系统会发送ACTION_TECH_DISCOVERED或ACTION_TAG_DISCOVERED,需补充这两类动作的判断:

private void handleNfcIntent(Intent intent) {
    String action = intent.getAction();
    // 同时处理三种NFC触发动作
    if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action) ||
        NfcAdapter.ACTION_TECH_DISCOVERED.equals(action) ||
        NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)) {
        Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        if (tag != null) {
            String nfcTagId = byteArrayToHexString(tag.getId());
            Log.d("NFC", "检测到标签ID: " + nfcTagId); // 打印日志验证ID格式

            TextView tagIdTextView = findViewById(R.id.tagid);
            tagIdTextView.setText("Tag ID: " + nfcTagId);

            // 忽略大小写匹配,避免格式不一致问题
            if (nfcTagId.equalsIgnoreCase("53:44:77:A1:00:00:01")) {
                Intent targetIntent = new Intent(this, MenuActivity.class);
                startActivity(targetIntent);
            }
        }
    }
}

2. 缺少Manifest权限与Activity配置

需在AndroidManifest.xml中添加NFC权限、特性声明,并配置Activity的NFC Intent过滤器,确保系统能将NFC事件传递给你的Activity:

权限与特性声明(放在<application>标签外)

<uses-permission android:name="android.permission.NFC" />
<uses-feature android:name="android.hardware.nfc" android:required="true" />

Activity的Intent过滤器(放在<activity>标签内)

<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
    <action android:name="android.nfc.action.TECH_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
    <action android:name="android.nfc.action.TAG_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<!-- 配置TECH_DISCOVERED支持的NFC技术类型 -->
<meta-data
    android:name="android.nfc.action.TECH_DISCOVERED"
    android:resource="@xml/nfc_tech_filter" />

创建NFC技术过滤文件

在res/xml目录下新建nfc_tech_filter.xml,添加支持的NFC技术类型:

<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>
        <tech>android.nfc.tech.NfcV</tech>
        <tech>android.nfc.tech.NfcBarcode</tech>
    </tech-list>
</resources>

3. 未启用前台NFC调度系统

仅在onCreate中处理getIntent()不足以覆盖Activity前台时的NFC事件,需启用前台调度,确保Activity在前台时优先获取NFC触发事件:

private NfcAdapter nfcAdapter;
private PendingIntent pendingIntent;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_scan);

    nfcAdapter = NfcAdapter.getDefaultAdapter(this);
    if (nfcAdapter == null) {
        Toast.makeText(this, "设备不支持NFC", Toast.LENGTH_SHORT).show();
        finish();
        return;
    }

    // 创建PendingIntent,用于接收NFC事件
    pendingIntent = PendingIntent.getActivity(this, 0,
            new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),
            PendingIntent.FLAG_MUTABLE);

    handleNfcIntent(getIntent());
}

@Override
protected void onResume() {
    super.onResume();
    // 启用前台调度
    if (nfcAdapter != null) {
        nfcAdapter.enableForegroundDispatch(this, pendingIntent, null, null);
    }
}

@Override
protected void onPause() {
    super.onPause();
    // 暂停时关闭前台调度
    if (nfcAdapter != null) {
        nfcAdapter.disableForegroundDispatch(this);
    }
}

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    // 处理前台时收到的新NFC Intent
    handleNfcIntent(intent);
}

4. 标签ID格式匹配问题

需确保byteArrayToHexString方法的输出格式与目标ID完全一致(包括分隔符、大小写),以下是标准的带冒号大写格式实现:

private String byteArrayToHexString(byte[] bytes) {
    StringBuilder sb = new StringBuilder();
    for (byte b : bytes) {
        sb.append(String.format("%02X:", b));
    }
    if (sb.length() > 0) {
        sb.deleteCharAt(sb.length() - 1); // 移除最后一个多余的冒号
    }
    return sb.toString();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 15:33:16