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

