当前位置: 首页 > 知识库问答 >
问题:

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

曾航
2023-03-14

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

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

相关代码:

/** Declare and bind preview, capture and analysis use cases */
private fun bindCameraUseCases() {

    // Get screen metrics used to setup camera for full screen resolution
    val metrics = DisplayMetrics().also { viewFinder.display.getRealMetrics(it) }
    Log.d(TAG, "Screen metrics: ${metrics.widthPixels} x ${metrics.heightPixels}")

    val screenAspectRatio = aspectRatio(metrics.widthPixels, metrics.heightPixels)
    Log.d(TAG, "Preview aspect ratio: $screenAspectRatio")

    val rotation = viewFinder.display.rotation

    // Bind the CameraProvider to the LifeCycleOwner

    val cameraSelector = CameraSelector.Builder().requireLensFacing(lensFacing).build()

    val cameraProviderFuture = ProcessCameraProvider.getInstance(requireContext())
    cameraProviderFuture.addListener(Runnable {

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

        // Preview
        preview = Preview.Builder()
            // We request aspect ratio but no resolution
            .setTargetAspectRatio(screenAspectRatio)
            // Set initial target rotation
            .setTargetRotation(rotation)
            .build()

        // ImageCapture
        imageCapture = ImageCapture.Builder()
            .setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
            // We request aspect ratio but no resolution to match preview config, but letting
            // CameraX optimize for whatever specific resolution best fits our use cases
            .setTargetAspectRatio(screenAspectRatio)
            // Set initial target rotation, we will have to call this again if rotation changes
            // during the lifecycle of this use case
            .setTargetRotation(rotation)
            .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, preview, imageCapture /**, imageAnalyzer*/)

            // Attach the viewfinder's surface provider to preview use case
            preview?.setSurfaceProvider(viewFinder.createSurfaceProvider(camera?.cameraInfo))
        } catch(exc: Exception) {
            Log.e(TAG, "Use case binding failed", exc)
        }

    }, ContextCompat.getMainExecutor(requireContext()))
}

共有2个答案

潘彦
2023-03-14

我有一个类似的问题,但与后摄像头。我检查了一些设备,发现在我所有测试的设备上,我都可以选择摄像头id并获得正确的摄像头:

  • 摄像头ID“0”-

所以我创建了一个自定义的相机过滤器,我过滤相机id"0":

class CameraIdFilter(private val cameraId: String) : CameraFilter {

override fun filterCameras(cameras: Set<CameraInternal>): Set<CameraInternal> {
    val resultCameras: MutableSet<CameraInternal> = LinkedHashSet()
    for (camera in cameras) {
        val cameraId = camera.cameraInfoInternal.cameraId
        if (cameraId == this.cameraId) {
            resultCameras.add(camera)
        }
    }
    return resultCameras
}

}

并将过滤器附加到摄影机选择器:

        val cameraSelectorBuilder = CameraSelector.Builder()
            .requireLensFacing(lensFacing)
            .appendFilter(CameraIdFilter("0"))

我不建议在生产应用程序中使用此功能,因为我确信有些设备不遵循此约定/模式。但您可以将其用于内部应用程序,以便了解用户使用的设备

华坚成
2023-03-14

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

CameraSelectorAPI似乎仍有增长空间,因此在未来,您可能会对选择哪个摄像头有更多的控制权。如果您现在需要这种控制,您可能需要使用Camera2。

 类似资料:
  • 问题内容: 我正在使用来开发iPad2中的前置摄像头应用程序。 当我捕获图像时,它显示为从左向右翻转。 我该如何纠正? 问题答案: 您可以使用源图像翻转图像 编辑: 添加了快速代码

  • 后摄像头工作正常,但是,当我们从后摄像头切换到前摄像头时,它会崩溃(在使用MediaCorder录制视频的情况下)....它显示了我在日志中显示的错误!! 下面是我的代码: 对于初始化,我使用

  • 我们希望使用后摄像头进行扫描,并选择正确的后摄像头-主摄像头,而不是宽镜头摄像头。 较新的移动设备(例如三星galaxy s10)有几个前后摄像头。调用enumerateDevices()时,我们会得到前后摄像头的列表。我们想从后摄像机列表中选择主摄像机。我们可以使用约束来选择后置摄像机(面向:“环境”),但我们不知道如何区分每个设备的摄像机是主摄像机还是宽镜头摄像机。

  • 问题内容: 在iOS 10发布之前,我使用以下代码获取录像机的视频和音频捕获: 当iOS 10最终问世时,我在运行代码时收到以下警告。请注意,我的录像机仍可以正常运行约2周。 在iOS 10.0中不建议使用“ devices()”:请改用AVCaptureDeviceDiscoverySession。 今天早上运行代码时,录像机停止工作。xCode8没有给我任何错误,但是相机捕获的PreviewL

  • 本文向大家介绍Android中判断是否有前置摄像头、后置摄像头的方法,包括了Android中判断是否有前置摄像头、后置摄像头的方法的使用技巧和注意事项,需要的朋友参考一下 通常我们进行摄像头操作,如扫描二维码需要判断是否有后置摄像头(Rear camera),比如Nexus 7 一代就没有后置摄像头,这样在尝试使用的时候,我们需要进行判断进行一些提示或者处理。 以下代码为一系列的方法,用来判断是否