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

Android NFC读取银行卡:升级compileSdkVersion33后mTag为null求助

解决compileSdkVersion升级到33后NFC Tag获取为null的问题

问题背景

使用com.github.devnied.emvnfccard:library:3.0.1解析银行卡信息,通过intent.getParcelableExtra(NfcAdapter.EXTRA_TAG)获取Tag对象,在compileSdkVersion从30升级到33后,Tag始终为null,已尝试添加TECH_DISCOVERED intent-filter、调整gradle版本但未解决。

可能的解决方法

1. 适配Android 13的Tag获取方式

Android 13(API 33)对Parcelable的获取逻辑有调整,建议替换旧的调用方式为带类型参数的版本,避免类型转换兼容问题:

final Tag mTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG, Tag.class);

同时确保Manifest中已配置基础NFC权限:

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

2. 完善TECH_DISCOVERED的配置

TECH_DISCOVERED不能仅添加intent-filter,还需配合meta-data指定支持的NFC技术类型。在Manifest的Activity标签内补充配置:

<intent-filter>
    <action android:name="android.nfc.action.TECH_DISCOVERED" />
</intent-filter>
<meta-data
    android:name="android.nfc.action.TECH_DISCOVERED"
    android:resource="@xml/nfc_tech_filter" />

然后在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-list>
</resources>

3. 修复前台调度系统的实现

Android 13对PendingIntent的标记有强制要求,同时要确保Activity前台时能优先捕获NFC intent。在Activity的onResume和onPause中完善调度逻辑:

@Override
protected void onResume() {
    super.onResume();
    NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
    if (nfcAdapter != null) {
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
                new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),
                PendingIntent.FLAG_MUTABLE); // Android 12+必须指定该标记
        IntentFilter[] filters = new IntentFilter[]{new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED)};
        String[][] techLists = new String[][]{new String[]{IsoDep.class.getName(), NfcA.class.getName()}};
        nfcAdapter.enableForegroundDispatch(this, pendingIntent, filters, techLists);
    }
}

@Override
protected void onPause() {
    super.onPause();
    NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
    if (nfcAdapter != null) {
        nfcAdapter.disableForegroundDispatch(this);
    }
}

4. 升级NFC库版本

当前使用的3.0.1版本可能未适配Android 13,尝试升级到库的最新稳定版本:

implementation 'com.github.devnied.emvnfccard:library:3.0.2'

5. 测试排查要点

  • 确认测试设备NFC功能已开启,且硬件支持NFC
  • 测试时将银行卡稳定贴近NFC感应区域,避免快速移动
  • 关闭后台其他NFC相关应用,防止抢占NFC intent

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 02:40:38