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

Android NFC卡片交互应用:OnNewIntent获取Intent为null求助

Hey there, let's break down what's going wrong here and fix it step by step!

核心问题分析

  • 错误的requestCode使用:你调用startActivityForResult(intent, Activity.RESULT_OK, ...)时,第二个参数是requestCode,但你误用了Activity.RESULT_OK(这是resultCode的常量,值为-1),这会导致系统无法正确识别请求,后续回调逻辑混乱。
  • 未设置Intent的Action:按钮点击发送的Intent没有设置自定义Action,所以onNewIntent中intent.getAction()返回null,无法进入你写的自定义Action处理分支。
  • 错误获取Intent Extra:在resolveIntent的自定义Action分支里,你用getIntent().getExtras()而非传入的intent参数获取数据,这会拿到旧的Intent(不是按钮点击发送的新Intent)。
  • 未更新Activity的Intent:onNewIntent中没有调用setIntent(intent),导致后续调用getIntent()时仍然拿到旧的Intent实例。

修复步骤

  1. 替换错误的requestCode
    先定义一个自定义的请求码常量:

    private static final int REQUEST_SEND_CARD_CMD = 100; // 自定义正数请求码
    

    然后调用startActivityForResult时使用这个常量:

    startActivityForResult(intent, REQUEST_SEND_CARD_CMD, new SuccessResultHandler() {
        @Override
        public void onResult(Intent onResultIntent) {
            resp = onResultIntent.getByteArrayExtra("resp");
            Log.i(TAG, "onResult: " + byteArrayToSHex(resp)); // 用你的工具方法打印字节数组
        }
    });
    
  2. 给按钮点击的Intent设置自定义Action
    在创建按钮点击的Intent时,添加你在resolveIntent中判断的自定义Action:

    Intent intent = new Intent(v.getContext(), AndroidReader.class);
    intent.setAction("org.key.plugin.android"); // 添加这一行,匹配你的判断逻辑
    byte[] data = {0x00, (byte)0xA4, 0x04, 0x00, 0x10, (byte)0xA0, 0x00, 0x00, 0x04, 0x04};
    intent.putExtra("req", data);
    
  3. 在onNewIntent中更新Activity的Intent
    修改onNewIntent方法,添加setIntent(intent)确保后续getIntent()能拿到最新的Intent:

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent); // 关键:更新Activity的Intent实例
        resolveIntent(intent);
    }
    
  4. 修正Intent Extra的获取方式
    在resolveIntent的自定义Action分支里,使用传入的intent参数获取Extra:

    // 替换原来的Bundle extras = getIntent().getExtras();
    Bundle extras = intent.getExtras();
    if(extras == null) {
        data= null;
    } else {
        data= extras.getByteArray("req");
    }
    

额外建议

  • 把NFC标签处理和按钮点击的逻辑拆分到不同方法里,避免在resolveIntent中混写,提升代码可读性。
  • 测试时可以在onNewIntent里先打印Intent的Action和Extra,确认数据是否正确传递:
    Log.i(TAG, "onNewIntent Action: " + intent.getAction());
    Log.i(TAG, "onNewIntent req data: " + byteArrayToSHex(intent.getByteArrayExtra("req")));
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:00:18