当前位置: 首页 > news >正文

compose 二维码扫描qrcode

扫描预览


@Composable
fun ScannerContent(modifier: Modifier, onScan: (String) -> Unit) {val lifecycleOwner = LocalLifecycleOwner.currentval context = LocalContext.currentvar cameraControl: CameraControl? by remember { mutableStateOf(null) }AndroidView(factory = { ctx ->PreviewView(ctx).apply {scaleType = PreviewView.ScaleType.FILL_CENTER}}, modifier = modifier, update = { previewView ->val cameraExecutor = Executors.newSingleThreadExecutor()val cameraProviderFuture = ProcessCameraProvider.getInstance(context)cameraProviderFuture.addListener({val cameraProvider = cameraProviderFuture.get()val preview = Preview.Builder().build().also {it.setSurfaceProvider(previewView.surfaceProvider)}// 2. 创建 ImageAnalysis 用例(核心分析逻辑)val imageAnalysis = ImageAnalysis.Builder().setImageQueueDepth(1).setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST) // 仅保留最新帧.setOutputImageFormat(ImageAnalysis.OUTPUT_IMAGE_FORMAT_YUV_420_888) // 输出格式.build().apply {setAnalyzer(cameraExecutor, BarcodeAnalyzer(onScan))}val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERAtry {cameraProvider.unbindAll()val camera = cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, preview, imageAnalysis)cameraControl = camera.cameraControl} catch (e: Exception) {Log.e("QRScanner", "Camera Bind Error", e)}}, ContextCompat.getMainExecutor(context))})
}

图像分析采用

"com.google.mlkit:barcode-scanning"
class BarcodeAnalyzer(private val onScan: (String) -> Unit) : ImageAnalysis.Analyzer {val options = BarcodeScannerOptions.Builder().setBarcodeFormats(Barcode.FORMAT_QR_CODE) // 仅扫描标准二维码.build()private val scanner = BarcodeScanning.getClient()@OptIn(ExperimentalGetImage::class)override fun analyze(imageProxy: ImageProxy) {val mediaImage = imageProxy.image ?: run {imageProxy.close()return}if (mediaImage.format != ImageFormat.YUV_420_888) {imageProxy.close()return}val image = InputImage.fromMediaImage(mediaImage, imageProxy.imageInfo.rotationDegrees)scanner.process(image).addOnSuccessListener { barcodes ->barcodes.firstOrNull()?.rawValue?.let { result ->onScan(result)}}.addOnCompleteListener {imageProxy.close()}}
}

相关文章:

  • Swift与iOS内存管理机制深度剖析
  • 【随笔】地理探测器原理与运用
  • 剑指offer经典题目(六)
  • OTA和IAP的关系
  • TI---UART通信
  • 10:00面试,10:08就出来了,面试问的问题太。。。
  • 240426 leetcode exercises
  • 启动你的RocketMQ之旅(六)-Broker详细——主从复制
  • 如何在 PowerShell 脚本中调用外部 Windows 命令
  • TypeScript基础数据类型详解
  • [论文解析]Mip-Splatting: Alias-free 3D Gaussian Splatting
  • 【Java面试笔记:进阶】22.AtomicInteger底层实现原理是什么?如何在自己的产品代码中应用CAS操作?
  • 自然语言处理——语言转换
  • Java社区门诊系统源码 SaaS医院门诊系统源码 可上线运营
  • 怎样理解ceph?
  • mac笔记本安装brew、nvm、git等完整版
  • AI数字人:未来职业的重塑(9/10)
  • react的fiber 用法
  • 启动 n8n 步骤指南
  • [C++ 11] --- 线程异步
  • 白俄罗斯驻华大使:应发挥政党作用,以对话平台促上合组织发展与合作
  • 生态环境法典草案拟初审:应对气候变化等问题将作原则性规定
  • 乌克兰基辅遭大规模袭击,已致12人死亡
  • 北京市平谷区政协原主席王春辉接受纪律审查和监察调查
  • 张文宏团队公布广谱抗猴痘药物研发进展,将进入临床审批阶段
  • GDP十强省份“一季报”出炉,湖北领跑