文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

【Android】使用 CameraX 实现基础拍照功能

2023-10-10 16:42

关注

目录

1. 基础开发环境

2. 添加相关依赖

3. APP 布局

4. 主流程逻辑

5. 调试或安装 APK

6. 项目完整代码


1. 基础开发环境

JDK:JDK17

Android Studio:Android Studio Giraffe | 2022.3.1

Android SDK:Android API 34

Gradle: gradle-7.2-bin.zip

CameraX Version: 1.1.0-alpha05

2. 添加相关依赖

在 build.gradle 中添加 CameraX 的相关依赖

    // *** Camera 相关依赖 ***    def cameraxVersion = "1.1.0-alpha05";    implementation "androidx.camera:camera-core:${cameraxVersion}"    implementation "androidx.camera:camera-camera2:${cameraxVersion}"    implementation "androidx.camera:camera-lifecycle:${cameraxVersion}"    implementation 'androidx.camera:camera-view:1.0.0-alpha25'    // ***********************

在 AndroidManifest.xml 文件中注册相机权限

                                    

3. APP 布局

使用 LinearLayout 布局,其中添加一个 PreviewView 用来显示相机画面的预览,添加一个 Button 用来控制拍照。

        
    camera-image-capture    拍照

4. 主流程逻辑

package com.example.capture;import android.content.ContentValues;import android.os.Bundle;import android.provider.MediaStore;import android.view.View;import android.widget.Button;import android.widget.Toast;import androidx.annotation.NonNull;import androidx.appcompat.app.AppCompatActivity;import androidx.camera.core.CameraSelector;import androidx.camera.core.ImageCapture;import androidx.camera.core.ImageCaptureException;import androidx.camera.core.Preview;import androidx.camera.lifecycle.ProcessCameraProvider;import androidx.camera.view.PreviewView;import androidx.core.content.ContextCompat;import com.google.common.util.concurrent.ListenableFuture;import java.util.concurrent.ExecutionException;public class MainActivity extends AppCompatActivity implements View.OnClickListener {    private ListenableFuture processCameraProviderListenableFuture;    PreviewView previewView;    Button captureButton;    private ImageCapture imageCapture;    @Override    protected void onCreate(Bundle savedInstanceState) {        // onCreate 在活动被创建时被调用的。        // 它的作用是对活动进行初始化,例如加载布局文件,设置事件监听器和初始化变量等。        // `Bundle savedInstanceState` 参数用于保存活动状态,以便在活动被销毁后能够恢复它的状态。        super.onCreate(savedInstanceState);        // 将指定的布局文件加载到当前 Activity 中并显示在屏幕上。        setContentView(R.layout.activity_main);        // 从当前布局中查找具有指定 ID 的视图,并将其返回为 Java 对象。        previewView = findViewById(R.id.previewView);        captureButton = findViewById(R.id.captureButton);        // 将当前类实现的 OnClickListener 接口设置为 captureButton 的点击事件监听器,        // 以便在单击 captureButton 时调用类中的 onClick() 方法来处理点击事件。        captureButton.setOnClickListener(this);        // 这行代码的作用是获取相机提供者的实例,它是使用 Android CameraX API 实现相机功能的关键对象之一,        // 通过它可以获取相机设备、预览用例、图像分析用例等等,从而实现相机应用的各种功能。        // 此代码返回一个ListenableFuture对象,用于异步获取相机提供者的实例。        processCameraProviderListenableFuture = ProcessCameraProvider.getInstance(this);        // 监听摄像头的准备情况。准备好时,该代码块中的 start() 方法将被调用,以便启动相机。        processCameraProviderListenableFuture.addListener(() -> {            try {                ProcessCameraProvider processCameraProvider = processCameraProviderListenableFuture.get();                start(processCameraProvider);            } catch (ExecutionException | InterruptedException e) {                throw new RuntimeException(e);            }            // 将监听器绑定到主线程,以确保在 UI 上下文中运行该代码块。        }, ContextCompat.getMainExecutor(this));    }    private void start(ProcessCameraProvider processCameraProvider) {        // 取消当前已经绑定的摄像头设备,释放它们的资源,以便其他应用或者进程可以使用这些摄像头设备。        // 这个方法通常在摄像头应用程序退出或者暂停时调用,以确保摄像头设备不会一直占用系统资源。        processCameraProvider.unbindAll();        // 创建一个相机选择器对象,并指定选择前置摄像头。        CameraSelector cameraSelector = new CameraSelector.Builder()                .requireLensFacing(CameraSelector.LENS_FACING_FRONT)                .build();        // 创建一个相机预览对象        // 并将其与一个 SurfaceView 组件(previewView)的 SurfaceProvider 绑定,从而在该组件上显示相机预览画面。        Preview preview = new Preview.Builder().build();        preview.setSurfaceProvider(previewView.getSurfaceProvider());        // 创建一个 ImageCapture 对象,用于拍摄照片。        // 设置拍照模式为最小化延迟模式,这意味着拍照时将尽可能快地捕获图像。        imageCapture = new ImageCapture.Builder()                .setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)                .build();        // 在 Android 设备上启动相机,并将其与当前生命周期绑定,以便在应用程序暂停或停止时释放相机资源。        // 该方法接受一个 `CameraSelector` 对象用于选择相机设备,一个 `Preview` 对象用于显示预览,以及一个 `ImageCapture` 对象用于捕获图像。        processCameraProvider.bindToLifecycle(this, cameraSelector, preview, imageCapture);    }    @Override    public void onClick(View view) {        // onClick(View view) 的作用是为按钮或其他视图设置点击事件处理程序。        // 当用户点击该视图时,该方法会被调用并执行其中的代码。        if (view.getId() == R.id.captureButton) {            captureImage();        }    }    private void captureImage() {        long timeStamp = System.currentTimeMillis();        // 通过 ContentValues 对象设置文件名和文件类型        ContentValues contentValues = new ContentValues();        contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, timeStamp);        contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg");        imageCapture.takePicture(                // 第一个参数 OutputFileOptions 指定了照片保存的位置和格式等信息。                new ImageCapture.OutputFileOptions.Builder(                        getContentResolver(),                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI,                        contentValues                ).build(),                // 第二个参数 Executor 指定了保存照片时要运行的线程。                ContextCompat.getMainExecutor(this),                // 第三个参数 OnImageSavedCallback 指定了保存照片完成后的回调函数,可以在其中进行一些提示或其他操作。                new ImageCapture.OnImageSavedCallback() {                    @Override                    public void onImageSaved(@NonNull ImageCapture.OutputFileResults outputFileResults) {                        Toast.makeText(MainActivity.this, "Saving...", Toast.LENGTH_SHORT).show();                    }                    @Override                    public void onError(@NonNull ImageCaptureException exception) {                        Toast.makeText(MainActivity.this, "Error: " + exception.getMessage(), Toast.LENGTH_SHORT).show();                    }                });    }}

5. 调试或安装 APK

使用 USB 调试或者 Build 出 APK(Build -> Make Project)然后找到 app-debug.apk 文件进行安装。

注意:由于代码逻辑中没有权限申请部分,需要在安装好后手动开启拍照权限。

已经编译好的 APK 文件见文章开头,可直接下载安装。

6. 项目完整代码

https://gitee.com/hl0929/camera-image-capture

来源地址:https://blog.csdn.net/u014147522/article/details/132042521

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯