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实例。
修复步骤
替换错误的
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)); // 用你的工具方法打印字节数组 } });给按钮点击的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);在
onNewIntent中更新Activity的Intent
修改onNewIntent方法,添加setIntent(intent)确保后续getIntent()能拿到最新的Intent:@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); // 关键:更新Activity的Intent实例 resolveIntent(intent); }修正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
相关产品推荐
相关产品推荐

