Android平台上的摄像应用可以让我们在智能手机上拍照或拍摄视频。它们使用了底层的摄像头API,并提供了许多功能和操作,例如从预览到拍摄、闪光灯控制等。
Android上的摄像功能可以通过Java Camera2 API和Android底层Ndk Camera API实现。Java Camera2 API仅支持Android 5.0以上的版本,而Ndk Camera API可以支持使用C/C++编程语言的开发环境,使得摄像应用可以利用硬件资源更好地执行。
Android摄像应用的主要原理是将摄像头传感器捕获的数据转换为可识别的数字信号,然后将其编码为各种格式的图像和视频数据,可以存储到设备上的文件系统中、在屏幕上预览。为了实现这些功能,摄像应用必须使用以下四个组件:
1. CameraManager: 连接与摄像头硬件的抽象对象,以便打开摄像头,提供摄像头特性列表和其他有关硬件的信息。
2. CameraDevice: 连接到并控制硬件摄像头的对象。
3. CameraCaptureSession: 用于配置捕获请求和预览会话。
4. CaptureRequest: 包含如何捕获图像或视频的全局配置。
下面我们来看看如何使用Java Camera2 API构建一个Android摄像应用。首先,在AndroidManifest.xml中添加以下权限:
```
接下来,需要在应用的布局XML文件中添加一个TextureView或SurfaceView来显示预览:
```
android:id="@+id/camera_preview" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 然后在Activity中创建一个CameraManager对象并连接到设备摄像头。在CameraDevice.StateCallback回调对象的方法中打开摄像头。 ``` private CameraManager cameraManager; private String cameraId; private CameraDevice cameraDevice; private TextureView textureView; //... cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); textureView = findViewById(R.id.camera_preview); // 获取设备摄像头ID cameraId = cameraManager.getCameraIdList()[0]; // 打开设备摄像头 cameraManager.openCamera(cameraId, new CameraDevice.StateCallback() { @Override public void onOpened(CameraDevice camera) { cameraDevice = camera; // 开始捕获图像 startPreview(); } @Override public void onDisconnected(CameraDevice camera) { cameraDevice.close(); } @Override public void onError(CameraDevice camera, int error) { cameraDevice.close(); } }, null); ``` 创建CaptureRequest.Builder对象来设置捕获会话并创建CameraCaptureSession。在会话的CaptureCallback回调对象的方法中处理捕获器请求。 ``` private CameraCaptureSession cameraCaptureSession; private CaptureRequest.Builder requestBuilder; //... // 创建捕获请求构建器 requestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); // 设置自动对焦,闪光灯和其他设置 requestBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO); // 创建一个会话来处理预览和其他会话 cameraDevice.createCaptureSession(Collections.singletonList(textureView.getSurface()), new CameraCaptureSession.StateCallback() { @Override public void onConfigured(CameraCaptureSession session) { cameraCaptureSession = session; try { // 设置捕获请求 requestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); cameraCaptureSession.setRepeatingRequest(requestBuilder.build(), null, null); } catch (CameraAccessException e) { e.printStackTrace(); } } @Override public void onConfigureFailed(CameraCaptureSession session) {} }, null); ``` 最后,在Activity生命周期结束时关闭摄像头并释放资源。 ``` @Override protected void onPause() { super.onPause(); // 停止预览并释放资源 if (cameraCaptureSession != null) { cameraCaptureSession.close(); cameraCaptureSession = null; } if (cameraDevice != null) { cameraDevice.close(); cameraDevice = null; } } ``` 以上是一个简单的使用Java Camera2 API构建Android摄像应用的步骤。学会这个,你可以自己更加深入地开发和应用摄像应用。