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

Android Java如何获取相机焦距(适配API 21+,含camera2相关问题)

报错原因

你遇到的编译错误是因为getFocalLength()是Camera.Parameters的实例方法,而非静态方法,不能直接通过类名调用,必须基于从已打开的相机实例中获取到的参数对象调用。

Non-static method 'getFocalLength()' cannot be referenced from a static context

适配API 21+的正确实现方案

推荐使用官方推荐的Camera2 API实现,无需依赖已经废弃的旧Camera框架,具体实现逻辑如下:

Camera2 API 获取焦距步骤

Camera2中焦距参数存储在相机特性对象CameraCharacteristics中,对应的键为LENS_INFO_AVAILABLE_FOCAL_LENGTHS,返回值为该相机支持的所有焦距值数组(单位为毫米),绝大多数消费级设备主摄仅返回1个有效值。

代码示例

import android.content.Context;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraManager;
import android.os.Build;

import androidx.annotation.RequiresApi;

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private float getCameraFocalLength(Context context, String targetCameraId) throws CameraAccessException {
    CameraManager cameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
    // 若未指定相机ID,可默认取后置主摄,对应ID通常为"0"
    String cameraId = targetCameraId == null ? "0" : targetCameraId;
    CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId);
    float[] focalLengths = characteristics.get(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS);
    // 返回第一个有效值,多摄设备可根据需要选择对应相机ID的焦距
    return focalLengths != null && focalLengths.length > 0 ? focalLengths[0] : 0f;
}

注意事项

  • 调用前需要先申请android.permission.CAMERA权限,Android 6.0及以上需要动态申请
  • 如果需要获取前置相机的焦距,将相机ID替换为"1"即可,具体ID可以遍历CameraManager.getCameraIdList()获取

旧Camera API 修正方案(仅兼容API 21以下场景使用)

如果你的项目需要兼容更低版本系统,可以修正原有代码,注意该框架在API 21后已被官方废弃:

import android.hardware.Camera;

@SuppressWarnings("deprecation")
private float getFocalLengthHere() {
    Camera camera = null;
    try {
        // 打开后置相机
        camera = Camera.open();
        Camera.Parameters parameters = camera.getParameters();
        return parameters.getFocalLength();
    } catch (Exception e) {
        e.printStackTrace();
        return 0f;
    } finally {
        if (camera != null) {
            camera.release();
        }
    }
}

注意:旧API调用会直接打开相机,请勿在主线程执行,避免阻塞UI。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 04:36:03