Android 系统调用相机并保存图像的专业指南341
Android 系统提供了全面的应用程序编程接口 (API),允许开发人员在他们的应用程序中集成系统功能,其中包括访问和控制设备相机并保存图像。
Camera2 API
在较新的 Android 版本中,使用 Camera2 API 可以访问相机功能。Camera2 API 提供了对相机功能和图像处理管道的低级别控制,从而实现更高的性能、自定义和灵活性。
要使用 Camera2 API,需要执行以下步骤:1. 创建 CameraManager:获取设备相机管理器的实例。
2. 打开相机设备:使用 CameraManager 打开相机设备。
3. 创建 CaptureRequest:指定图像捕获设置的捕获请求。
4. 创建 ImageReader:创建一个图像读取器来处理捕获的图像。
5. 注册图像读取器:将图像读取器注册到相机设备,以便接收捕获到的图像。
6. 开始捕获序列:开始捕获序列以触发图像捕获。
7. 获取图像:从图像读取器获取捕获到的图像。
CameraX 库
对于希望更轻松地集成相机功能的开发人员,可以使用 CameraX 库。CameraX 提供了一个高级别 API,简化了以下任务:* 相机设备生命周期管理
* 图像捕获配置
* 图像处理和保存
要使用 CameraX,需要执行以下步骤:1. 导入依赖项:在项目的构建文件中添加 CameraX 依赖项。
2. 创建 CameraSource:创建一个 CameraSource 对象来表示相机设备。
3. 绑定生命周期:将 CameraSource 的生命周期绑定到活动或片段。
4. 启动预览:启动相机预览。
5. 捕获图像:通过 CameraSource API 使用 ImageCapture 捕获图像。
保存图像
捕获图像后,需要将其保存到设备存储中。可以使用以下方法保存图像:* 使用存储访问框架 (SAF):SAF 提供了一种标准化的方式来访问设备存储,包括创建和管理文件。
* 使用 FileOutputStream:直接写入文件系统以保存图像。
* 使用第三方库:使用第三方库,如 Glide 或 Picasso,来处理图像加载和保存。
示例代码
下面是一个使用 Camera2 API 捕获和保存图像的示例代码:```java
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
public class MainActivity extends AppCompatActivity {
private static final int CAMERA_REQUEST_CODE = 100;
private PreviewView previewView;
@Override
protected void onCreate(Bundle savedInstanceState) {
(savedInstanceState);
setContentView(.activity_main);
previewView = findViewById();
// 检查相机权限
if ((this, ) != PackageManager.PERMISSION_GRANTED) {
(this, new String[]{}, CAMERA_REQUEST_CODE);
} else {
startCamera();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
(requestCode, permissions, grantResults);
if (requestCode == CAMERA_REQUEST_CODE && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
startCamera();
}
}
private void startCamera() {
// 创建相机提供程序
ProcessCameraProvider cameraProvider = new ProcessCameraProvider();
// 选择后置摄像头
CameraSelector cameraSelector = new ()
.requireLensFacing(CameraSelector.LENS_FACING_BACK)
.build();
// 创建预览用例
Preview preview = new ()
.build();
// 创建图像捕获用例
ImageCapture imageCapture = new ()
.build();
// 创建图像分析用例
ImageAnalysis imageAnalysis = new ()
.build();
// 绑定用例到生命周期
((LifecycleOwner) this, cameraSelector, preview, imageCapture, imageAnalysis);
// 设置预览
(());
// 设置图像捕获回调
(ImageCapture.CAPTURE_MODE_MAXIMIZE_QUALITY);
(new () {
@Override
public void onCaptureSuccess(@NonNull ImageProxy image) {
// 获取图像数据
ByteBuffer buffer = ()[0].getBuffer();
byte[] bytes = new byte[()];
(bytes);
// 保存图像
saveImage(bytes);
// 释放图像
();
}
@Override
public void onError(@NonNull error) {
Log.e("MainActivity", "Error capturing image: " + ());
}
});
}
private void saveImage(byte[] bytes) {
// 创建图片文件
File file = new File((), "");
// 写入文件
try {
FileOutputStream outputStream = new FileOutputStream(file);
(bytes);
();
} catch (IOException e) {
Log.e("MainActivity", "Error saving image: " + ());
}
}
}
```
2024-10-18
上一篇:国产 Linux 系统:全面解析