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

Codename One安卓NFC标签写入时Tag为Null问题求助

NFC标签写入时detectedTag为Null的排查与解决

问题现象

通过NewInterfaceImpl类实现安卓NFC标签写入,调用bindNFCwriter()启动功能后,贴近NFC标签能触发流程,但onResume方法中获取的detectedTag始终为Null,导致无法完成标签写入操作。

核心原因分析

  1. PendingIntent的Action设置错误
    创建NFC_PendingIntent时手动指定了ACTION_TAG_DISCOVERED,但通过enableForegroundDispatch获取的NFC Intent,系统会自动填充对应Action(通常是ACTION_NDEF_DISCOVERED或ACTION_TECH_DISCOVERED),手动指定Action会干扰系统传递Tag数据的逻辑。

  2. Intent Flag的叠加方式问题
    创建Intent时连续调用addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),可能导致Intent的原始数据被覆盖,影响NFCAdapter.EXTRA_TAG的正常传递。

  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 07:58:14