什么原因导致错误java.lang.IllegalArgumentException:请求的zoomRatio 1.0不在Android中CameraX Api的有效范围[1.0,0.0]内?

什么原因导致错误java.lang.IllegalArgumentException:请求的zoomRatio 1.0不在Android中CameraX Api的有效范围[1.0,0.0]内?,android,android-camera,android-camerax,Android,Android Camera,Android Camerax,我正在使用来自的CameraX Api的启动程序代码 但它给出了以下错误 E/AndroidRuntime:致命异常:主进程: com.example.googlecamerax,PID:27995 java.lang.RuntimeException: java.lang.reflect.InvocationTargetException 位于com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java

我正在使用来自的CameraX Api的启动程序代码

但它给出了以下错误

E/AndroidRuntime:致命异常:主进程: com.example.googlecamerax,PID:27995 java.lang.RuntimeException: java.lang.reflect.InvocationTargetException 位于com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:502) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:935)上,由以下原因引起:java.lang.reflect.InvocationTargetException 位于java.lang.reflect.Method.invoke(本机方法) 位于com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:935)上,由以下原因引起:java.util.concurrent.ExecutionException: androidx.camera.core.InitializationException: java.lang.IllegalArgumentException:请求的zoomRatio 1.0不可用 在有效范围[1.0,0.0]内 位于androidx.concurrent.futures.AbstractResolvableFuture.getDoneValue(AbstractResolvableFuture.java:518) 位于androidx.concurrent.futures.AbstractResolvableFuture.get(AbstractResolvableFuture.java:475) 位于androidx.concurrent.futures.CallbackToFutureAdapter$SafeFuture.get(CallbackToFutureAdapter.java:199) 位于androidx.camera.core.impl.utils.futures.FutureChain.get(FutureChain.java:155) 在androidx.camera.core.impl.utils.futures.ChainingListenableFuture.get(ChainingListenableFuture.java:105)中 在com.example.googlecamerax.MainActivity$startCamera$1.run(MainActivity.kt:58) 位于android.os.Handler.handleCallback(Handler.java:883) 位于android.os.Handler.dispatchMessage(Handler.java:100) 位于android.os.Looper.loop(Looper.java:214) 位于android.app.ActivityThread.main(ActivityThread.java:7397) 位于java.lang.reflect.Method.invoke(本机方法) 位于com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:935)上,由以下原因引起:androidx.camera.core.InitializationException: java.lang.IllegalArgumentException:请求的zoomRatio 1.0不可用 在有效范围[1.0,0.0]内 位于androidx.camera.core.CameraX.lambda$initInternal$7$CameraX(CameraX.java:638) 在androidx.camera.core.-$$Lambda$CameraX$PC4SOFGjuqUVT4bexY644vLmWFE.run(未知 资料来源:8) 位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 在java.lang.Thread.run(Thread.java:919)处,由以下原因引起:java.lang.IllegalArgumentException:请求的zoomRatio 1.0不是 在有效范围[1.0,0.0]内 位于androidx.camera.camera2.internal.ZoomStateImpl.setZoomRatio(ZoomStateImpl.java:40) 位于androidx.camera.camera2.internal.ZoomControl.(ZoomControl.java:98) 位于androidx.camera.camera2.internal.Camera2CameraControl.(Camera2CameraControl.java:125) 位于androidx.camera.camera2.internal.Camera2CameraImpl.(Camera2CameraImpl.java:200) 位于androidx.camera.camera2.internal.Camera2CameraFactory.getCamera(Camera2CameraFactory.java:61) 位于androidx.camera.core.impl.CameraRepository.init(CameraRepository.java:64) 位于androidx.camera.core.CameraX.lambda$initInternal$7$CameraX(CameraX.java:632)

这是我的密码

typealias LumaListener = (luma: Double) -> Unit

class MainActivity : AppCompatActivity() {
    private var imageCapture: ImageCapture? = null

    private lateinit var outputDirectory: File
    private lateinit var cameraExecutor: ExecutorService

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Request camera permissions
        if (allPermissionsGranted()) {
            startCamera()
        } else {
            ActivityCompat.requestPermissions(
                this, REQUIRED_PERMISSIONS, REQUEST_CODE_PERMISSIONS
            )
        }

        // Set up the listener for take photo button
        camera_capture_button.setOnClickListener { takePhoto() }

        outputDirectory = getOutputDirectory()

        cameraExecutor = Executors.newSingleThreadExecutor()
    }

    private fun takePhoto() {}

    private fun startCamera() {
        val cameraProviderFuture = ProcessCameraProvider.getInstance(this)

        cameraProviderFuture.addListener(Runnable {
            // Used to bind the lifecycle of cameras to the lifecycle owner
            val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()

            // Preview
            val preview = Preview.Builder()
                .build()
                .also {
                    it.setSurfaceProvider(viewFinder.createSurfaceProvider())
                }

            // Select back camera as a default
            val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA

            try {
                // Unbind use cases before rebinding
                cameraProvider.unbindAll()

                // Bind use cases to camera
                cameraProvider.bindToLifecycle(
                    this, cameraSelector, preview)

            } catch(exc: Exception) {
                Log.e(TAG, "Use case binding failed", exc)
            }

        }, ContextCompat.getMainExecutor(this))
    }

    private fun allPermissionsGranted() = REQUIRED_PERMISSIONS.all {
        ContextCompat.checkSelfPermission(
            baseContext, it
        ) == PackageManager.PERMISSION_GRANTED
    }

    private fun getOutputDirectory(): File {
        val mediaDir = externalMediaDirs.firstOrNull()?.let {
            File(it, resources.getString(R.string.app_name)).apply { mkdirs() }
        }
        return if (mediaDir != null && mediaDir.exists())
            mediaDir else filesDir
    }

    override fun onDestroy() {
        super.onDestroy()
        cameraExecutor.shutdown()
    }

    override fun onRequestPermissionsResult(
        requestCode: Int, permissions: Array<String>, grantResults:
        IntArray
    ) {
        if (requestCode == REQUEST_CODE_PERMISSIONS) {
            if (allPermissionsGranted()) {
                startCamera()
            } else {
                Toast.makeText(
                    this,
                    "Permissions not granted by the user.",
                    Toast.LENGTH_SHORT
                ).show()
                finish()
            }
        }
    }

    companion object {
        private const val TAG = "CameraXBasic"
        private const val FILENAME_FORMAT = "yyyy-MM-dd-HH-mm-ss-SSS"
        private const val REQUEST_CODE_PERMISSIONS = 10
        private val REQUIRED_PERMISSIONS = arrayOf(Manifest.permission.CAMERA)
    }
}

这是一些OEM摄像头实现中的一个缺陷

谷歌从
1.0.0-rc04
1.1.0-alpha03
开始,在CameraX中添加了一个变通方法。只需更新到其中一个或更高版本


您可以在此处找到更多信息:添加的解决方法是发生在特定设备上,还是发生在所有设备上?您能告诉我设备的型号吗?这只发生在我的诺基亚6.1上。不在其他设备上@Xi张熹谢谢你的信息。我会让团队知道这个问题。仅供参考:@rewgoes我已经添加了一个可以帮助您的答案
var cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()