android获取相机的大小,如何在Android设备中获取相机传感器尺寸?

从API级别21开始是可能的.从文档(

https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#SENSOR_INFO_PHYSICAL_SIZE):

public static final Key SENSOR_INFO_PHYSICAL_SIZE

The physical dimensions of the full pixel array. […]

Units: Millimeters

我用这种代码.请注意,可能不仅仅是一台摄像头:

import android.hardware.camera2.CameraAccessException;

import android.hardware.camera2.CameraCharacteristics;

import android.hardware.camera2.CameraManager;

private SizeF getCameraResolution(int camNum)

{

SizeF size = new SizeF(0,0);

CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);

try {

String[] cameraIds = manager.getCameraIdList();

if (cameraIds.length > camNum) {

CameraCharacteristics character = manager.getCameraCharacteristics(cameraIds[camNum]);

size = character.get(CameraCharacteristics.SENSOR_INFO_PHYSICAL_SIZE);

}

}

catch (CameraAccessException e)

{

Log.e("YourLogString", e.getMessage(), e);

}

return size;

}

请注意,需要捕获Exception CameraAccessException.

别忘了添加< uses-sdk android:minSdkVersion =“21”/>到你的清单.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用Camera2 API从相机获取帧的简单示例: 首先,在您的AndroidManifest.xml文件添加相机权限: ```xml <uses-permission android:name="android.permission.CAMERA" /> ``` 然后,在您的Service类,创建一个CameraDevice.StateCallback对象来处理相机状态: ```java private CameraDevice.StateCallback mCameraDeviceCallback = new CameraDevice.StateCallback() { @Override public void onOpened(CameraDevice camera) { mCameraDevice = camera; // 相机已经打开,可以开始预览 startPreview(); } @Override public void onDisconnected(CameraDevice camera) { // 相机被断开连接,需要释放资源 releaseCamera(); } @Override public void onError(CameraDevice camera, int error) { // 发生错误,需要释放资源 releaseCamera(); } }; ``` 然后,在您的Service类,创建一个CameraCaptureSession.StateCallback对象来处理捕获会话状态: ```java private CameraCaptureSession.StateCallback mCaptureSessionCallback = new CameraCaptureSession.StateCallback() { @Override public void onConfigured(CameraCaptureSession session) { mCaptureSession = session; try { // 设置捕获请求 mCaptureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); mCaptureRequestBuilder.addTarget(mImageReader.getSurface()); // 开始捕获 mCaptureSession.setRepeatingRequest(mCaptureRequestBuilder.build(), null, null); } catch (CameraAccessException e) { e.printStackTrace(); } } @Override public void onConfigureFailed(CameraCaptureSession session) { // 配置会话失败,需要释放资源 releaseCamera(); } }; ``` 接下来,在您的Service类,创建一个ImageReader对象来获取相机帧: ```java private void createImageReader() { mImageReader = ImageReader.newInstance(mPreviewSize.getWidth(), mPreviewSize.getHeight(), ImageFormat.YUV_420_888, 2); mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() { @Override public void onImageAvailable(ImageReader reader) { // 获取最新的帧 Image image = reader.acquireLatestImage(); if (image != null) { // 处理帧 processImage(image); // 释放帧 image.close(); } } }, null); } ``` 最后,在您的Service类,创建一个相机管理器对象来打开相机并开始捕获: ```java private void openCamera() { CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); try { // 获取可用的相机列表 String[] cameraIds = cameraManager.getCameraIdList(); for (String cameraId : cameraIds) { CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId); if (characteristics.get(CameraCharacteristics.LENS_FACING) == CameraCharacteristics.LENS_FACING_BACK) { // 找到后置相机 mCameraId = cameraId; break; } } // 获取预览尺寸 StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); mPreviewSize = map.getOutputSizes(SurfaceTexture.class)[0]; // 打开相机 cameraManager.openCamera(mCameraId, mCameraDeviceCallback, null); } catch (CameraAccessException e) { e.printStackTrace(); } } private void startPreview() { try { // 创建捕获会话 mCameraDevice.createCaptureSession(Arrays.asList(mImageReader.getSurface()), mCaptureSessionCallback, null); } catch (CameraAccessException e) { e.printStackTrace(); } } private void releaseCamera() { if (mCaptureSession != null) { mCaptureSession.close(); mCaptureSession = null; } if (mCameraDevice != null) { mCameraDevice.close(); mCameraDevice = null; } if (mImageReader != null) { mImageReader.close(); mImageReader = null; } } private void processImage(Image image) { // 处理相机帧 } ``` 这个示例演示了如何从相机获取帧。您可以在processImage()方法处理帧。例如,您可以使用OpenCV库进行图像处理,或将帧发送到服务器进行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值