Android-CameraX:在多个前置摄像头之间切换

Joh*_*ibe 5 android kotlin android-camerax

我\xc2\xb4m 尝试编写我的第一个Android 相机应用程序,但它总是选择变焦相机而不是主相机。(我在华为P30 Pro上测试过)

\n\n

该代码基于官方的camerax示例应用程序(https://github.com/android/camera-samples/tree/master/CameraXBasic

\n\n

相关代码:

\n\n
/** Declare and bind preview, capture and analysis use cases */\nprivate fun bindCameraUseCases() {\n\n    // Get screen metrics used to setup camera for full screen resolution\n    val metrics = DisplayMetrics().also { viewFinder.display.getRealMetrics(it) }\n    Log.d(TAG, "Screen metrics: ${metrics.widthPixels} x ${metrics.heightPixels}")\n\n    val screenAspectRatio = aspectRatio(metrics.widthPixels, metrics.heightPixels)\n    Log.d(TAG, "Preview aspect ratio: $screenAspectRatio")\n\n    val rotation = viewFinder.display.rotation\n\n    // Bind the CameraProvider to the LifeCycleOwner\n\n    val cameraSelector = CameraSelector.Builder().requireLensFacing(lensFacing).build()\n\n    val cameraProviderFuture = ProcessCameraProvider.getInstance(requireContext())\n    cameraProviderFuture.addListener(Runnable {\n\n        // CameraProvider\n        val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()\n\n        // Preview\n        preview = Preview.Builder()\n            // We request aspect ratio but no resolution\n            .setTargetAspectRatio(screenAspectRatio)\n            // Set initial target rotation\n            .setTargetRotation(rotation)\n            .build()\n\n        // ImageCapture\n        imageCapture = ImageCapture.Builder()\n            .setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)\n            // We request aspect ratio but no resolution to match preview config, but letting\n            // CameraX optimize for whatever specific resolution best fits our use cases\n            .setTargetAspectRatio(screenAspectRatio)\n            // Set initial target rotation, we will have to call this again if rotation changes\n            // during the lifecycle of this use case\n            .setTargetRotation(rotation)\n            .build()\n\n        // Must unbind the use-cases before rebinding them\n        cameraProvider.unbindAll()\n\n        try {\n            // A variable number of use-cases can be passed here -\n            // camera provides access to CameraControl & CameraInfo\n            camera = cameraProvider.bindToLifecycle(\n                    this, cameraSelector, preview, imageCapture /**, imageAnalyzer*/)\n\n            // Attach the viewfinder\'s surface provider to preview use case\n            preview?.setSurfaceProvider(viewFinder.createSurfaceProvider(camera?.cameraInfo))\n        } catch(exc: Exception) {\n            Log.e(TAG, "Use case binding failed", exc)\n        }\n\n    }, ContextCompat.getMainExecutor(requireContext()))\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Hus*_*eem 5

使用当前的 CameraX API,我认为您无法选择使用哪个特定相机,您只能选择镜头朝向(CameraSelector.Builder().requireLensFacing(int)),可以是正面或背面。当您绑定用例时,CameraX 选择第一个满足用例要求的相机。例如,在将预览用例与启用或禁用的扩展绑定时,可以使用 2 个不同的后置摄像头。

CameraSelectorAPI 似乎仍有增长空间,因此将来您可能可以更好地控制选择哪个相机。如果您现在需要这种控制,您可能需要使用 Camera2。

  • @masterR0shi `CameraSelector` 根据设备使用的滤镜从设备上的可用相机池中选择相机。“CameraSelector.Builder”提供了“requireLensFacing(int)”和“addCameraFilter(CameraFilter)”方法。您可以使用“CameraFilter”通过“CameraInfo”过滤摄像机,或其子类“Camera2CameraFilter”通过其 id 和“CameraCharacteristics”过滤摄像机。如果您要询问特定的用例,您可以为其创建一个新问题,如果可以的话,我将很乐意提供帮助。 (2认同)