使用code-scanner扫码时如何从Firestore获取数据并跳转至其他页面
实现方案
实现步骤
- 确保项目已完成Firebase集成,添加Firestore依赖并完成初始化配置
- 在扫码成功回调
DecodeCallback中获取扫描得到的条码值,作为查询条件访问Firestore对应集合 - 监听Firestore查询结果,查询成功后携带数据跳转至目标页面,按需添加查询失败、无匹配数据的处理逻辑
完整修改后代码
private fun codeScanner() { codeScanner = CodeScanner(this, scanner_view) // 初始化Firestore实例 val firestore = FirebaseFirestore.getInstance() codeScanner.apply { camera = CodeScanner.CAMERA_BACK formats = CodeScanner.ONE_DIMENSIONAL_FORMATS autoFocusMode = AutoFocusMode.SAFE isAutoFocusEnabled = true isFlashEnabled = false decodeCallback = DecodeCallback { scanResult -> val scannedBarcode = scanResult.text runOnUiThread { tv_textView.text = scannedBarcode } // Firestore查询逻辑,集合名、字段名需替换为你实际的结构 firestore.collection("你的集合名称") .whereEqualTo("条码对应的字段名", scannedBarcode) .get() .addOnSuccessListener { querySnapshot -> if (!querySnapshot.isEmpty) { // 取第一条匹配的文档数据 val targetDoc = querySnapshot.documents.first() val queryData = targetDoc.data // 跳转至目标页面,替换为你实际的目标Activity类名 val intent = Intent(this@你当前的Activity类名, 目标Activity::class.java) // 携带数据,复杂对象可转Json或实现Parcelable传递 intent.putExtra("query_result", queryData.toString()) startActivity(intent) // 可选:跳转后关闭当前扫码页面 finish() } else { // 无匹配数据处理 runOnUiThread { Toast.makeText(this@你当前的Activity类名, "未找到对应条码数据", Toast.LENGTH_SHORT).show() codeScanner.startPreview() } } } .addOnFailureListener { e -> // 查询失败处理 runOnUiThread { Log.e("Firestore", "查询失败:${e.message}") Toast.makeText(this@你当前的Activity类名, "数据查询失败,请重试", Toast.LENGTH_SHORT).show() } } } errorCallback = ErrorCallback { runOnUiThread { Log.e("Scan", "相机初始化错误:${it.message}") } } } scanner_view.setOnClickListener { codeScanner.startPreview() } }
注意事项
- 代码中的占位符
你的集合名称、条码对应的字段名、你当前的Activity类名、目标Activity需要替换为你项目中实际的内容 - 如果需要传递复杂数据到目标页,建议将数据转为Json字符串或者让实体类实现Parcelable接口后传递
- 请确保Firestore安全规则已开放对应集合的查询权限,避免权限不足导致查询失败
- 可根据业务需求调整扫描成功后是否停止扫码预览,以及异常场景的处理逻辑
内容的提问来源于stack exchange,提问作者Barcode Payment System
相关产品推荐
相关产品推荐

