当前位置: 首页 > 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()}}
}

http://www.xdnf.cn/news/157789.html

相关文章:

  • 进制转换编程实现
  • Eclipse 插件开发 3 菜单栏
  • Java数据结构——Stack
  • Gin框架
  • 【股票系统】使用docker本地构建ai-hedge-fund项目,模拟大师炒股进行分析。人工智能的对冲基金的开源项目
  • 测试用例的设计
  • 股指期货成交量是单边还是双边?
  • 慢查询日志对于分析mysql数据库性能有什么帮助
  • crossOriginLoading使用说明
  • 达芬奇模板 15组现代简洁文字标题动画 Modern Titles v2.0 DR
  • 搭建基于火灾风险预测与防范的消防安全科普小程序
  • 客户案例 | 光热+数智双驱动!恒基能脉的数字化协同与技术创新实践
  • 启动 n8n 步骤指南
  • x86系列CPU寄存器和汇编指令总结
  • 【新技术】微软 Azure Test Impact Analyzer (TIA) 全面解析
  • Python Cookbook-6.10 保留对被绑定方法的引用且支持垃圾回收
  • Spark 极速回顾
  • AIGC在游戏开发中的革命:自动化生成3A级游戏内容
  • 如何使用WebRTC
  • Cisco Packet Tracer使用 搭建网络拓扑
  • 3、LangChain基础:LangChain Tools Agent
  • 【Kafka】Windows环境下生产与消费流程详解(附流程图)
  • proxychains4系统代理for linux(加速国内github下载速度,pip安装)
  • pytorch python常用指令
  • 2025.04.26-美团春招笔试题-第二题
  • 线性代数(一些别的应该关注的点)
  • 立创EDA
  • 25【干货】在Arcgis中根据字段属性重新排序并自动编号的方法(二)
  • 【AI论文】VisuLogic:评估多模态大语言模型中视觉推理的基准
  • MySQL 中 SQL 语句的详细执行过程