记录自己看,如果对你没用还请见凉。
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:相机功能