<uses-feature android:name="android.hardware.camera2.full" />
时间: 2025-06-29 17:12:02 浏览: 13
### 使用 `android.hardware.camera2` API 进行高级功能开发
#### 概述
`android.hardware.camera2.full` 是指支持完整的 Camera2 接口的设备,这些接口提供了更强大的控制能力以及更高的性能。为了利用此特性,开发者可以遵循特定的工作流程来访问和操作相机硬件。
#### 设备兼容性检测
在尝试使用任何高级功能之前,应该先确认当前运行的应用程序所在的设备是否声明了对完整版 Camera2 API 的支持:
```java
CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);
Boolean available = characteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_REQUEST_KEYS);
if (available != null && !available.contains("android.request.maxNumOutputStreams")) {
Log.w(TAG, "This device does not support the full camera2 api");
}
```
#### 获取高分辨率输出配置模式
某些高端手机可能提供更高分辨率的照片拍摄选项,这取决于制造商的支持情况。通过查询 `SCALER_STREAM_CONFIGURATION_MAP` 可以得知具体的参数范围和支持的能力集:
```java
StreamConfigurationMap map = characteristics.get(
CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
Size[] outputSizes = map.getOutputSizes(ImageFormat.JPEG);
// Choose an appropriate size based on your needs...
```
#### 设置复杂的捕捉请求
当涉及到诸如连拍模式、HDR 效果或者其他特殊效果时,则需要构建更为复杂的一次性或重复性的捕捉请求。下面是一个简单的例子展示了如何创建一个带有自动曝光锁定特性的静态照片捕捉会话:
```java
CaptureRequest.Builder captureBuilder =
cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
captureBuilder.addTarget(imageReader.getSurface());
// Enable auto-focus and AE lock before taking picture.
captureBuilder.set(CaptureRequest.CONTROL_AF_MODE,
CaptureRequest.CONTROL_AF_MODE_AUTO);
captureBuilder.set(CaptureRequest.CONTROL_AE_LOCK, true);
List<Surface> surfaces = new ArrayList<>();
surfaces.add(imageReader.getSurface());
cameraDevice.createCaptureSession(surfaces, sessionCallback, backgroundHandler);
```
#### 处理不同方向下的预览显示
针对前后摄像头的不同需求,在设置预览界面的方向时需要注意调整相应的旋转角度。对于前置摄像头而言,还需要考虑镜像反转的问题[^4]。
```java
int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0: degrees = 0; break;
case Surface.ROTATION_90: degrees = 90; break;
case Surface.ROTATION_180: degrees = 180; break;
case Surface.ROTATION_270: degrees = 270; break;
}
boolean isFrontFacing = ... ; // Determine whether it's front-facing or back-facing here.
Matrix matrix = new Matrix();
matrix.postRotate(degrees);
if(isFrontFacing){
matrix.preScale(-1f, 1f); // Mirror horizontally for selfie viewfinder only
}
textureView.setTransform(matrix);
```
阅读全文
相关推荐


















