You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过CameraX/Camera2访问三星设备全部摄像头及长焦镜头?

关于调用三星设备长焦摄像头的问题

我观察到三星原生相机在放大到2.0或3.0倍时会切换至长焦镜头,想在自己的应用里实现同样功能。目前用CameraX/Camera2 API只能识别到广角和默认镜头,请问能不能调用三星的长焦摄像头?

我的代码如下:

val backCameras = cameraInfos.filterIsInstance<Camera2CameraInfoImpl>()
                .filter {
                    val pixelWidth = it.cameraCharacteristicsCompat.get(
                        CameraCharacteristics.SENSOR_INFO_PIXEL_ARRAY_SIZE
                    )?.width ?: 0
                    it.lensFacing == CameraSelector.LENS_FACING_BACK && pixelWidth >= 2000 
                }
for (cam in backCameras) {
                Logger.debug("cam test", "-----${cam.camera2CameraInfo.cameraId}")
                cam.camera2CameraInfo.getCameraCharacteristic(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS)
                    ?.iterator()?.forEach {
                    Logger.debug("cam test", "-----${it}")
                }
            }

分析与解决方法

  • 过滤条件有误,可能漏掉长焦镜头:你当前用pixelWidth >= 2000作为筛选条件,但这个限制没有针对性——长焦镜头的传感器像素宽度不一定都满足这个值,而且部分三星设备的长焦镜头是以变焦附属镜头形式存在,而非独立cameraId。建议去掉像素宽度限制,改用焦距特征来识别。

  • 换用焦距判断更准确:长焦镜头的焦距通常是主镜头基础焦距的2倍或3倍,你可以通过LENS_INFO_AVAILABLE_FOCAL_LENGTHS来筛选。修改后的代码逻辑如下:

val cameraProvider = ProcessCameraProvider.getInstance(context).get()
val backSelector = CameraSelector.Builder()
    .requireLensFacing(CameraSelector.LENS_FACING_BACK)
    .build()

cameraProvider.getAvailableCameraInfos(backSelector).forEach { info ->
    val focalLengths = info.getCameraCharacteristic(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS) ?: return@forEach
    val baseFocalLength = focalLengths.first()
    focalLengths.forEach { fl ->
        // 长焦镜头焦距通常是基础焦距的1.8倍以上
        if (fl / baseFocalLength >= 1.8) {
            Logger.debug("cam test", "找到长焦镜头:ID=${info.cameraId},焦距=${fl}")
        }
    }
}
  • 注意部分设备的镜头切换逻辑:有些三星设备的长焦镜头并非独立cameraId,而是和主镜头共用一个硬件单元,通过变焦范围自动切换。这种情况下无需选择不同摄像头,只需控制相机变焦比例到2.0x或3.0x,系统会自动触发镜头切换:
val preview = Preview.Builder().build()
val camera = cameraProvider.bindToLifecycle(this, backSelector, preview)
camera.cameraControl.setZoomRatio(2.0f)
  • 检查权限与兼容性:确保已申请android.permission.CAMERA动态权限且用户已授权,Android 10及以上版本还需确认权限申请流程合规。大部分三星主流机型都支持CameraX/Camera2访问长焦镜头,少数旧机型可能存在限制。

内容的提问来源于stack exchange,提问作者Droid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 08:03:24