java 如何实现拍照
使用 Android Camera API 实现拍照
在 Android 应用中实现拍照功能,可以通过 Camera API 或 CameraX 库来完成。以下是两种常见方法的实现步骤。
使用 Camera API
-
添加权限 在
AndroidManifest.xml中添加相机和存储权限:<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> -
检查权限 在 Activity 中动态请求权限:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION); } -
打开相机 使用
Camera.open()获取相机实例:
Camera camera = Camera.open(); -
设置预览 将相机预览绑定到
SurfaceView:Camera.Parameters params = camera.getParameters(); camera.setParameters(params); camera.setPreviewDisplay(surfaceHolder); camera.startPreview(); -
拍照并保存 调用
takePicture()方法:camera.takePicture(null, null, new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { File pictureFile = new File(Environment.getExternalStorageDirectory(), "photo.jpg"); try { FileOutputStream fos = new FileOutputStream(pictureFile); fos.write(data); fos.close(); } catch (IOException e) { e.printStackTrace(); } } });
使用 CameraX 库
-
添加依赖 在
build.gradle中添加 CameraX 依赖:
implementation "androidx.camera:camera-core:1.0.0" implementation "androidx.camera:camera-camera2:1.0.0" implementation "androidx.camera:camera-lifecycle:1.0.0" implementation "androidx.camera:camera-view:1.0.0" -
配置预览 创建
PreviewView并绑定生命周期:PreviewView previewView = findViewById(R.id.previewView); ListenableFuture<ProcessCameraProvider> cameraProviderFuture = ProcessCameraProvider.getInstance(this);
cameraProviderFuture.addListener(() -> { try { ProcessCameraProvider cameraProvider = cameraProviderFuture.get(); Preview preview = new Preview.Builder().build(); preview.setSurfaceProvider(previewView.getSurfaceProvider());
CameraSelector cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA;
cameraProvider.unbindAll();
cameraProvider.bindToLifecycle(
this, cameraSelector, preview);
} catch (Exception e) {
e.printStackTrace();
}
}, ContextCompat.getMainExecutor(this));
3. 拍照实现
创建 `ImageCapture` 实例并调用 `takePicture()`:
```java
ImageCapture imageCapture = new ImageCapture.Builder()
.setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
.build();
cameraProvider.bindToLifecycle(
this, cameraSelector, preview, imageCapture);
imageCapture.takePicture(
ContextCompat.getMainExecutor(this),
new ImageCapture.OnImageCapturedCallback() {
@Override
public void onCaptureSuccess(ImageProxy image) {
// 处理拍照结果
super.onCaptureSuccess(image);
}
});
注意事项
- 权限处理:Android 6.0 以上需要动态请求权限。
- 生命周期管理:CameraX 自动处理生命周期,而 Camera API 需手动释放资源。
- 存储路径:Android 10 及以上版本需使用
MediaStore保存文件。
以上方法适用于大多数 Android 设备,CameraX 是推荐方案,因其更简洁且兼容性更好。






