当前位置:首页 > Java

java 如何实现拍照

2026-03-25 05:41:12Java

使用 Android Camera API 实现拍照

在 Android 应用中实现拍照功能,可以通过 Camera API 或 CameraX 库来完成。以下是两种常见方法的实现步骤。

使用 Camera API

  1. 添加权限AndroidManifest.xml 中添加相机和存储权限:

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  2. 检查权限 在 Activity 中动态请求权限:

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) 
     != PackageManager.PERMISSION_GRANTED) {
     ActivityCompat.requestPermissions(this, 
         new String[]{Manifest.permission.CAMERA}, 
         REQUEST_CAMERA_PERMISSION);
    }
  3. 打开相机 使用 Camera.open() 获取相机实例:

    java 如何实现拍照

    Camera camera = Camera.open();
  4. 设置预览 将相机预览绑定到 SurfaceView

    Camera.Parameters params = camera.getParameters();
    camera.setParameters(params);
    camera.setPreviewDisplay(surfaceHolder);
    camera.startPreview();
  5. 拍照并保存 调用 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 库

  1. 添加依赖build.gradle 中添加 CameraX 依赖:

    java 如何实现拍照

    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"
  2. 配置预览 创建 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 是推荐方案,因其更简洁且兼容性更好。

分享给朋友:

相关文章

java如何

java如何

Java 基础语法 Java 是一种面向对象的编程语言,语法相对严谨。每个 Java 程序必须包含一个 main 方法作为程序入口。以下是一个简单的 Java 程序示例: public class…

java如何读取文件

java如何读取文件

读取文件的常用方法 Java提供了多种读取文件的方式,适用于不同场景和需求。以下是几种常见的方法: 使用FileInputStream和BufferedInputStream读取二进制文件…

vue如何实现增删

vue如何实现增删

使用 Vue 实现增删功能 在 Vue 中实现增删功能通常涉及数据绑定、事件处理和列表渲染。以下是具体实现方法: 数据定义与初始化 在 Vue 组件的 data 选项中定义数组来存储需要操作的数据项…

java如何输入数据

java如何输入数据

输入数据的方法 在Java中,输入数据可以通过多种方式实现,具体取决于输入来源(如控制台、文件、网络等)。以下是几种常见的方法: 使用Scanner类从控制台输入 Scanner类是Java中最常用…

java如何删除文件

java如何删除文件

删除文件的基本方法 使用 java.io.File 类的 delete() 方法可以删除文件。如果文件存在且删除成功,返回 true;否则返回 false。 import java.io.Fil…

如何配置java环境变量

如何配置java环境变量

下载并安装JDK 从Oracle官网或OpenJDK项目下载适合操作系统的JDK安装包。运行安装程序,按照提示完成安装,默认路径通常为C:\Program Files\Java\jdk-版本号。 配…