android学习笔记之摄像头的使用

记录自己看,如果对你没用还请见凉。
1.首先是布局:
采用帧布局管理器,加一 个SurfaceView组件,用来显示预览(SurfaceView就是指一个在表层的视图对象,android系统通过发出VSYNC信号进行视图的重 绘,刷新间隔为16ms。)。在加两个ImageButton按钮。
在这里插入图片描述
2.判断SD有没有
在这里插入图片描述
关于Environment类的总结
Environment类是一个提供访问环境变量的类
getExternalStorageState() 方法,返回String 获取外部存储设备的当前状态。
在这里插入图片描述
3.获取SurfaceView组件,用于显示相机预览
在这里插入图片描述
SurfaceHolder是一个接口,其作用就像一个关于Surface的监听器,提供访问和控制SurfaceView内嵌的Surface 相关的方法。它通过三个回调方法,让我们可以感知到Surface的创建、销毁或者改变。
getHolder():返回SurfaceHolder,提供对此SurfaceView的基础表面的访问和控制。
setType():设置Suface的类型。
4种类型:

SURFACE_TYPE_NORMAL:用RAM缓存原生数据的普通Surface 
SURFACE_TYPE_HARDWARE:适用于DMA(Direct memory access )引擎和硬件加速的Surface 
SURFACE_TYPE_GPU:适用于GPU加速的Surface 
SURFACE_TYPE_PUSH_BUFFERS:表明该Surface不包含原生数据,Surface用到的数据由其他对象提供,在Camera图像预览中就使用该类型的Surface,有Camera负责提供给预览Surface数据,这样图像预览会比较流畅。如果设置这种类型则就不能调用lockCanvas来获取Canvas对象了。

4.设置预览按钮的单击效果
在这里插入图片描述
在之前我们要先声明一个boolean类型的isPreview并初始化为false,表示非预览状态;并声明一个Camera对象。(Camera类用于设置图像捕获设置,开始/停止预览,拍照以及检索帧以对视频进行编码。此类是摄像机服务的客户端,该服务管理实际的摄像机硬件。)
首先判断是否是预览状态,如果不是,打开相机open()(创建一个新的Camera对象,以访问设备上的第一个背面摄像头。如果设备没有后置摄像头,则返回null。)
并将预览状态设置为true。
设置显示预览的SurfaceView:setPreviewDisplay(),此方法会抛出IOException,用try catch抓一下。
设置相机参数setParameters(),需要先获取一个Camera.Parameter对象;
开始预览startPreview();
设置自动对焦autoFocus();
5.设置拍照按钮
在这里插入图片描述
先判断一下如果相机不为空,调用拍照takePicture()功能。
6.实现将照片保存到系统图库中在这里插入图片描述
首先采用匿名内部类的方法实现PictureCallback接口的实例,并重写里面的方法onPictureTaken,创建一个位图对象并对其解码。
停止预览stopPreview();
设置非预览状态;
获取sd卡根目录;
判断一下目录是否存在,不存在就创建目录
在这里插入图片描述
将获取当前系统时间设置为照片名称;
创建文件对象;
创建一个文件输出流对象;
将图片内容压缩为JPEG格式输出到输出流对象中compress();
将缓冲区中的数据全部写出到输出流中flush();
关闭文件输出流对象;
在这里插入图片描述
将照片插入到系统图库insertImage()其中4个参数分别是

1要使用的内容解析器
2imagePath插入图像的路径
3图像名称
4description图像描述。

通知图库更新Intent.ACTION_MEDIA_SCANNER_SCAN_FILE(广播操作:请求媒体扫描仪扫描文件并将其添加到媒体数据库。文件的路径包含在Intent.mData字段中。)
resetCamera();调用重新预览;方法如下

private void resetCamera() {     //创建resetCamera()方法,实现重新预览功能
        if (!isPreview) {            //如果为非预览模式
            camera.startPreview();    //开启预览
            isPreview = true;
        }
    }

7.设置Activity暂停或停止时资源释放

protected void onPause() {  //当暂停Activity时,停止预览并释放资源
        if (camera != null) {        //如果相机不为空
            camera.stopPreview();    //停止预览
            camera.release();        //释放资源
        }
        super.onPause();
    }

8.设置权限

    <!-- 授予程序可以向SD卡中保存文件的权限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <!-- 授予程序使用摄像头的权限 -->
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-feature android:name="android.hardware.camera.autofocus"/>
    <uses-feature android:name="android.hardware.camera"/>

MOUNT_UNMOUNT_FILESYSTEMS:允许装载和卸载文件系统权限
WRITE_EXTERNAL_STORAGE:允许写外部SD卡权限
android.permission.CAMERA:摄像头权限
android.hardware.camera.autofocus:相机自动对焦功能的使用权限
android.hardware.camera:相机功能

发布了18 篇原创文章 · 获赞 8 · 访问量 356

猜你喜欢

转载自blog.csdn.net/qq_34423913/article/details/104211345