当前位置:首页 > 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 是推荐方案,因其更简洁且兼容性更好。

分享给朋友:

相关文章

vue底层如何实现

vue底层如何实现

Vue 底层的核心实现机制 Vue 的底层实现主要依赖于响应式系统、虚拟 DOM 和组件化设计。以下是其关键实现原理: 响应式系统 Vue 使用 Object.defineProperty(Vue…

vue如何实现排序

vue如何实现排序

实现数组排序 在Vue中实现数组排序可以通过computed属性或methods来处理。假设有一个数组items,可以创建一个计算属性返回排序后的数组: data() { return {…

vue如何实现到期提醒

vue如何实现到期提醒

实现思路 在Vue中实现到期提醒功能,可以通过计算日期差、定时检查和通知用户三个核心步骤完成。需要结合Vue的响应式特性和JavaScript的日期处理能力。 计算日期差 使用JavaScr…

js双击事件如何实现

js双击事件如何实现

实现双击事件的方法 在JavaScript中,可以通过监听dblclick事件或手动检测两次点击的时间间隔来实现双击事件。以下是几种常见的方法: 使用原生dblclick事件 element…

react如何实现混入

react如何实现混入

在React中实现混入(Mixin)功能可以通过以下几种方式实现,React官方已不推荐使用传统的React.createClass混入方式,但可通过高阶组件或自定义Hook替代。 高阶组件(HOC…

java如何输出数组

java如何输出数组

输出数组的方法 在Java中,输出数组内容有多种方式,具体取决于数组类型和输出格式需求。以下是几种常见的方法: 使用Arrays.toString()方法 适用于一维数组,直接调用Arrays.to…