IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android的camerax预览拍照 -> 正文阅读

[移动开发]Android的camerax预览拍照

前面讲了,camera1和camera2的简单使用。从前文可以看出来,API 的调用还是比较繁琐的,而且像一些最佳尺寸,角度等还得自己算。由于camera1支持的特性很少,camera2流程又很繁琐,google 也意识到这个问题,所以推出了 Camerax。它虽然底层也是利用了 Camera2 的功能,但它的使用却更加简洁,它的主要优势如下:

  • 更加简洁的 API 调用,基本十几行代码就能实现预览
  • Camerax 为 Jetpack 的支持库,所以也具备感知生命周期的功能,即你无需自己释放 生命周期
  • 更好兼容性
  • 更多功能,比如图片分析等

注意,Camerax 也只支持 API21 及以上。

本文也仅展示怎么预览和拍照,其他功能可以参照Android开发者官网。代码非常简单,如下:

首先,添加关联库:

def camerax_version = "1.0.0-beta06"
// CameraX 核心库
implementation "androidx.camera:camera-camera2:$camerax_version"
// CameraX 生命周期
implementation "androidx.camera:camera-lifecycle:$camerax_version"
// CameraX view 集合,比如 cameraview,preview等
implementation "androidx.camera:camera-view:1.0.0-alpha10"

权限

 <uses-permission android:name="android.permission.CAMERA" /> 
 <uses-feature android:name="android.hardware.camera.any" />

预览

?xml布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".FullScreenClipActivity">
    <androidx.camera.view.PreviewView
        android:id="@+id/pv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</RelativeLayout>

通过

  ListenableFuture<ProcessCameraProvider> cameraProviderFuture = ProcessCameraProvider.getInstance(this);

返回当前可以绑定生命周期的 ProcessCameraProvider,ProcessCameraProvider 它会和宿主绑定生命周期,这样就不用担心打开相机和关闭的问题了。

接着,向 cameraProviderFuture 注册一个监听,第一个参数是一个 runnable,第二个参数是线程池,即runnable 运行在哪个线程中:

cameraProviderFuture.addListener(Runnable {}, ContextCompat.getMainExecutor(this))

上面我们让它运行在主线程的线程池中,这样,在这个 runnable 中,就可以配置我们的 capture 了,代码如下:

        mViewFinder = findViewById(R.id.pv);
        //创建相机进程监听
        ListenableFuture<ProcessCameraProvider> cameraProviderFuture = ProcessCameraProvider.getInstance(this);
        cameraProviderFuture.addListener(new Runnable() {
            @SuppressLint("RestrictedApi")
            @Override
            public void run() {
                try {
                    //将相机的生命周期和activity的生命周期绑定,camerax 会自己释放,不用担心了
                    ProcessCameraProvider cameraProvider = cameraProviderFuture.get();
                    //预览的 capture,它里面支持角度换算
                    Preview preview = new Preview.Builder().build();

                    //创建图片的 capture
                    mImageCapture = new ImageCapture.Builder()
                            .setFlashMode(ImageCapture.FLASH_MODE_AUTO)
                            .build();

                   
                    //选择后置摄像头
                    CameraSelector cameraSelector = new CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build();

                    //预览之前先解绑
                    cameraProvider.unbindAll();

                    //将数据绑定到相机的生命周期中
                    Camera camera = cameraProvider.bindToLifecycle(CameraxActivity.this, cameraSelector, preview, mImageCapture);
                    //将previewview 的 surface 给相机预览
                    preview.setSurfaceProvider(mViewFinder.createSurfaceProvider(camera.getCameraInfo()));

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        },ContextCompat.getMainExecutor(this));

创建并确认 CameraProvider 后,执行步骤如下

  • 创建 Preview,使用 new Preview.Builder().build() 创建Preview,它是相机预览的数据流,图像数据会通过它来输出,比如输出到 Surface 中
  • 创建 ImageCapture 用于拍照,这里的 builder 都可以设置参数,比如大小,曝光等
  • 指定所需的相机 LensFacing 选项,这里直接使用后置即可
  • 将所选相机和任意用例绑定到生命周期,通过 cameraProvider.bindToLifecycle,将宿主的生命周期,与 cameraSelector,preview和mImageCapture判定起来。
  • 将 Preview 连接到 PreviewView,preview.setSurfaceProvider() 设置要预览的 surface

拍照

上面已经设置了 mImageCapture,拍照在 Camerax 中也很简单,使用 takePicture 即可,如下

 public void takePhoto(View view) {
        if (mImageCapture != null) {
            File dir = new File(Constants.PATH);
            if (!dir.exists()) {
                dir.mkdirs();
            }
            //创建文件
            File file = new File(Constants.PATH,"testx.jpg");
            if (file.exists()) {
                file.delete();
            }
            //创建包文件的数据,比如创建文件
            ImageCapture.OutputFileOptions outputFileOptions = new ImageCapture.OutputFileOptions.Builder(file).build();

            //开始拍照
            mImageCapture.takePicture(outputFileOptions, ContextCompat.getMainExecutor(this), new ImageCapture.OnImageSavedCallback() {
                @Override
                public void onImageSaved(@NonNull ImageCapture.OutputFileResults outputFileResults) {
                //    Uri savedUri = outputFileResults.getSavedUri();
                    Toast.makeText(CameraxActivity.this, "保存成功: ", Toast.LENGTH_SHORT).show();
                }

                @Override
                public void onError(@NonNull ImageCaptureException exception) {
                    Toast.makeText(CameraxActivity.this, "保存失败", Toast.LENGTH_SHORT).show();
                }
            });
        }
    }

注释已经很清楚了,注意我们可以使用 ImageCapture.OutputFileOptions 让 Camerax 去帮我们保存图片文件。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-08-19 19:17:25  更:2022-08-19 19:17:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 4:36:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码