
本文介绍在 android 应用中使用 ml kit 或 zxing 等扫码库完成扫描后,如何通过 intent 启动新 activity,并安全传递扫描结果,避免空指针与上下文失效问题。
在 Android 开发中,扫码(如 QR Code)通常借助 ActivityResultLauncher 配合 ScanContract(常见于 ZXing Android Embedded 或自定义封装)实现异步扫描回调。你当前的代码已成功捕获扫描结果并弹出 AlertDialog,下一步只需将该回调逻辑替换为标准的 Activity 跳转流程。
✅ 正确跳转方式(推荐写法)
ActivityResultLauncherbarLauncher = registerForActivityResult( new ScanContract(), result -> { if (result != null && result.getContents() != null) { // 创建 Intent,启动目标 Activity Intent intent = new Intent(QRScanActivity.this, NextTargetActivity.class); // 可选:将扫描内容作为参数传递 intent.putExtra("scanned_data", result.getContents()); // 使用显式 Intent 启动(确保目标 Activity 已在 AndroidManifest.xml 中声明) startActivity(intent); // 可选:关闭当前扫码页(防止用户返回重复扫描) finish(); } else { // 处理空结果(如用户取消扫描、光线不足识别失败等) Toast.makeText(QRScanActivity.this, "No valid code scanned", Toast.LENGTH_SHORT).show(); } } );
⚠️ 注意事项
- QRScanActivity.this 必须是有效的 Activity 实例:确保 barLauncher 在 Activity 的 onCreate() 或生命周期早期初始化,避免在 Fragment 或已销毁 Activity 中调用。
-
目标 Activity 必须在 AndroidManifest.xml 中注册:
- 传递数据建议使用 Intent.putExtra():接收方在 NextTargetActivity 中通过 getIntent().getStringExtra("scanned_data") 获取。
- 避免内存泄漏:若需在跳转前执行耗时操作(如网络校验),建议结合 ViewModel 或协程处理,而非直接在回调中阻塞主线程。
- 兼容性提示:若使用的是较新版本 ZXing Android Embedded(v4.0+),请确认 ScanContract 已正确引入;旧版可能需改用 IntentIntegrator,其回调方式略有不同。
? 进阶建议
如需在跳转时携带更多上下文(如扫描时间、原始图像缩略图或格式类型),可扩展 Intent 参数:
intent.putExtra("scanned_format", result.getFormatName()); // 如 "QR_CODE"
intent.putExtra("scan_timestamp", System.currentTimeMillis());最终,一次成功的扫码不应仅止于展示结果——合理利用扫描数据驱动页面流转,是构建流畅用户体验的关键一步。









