博客
关于我
Android+Camera+SurfaceView自定义相机系列(一)
阅读量:511 次
发布时间:2019-03-07

本文共 4470 字,大约阅读时间需要 14 分钟。

如何使用Camera和SurfaceView开发自定义相机

在Android开发中,自定义相机应用是一个常见的需求。相机硬件功能在应用中起着关键作用,尤其是在拍摄、扫描二维码等场景中。要实现自定义相机,需要使用Camera和SurfaceView组件。通过这两者,开发者可以实现相机的预览和拍摄功能。接下来的内容将详细解释如何实现自定义相机,并解决常见问题。

第一步:了解SurfaceHolder和SurfaceView

SurfaceHolder及其Callback接口用于与SurfaceView进行交互。在自定义相机应用中,SurfaceView用于显示摄像头预览画面,而SurfaceHolder则用于管理SurfaceView的状态。SurfaceHolder提供了三个回调方法:

  • surfaceCreated(SurfaceHolder holder):当SurfaceHolder创建时触发回调。
  • surfaceChanged(SurfaceHolder holder, int format, int width, int height):当Surface尺寸或格式发生变化时触发回调。
  • surfaceDestroyed(SurfaceHolder holder):当Surface销毁时触发回调。

通过这些回调,开发者可以实时了解SurfaceView的状态变化,从而控制相机的显示和预处理。

第二步:创建SurfaceView并设置其属性

在布局文件中添加SurfaceView组件,并通过代码获取SurfaceView实例。SurfaceView主要有两个成员变量:

  • Surface:用于显示图像。
  • SurfaceHolder:用于管理Surface的创建、状态变化和销毁。

SurfaceView通过SurfaceHolder提供了基本的接口,使开发者能够定制相机的显示效果。通过getHolder()方法获取SurfaceHolder对象,然后注册Callback接口,监听Surface状态的变化。

第三步:集成Camera组件

Camera组件是Android操作系统提供的底层相机API。开发者通过Camera类可以访问相机设备,获取实时图像流。

代码示例:

import android.app.Activity;import android.content.pm.PackageManager;import android.hardware.Camera;import android.os.Bundle;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.WindowManager;import java.io.IOException;public class MainActivity extends Activity {    private static final String TAG = "MainActivity";    private SurfaceView surfaceView;    private SurfaceHolder surfaceHolder;    private Camera camera;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,                WindowManager.LayoutParams.FLAG_FULLSCREEN);        setContentView(R.layout.activity_main);        int cameraId = Camera.CameraInfo.CAMERA_FACING_FRONT;        if (checkCameraPermission()) {            camera = Camera.open(cameraId);        } else {            requestCameraPermission();        }        surfaceView = findViewById(R.id.surfaceView);        surfaceHolder = surfaceView.getHolder();        surfaceHolder.addCallback(new SurfaceHolder.Callback() {            @Override            public void surfaceCreated(SurfaceHolder holder) {                try {                    camera.setPreviewDisplay(holder);                    camera.startPreview();                } catch (IOException e) {                    e.printStackTrace();                }            }            @Override            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {                // 根据需求进行比例调整或其他处理            }            @Override            public void surfaceDestroyed(SurfaceHolder holder) {                camera.close();                camera = null;            }        });    }    @Override    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        if (requestCode == 1) {            camera = Camera.open(cameraId);            try {                camera.setPreviewDisplay(surfaceHolder);                camera.startPreview();            } catch (IOException e) {                e.printStackTrace();            }        }    }    private boolean checkCameraPermission() {        return ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED;    }    private void requestCameraPermission() {        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 1);    }}

上述代码展示了如何集成Camera组件,并通过SurfaceHolder和SurfaceView实现相机预览功能。

第四步:解决图像扭曲问题

当开发者第一次使用Camera和SurfaceView绘制相机画面时,可能会遇到图像扭曲的问题。这通常是由于SurfaceView的比例和手机的朝向不匹配导致的。为了解决这个问题,可以在SurfaceHolder的surfaceCreated回调中调整显示比例。

代码示例:

@Overridepublic void surfaceCreated(SurfaceHolder holder) {    surfaceHolder = holder;    camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);    try {        camera.setDisplayOrientation(90); // 根据需求调整显示旋转角度        camera.setPreviewDisplay(holder);        camera.startPreview();    } catch (IOException e) {        e.printStackTrace();    }}

通过设置setDisplayOrientation方法,可以调整相机画面的旋转角度,使其更适应应用需求。

第五步:优化布局文件

在布局文件中添加相机控件和SurfaceView组件,确保布局结构合理。

布局文件示例:

通过合理布局布局文件,可以确保SurfaceView居中显示相机画面,同时方便添加摄影按钮等控件。

第六步:液化代码和优化

为了方便理解和应用,代码可以进行一定程度的注释和优化。同时,可以根据应用需求调整相机的参数,如图像格式、预览尺寸等。

综上所述,开发自定义相机应用需要对Camera和SurfaceView组件进行深入理解,并根据实际需求进行代码优化和布局设计。通过合理配置和调试,可以确保相机画面显示正常,并满足应用功能需求。

转载地址:http://vcojz.baihongyu.com/

你可能感兴趣的文章
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
查看>>
NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
查看>>
NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
查看>>
Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
查看>>
NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
查看>>
NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
查看>>
NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
查看>>
NIFI大数据进阶_内嵌ZK模式集群1_搭建过程说明---大数据之Nifi工作笔记0015
查看>>
NIFI大数据进阶_外部ZK模式集群1_实际操作搭建NIFI外部ZK模式集群---大数据之Nifi工作笔记0017
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_01_实际操作---大数据之Nifi工作笔记0029
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
查看>>
NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
查看>>
NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
查看>>
NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
查看>>
NIFI集群_内存溢出_CPU占用100%修复_GC overhead limit exceeded_NIFI: out of memory error ---大数据之Nifi工作笔记0017
查看>>
NIFI集群_队列Queue中数据无法清空_清除队列数据报错_无法删除queue_解决_集群中机器交替重启删除---大数据之Nifi工作笔记0061
查看>>
NIH发布包含10600张CT图像数据库 为AI算法测试铺路
查看>>
Nim教程【十二】
查看>>