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
相关产品推荐
相关产品推荐

