Codename One安卓NFC标签写入时Tag为Null问题求助
问题现象
通过NewInterfaceImpl类实现安卓NFC标签写入,调用bindNFCwriter()启动功能后,贴近NFC标签能触发流程,但onResume方法中获取的detectedTag始终为Null,导致无法完成标签写入操作。
核心原因分析
PendingIntent的Action设置错误
创建NFC_PendingIntent时手动指定了ACTION_TAG_DISCOVERED,但通过enableForegroundDispatch获取的NFC Intent,系统会自动填充对应Action(通常是ACTION_NDEF_DISCOVERED或ACTION_TECH_DISCOVERED),手动指定Action会干扰系统传递Tag数据的逻辑。Intent Flag的叠加方式问题
创建Intent时连续调用addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),可能导致Intent的原始数据被覆盖,影响NFCAdapter.EXTRA_TAG的正常传递。Foreground Dispatch的Intent配置不规范
使用enableForegroundDispatch时,Intent应保持空Action,由系统在检测到Tag时自动填充NFC相关的Action和Extra数据,预先指定Action会破坏系统的默认处理流程。
解决方向与代码修改
1. 修正PendingIntent的创建逻辑
移除手动设置的ACTION_TAG_DISCOVERED,使用空Action的Intent,让系统自动填充NFC数据:
try{ final Intent intent = new Intent(AndroidNativeUtil.getActivity(), AndroidNativeUtil.getActivity().getClass()); intent.addCategory(Intent.CATEGORY_DEFAULT); // 移除手动指定的Action // intent.setAction ("android.nfc.action.TAG_DISCOVERED"); NFC_PendingIntent = PendingIntent.getActivity(AndroidNativeUtil.getActivity(), 0, intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), PendingIntent.FLAG_IMMUTABLE); }catch(Exception xxc){message = "Error: "+xxc.getMessage(); return;}
2. 优化onResume中的Intent判断逻辑
兼容系统可能传递的所有NFC相关Action,而非仅判断ACTION_TAG_DISCOVERED:
public void onResume() { Activity myActivity = AndroidNativeUtil.getActivity(); try{ Intent intent = myActivity.getIntent(); if (writeMode && intent != null) { String action = intent.getAction(); if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action) || NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action) || NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) { Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); if(detectedTag == null){ message = "Tag is null"; return; } if(writeTag(buildNdefMessage(), detectedTag)){ message = "Success!"; }else{ message = "Error: "+errorMsg; }; } } }catch(Exception xxx){message = "Exception: "+xxx.getMessage(); } }
3. 确保Foreground Dispatch的正确启停
Activity从后台恢复时,Foreground Dispatch会失效,需在onResume中重新启用:
public void onResume() { Activity myActivity = AndroidNativeUtil.getActivity(); try{ // 恢复Foreground Dispatch if(writeMode && NFC_Adapter != null){ enableTagWriteMode(); } Intent intent = myActivity.getIntent(); // 后续判断逻辑不变 }catch(Exception xxx){message = "Exception: "+xxx.getMessage(); } }
4. 验证Activity实例的可靠性
确认AndroidNativeUtil.getActivity()返回的是当前前台的Activity实例,避免因Activity引用失效导致Intent获取错误。
内容的提问来源于stack exchange,提问作者Chief O

