【问题标题】:Nothing happen when I use the code “imageCapture.takePicture” of CameraX当我使用 CameraX 的代码“imageCapture.takePicture”时没有任何反应
【发布时间】:2020-05-09 02:44:11
【问题描述】:

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

我被困在我的实施中。 imageCapture.takePicture() imageCapture 为空。

        // 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(Runnable 我得到 Not bound to a valid Camera

我使用的是 camerax 测试版

【问题讨论】:

    标签: android kotlin android-camerax


    【解决方案1】:

    ImageCapture 用例目前无法单独运行。它必须至少与PreviewImageAnalysis 用例结合使用。这可能会在 CameraX 的未来版本中发生变化。目前,您可以查看supported use case combinations 上的文档。

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

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-06
      • 1970-01-01
      • 2022-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多