首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我使用CameraX的代码“CameraX”时,什么都不会发生

当我使用CameraX的代码“CameraX”时,什么都不会发生
EN

Stack Overflow用户
提问于 2020-05-07 23:33:57
回答 1查看 1.8K关注 0票数 4

我正在尝试探索cameraX测试版。

我被困在我的执行中了。imageCapture.takePicture() imageCapture为空。

代码语言:javascript
复制
        // Bind the CameraProvider to the LifeCycleOwner
    val cameraSelector = CameraSelector.Builder().requireLensFacing(lensFacing).build()
    val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
    cameraProviderFuture.addListener(Runnable {

    // CameraProvider
    val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()

    // ImageCapture
    imageCapture = ImageCapture.Builder()
        .setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
        .build()


        // Must unbind the use-cases before rebinding them
        cameraProvider.unbindAll()

        try {
            // A variable number of use-cases can be passed here -
            // camera provides access to CameraControl & CameraInfo
            camera = cameraProvider.bindToLifecycle(
                this, cameraSelector, imageCapture)
        } catch(exc: Exception) {
            Log.e("TAG", "Use case binding failed", exc)
        }

    }, ContextCompat.getMainExecutor(this))

    // Create output file to hold the image
    photoFile = createFile(externalMediaDirs.first(), FILENAME, PHOTO_EXTENSION)

    // Setup image capture metadata
    val metadata = Metadata().apply {

        // Mirror image when using the front camera
        isReversedHorizontal = lensFacing == CameraSelector.LENS_FACING_FRONT
    }
    // Create output options object which contains file + metadata
    outputOptions = ImageCapture.OutputFileOptions.Builder(photoFile)
        .setMetadata(metadata)
        .build()

    // Setup image capture listener which is triggered after photo has been taken
    imageCapture?.takePicture(
        outputOptions, cameraExecutor, object : ImageCapture.OnImageSavedCallback {
            override fun onError(exc: ImageCaptureException) {
                Log.e(TAG, "Photo capture failed: ${exc.message}", exc)
            }

            override fun onImageSaved(output: ImageCapture.OutputFileResults) {
                val savedUri = output.savedUri ?: Uri.fromFile(photoFile)
                Log.d(TAG, "Photo capture succeeded: $savedUri")

            }
        })
  }

(我不使用onClickListener)

我的函数由一个服务调用。

如果删除cameraProviderFuture.addListener(可运行的),则不会绑定到有效的照相机上。

我使用camerax测试版

EN

回答 1

Stack Overflow用户

发布于 2020-05-08 18:44:11

ImageCapture用例目前无法独立工作。它必须与至少一个PreviewImageAnalysis用例结合使用。在CameraX的未来版本中,这种情况可能会发生变化。现在,您可以查看支持用例组合上的文档。

解决问题的一个简单方法是添加一个ImageAnalysis用例,它的Analyzer可以立即关闭它接收到的图像。

代码语言:javascript
复制
val imageAnalysis = ImageAnalysis.Builder()
      .build()
      .apply {
            setAnalyzer(executor, ImageAnalysis.Analyzer { image ->
            image.close()
        })
      }

// Then bind both the imageAnalysis and ImageCapture
cameraProvider.bindToLifecycle(this, cameraSelector, imageCapture, imageAnalysis)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61669542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档