【问题标题】:camera X Cancelled by another startFocusAndMetering相机 X 被另一个 startFocusAndMetering 取消
【发布时间】:2021-02-24 03:55:36
【问题描述】:

我正在使用 cameraX 库实现自定义相机。我正在努力集中精力,我做了以下事情

viewFinder.setOnTouchListener { v, event ->
            return@setOnTouchListener when (event.action) {
                MotionEvent.ACTION_DOWN -> {
                    true
                }
                MotionEvent.ACTION_UP -> {
                   // The below code is for focusing 

                    val factory = SurfaceOrientedMeteringPointFactory(
                        viewFinder.width.toFloat(),
                        viewFinder.height.toFloat()
                    )
                    val point = factory.createPoint(event.x, event.y)
                    try {
                        val action = FocusMeteringAction.Builder(point, FocusMeteringAction.FLAG_AF)
                            .apply {
                                disableAutoCancel() //focus only when the user tap the preview
                            }.build()

                        val future = cameraControl?.startFocusAndMetering(action)
                        future?.addListener(Runnable {
--->line 66                 val result = future?.get()
                            println("log result ---> $result")
                        }, cameraExecutor)

                    } catch (e: CameraInfoUnavailableException) {
                        println("log error ---> $e")
                    }
                    true
                }
                else -> false // Unhandled event.
            }
        }

现在,它是一些聚焦我触摸的点的东西,它不太准确,但没关系。在 5 到 6 次聚焦后,应用程序崩溃并关闭。

FATAL EXCEPTION: pool-2-thread-1
...
...
java.lang.Error: java.util.concurrent.ExecutionException: androidx.camera.core.CameraControl$OperationCanceledException: Cancelled by another startFocusAndMetering()
...
...
...MainActivity$onCreate$2$1.run(MainActivity.kt:66)

我不明白为什么它会崩溃并且它不经常崩溃。有时会崩溃,有时不会。

编辑 1:-

我知道当我多次点击焦点时会发生这种情况。因此,在开始聚焦之前,如果正在进行,我需要清除先前的聚焦。但是,如何清除以前没有得到的焦点。

编辑 2:-

我试过这个 cameraControl?.cancelFocusAndMetering(),我只是把它放在 try 块的第一行。但问题依然存在。

【问题讨论】:

    标签: java android kotlin android-camera android-camerax


    【解决方案1】:

    对这里的 java 代码表示歉意。但根据我的经验,future?.get() 需要包含在 try, catch 中

    future.addListener(() -> {
    
        try
            {
                FocusMeteringResult result = (FocusMeteringResult) future.get();
                if(result.isFocusSuccessful())
                {
                    // Focus has succeeded
                }
                else
                {
                    // Focus has failed
                }
            }
            catch (ExecutionException e) // Thrown exceptions
            {
                e.printStackTrace();
            }
            catch (InterruptedException e) // Thrown exceptions
            {
                e.printStackTrace();
            }
    }
    

    【讨论】:

      【解决方案2】:

      我刚刚删除了这个块

      future?.addListener(Runnable {
                val result = future?.get()
                println("log result ---> $result")
             }, cameraExecutor)
      
      

      它工作正常。但不知道是对是错。

      如果有人知道?请回答。目前我将此标记为有效的答案。

      【讨论】:

      • 当您调用CameraControl.startFocusAndMetering() 时,如果之前的计量操作仍在运行,则将其取消。未来被取消并失败,除了您在 logcat 中看到的异常。你不应该担心它。调用 CameraControl.cancelFocusAndMetering() 会做同样的事情,它会取消任何正在进行的计量操作,但会出现稍微不同的错误消息,您可能已经注意到了。
      • @HusaynHakeem 谢谢,但是当我将future?.addListener 放入时,即使我将其放入try catch,应用程序也会崩溃并关闭。你能告诉我一些如何处理它的代码吗?
      • 应用程序是否因为您的答案 (future?.addListener(...)) 中的 sn-p 而崩溃?有关代码示例,请查看this sample
      • @HusaynHakeem 是的,当应用程序崩溃时,它总是指向val result = future?.get() 行。
      • 我也遇到过这种情况——希望我能知道焦点是否成功!
      猜你喜欢
      • 1970-01-01
      • 2017-05-12
      • 2020-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-27
      • 2020-10-21
      • 2021-01-02
      相关资源
      最近更新 更多