surfaceView实现拍照功能
1.布局中只有一个SurfaceView和Button,初始SurfaceView通过surface.getHolder获得SurfaceHolder类
SurfaceView sfv= (SurfaceView) findViewById(R.id.surfaceView);
holder = sfv.getHolder();
//指定类型
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//指定回调接口
holder.addCallback(new A());
2.回调接口。这里setPictureSize(width,height)宽高并不能随意设置,必须属于
myParameters.getSupportedPictureSizes() 中的,在该回调中并设置了
cam.autoFocus(mAutoFocusCallback);
实现cam的聚焦功能。
myParameters.set("jpeg-quality", 10);这里设置的10使得图片最终质量较差。
private class A implements SurfaceHolder.Callback {
@Override
public void surfaceCreated(SurfaceHolder holder) {
if(cam!=null){
cam.release();
}
cam = Camera.open(0);
try {
myParameters = cam.getParameters();
myParameters.setPictureSize(myParameters.getSupportedPictureSizes().get(0).width,myParameters.getSupportedPictureSizes().get(0).height);
for(int i=0;i<myParameters.getSupportedPictureSizes().size();i++){
Log.d(TAG, "surfaceCreated: width: "+myParameters.getSupportedPictureSizes().get(i).width+"height:"+myParameters.getSupportedPictureSizes().get(i).height);
}
myParameters.setFocusMode("auto");
myParameters.set("jpeg-quality", 10);
cam.setParameters(myParameters);
cam.setPreviewDisplay(holder);
cam.setDisplayOrientation(90);
cam.startPreview();
cam.autoFocus(mAutoFocusCallback);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
}
3.cam.autoFocus(mAutoFocusCallback)中的回调
private Camera.AutoFocusCallback mAutoFocusCallback=new Camera.AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
}
};
4.在Button点击事件中实现拍照响应
cam.takePicture(null,null,null,new B());
5.B回调,压缩图片,并保存
private class B implements Camera.PictureCallback {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
try {
Bitmap a= BitmapFactory.decodeByteArray(data,0,data.length);
String fileAdress=Environment.getExternalStorageDirectory()+File.separator+"AA"+File.separator+photoFileName;
FileOutputStream out=new FileOutputStream(new File(fileAdress));
//压缩
a.compress(Bitmap.CompressFormat.JPEG,100,out);
Toast.makeText(PhotoActivity.this,"",Toast.LENGTH_SHORT).show();
if(cam!=null){
cam.release();
}
finish();
} catch (Exception e) {
e.printStackTrace();
}
}
}
6.给surfaceView加上点击事件,点击时,开启聚焦
sfv.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
cam.autoFocus(mAutoFocusCallback);
return false;
}
});
surfaceView实现拍照功能的更多相关文章
- Android开发技巧——Camera拍照功能
本篇是我对开发项目的拍照功能过程中,对Camera拍照使用的总结.由于camera2是在api level 21(5.0.1)才引入的,而Camera到6.0仍可使用,所以暂未考虑camera2. 文 ...
- UWP开发之Template10实践二:拍照功能你合理使用了吗?(TempState临时目录问题)
最近在忙Asp.Net MVC开发一直没空更新UWP这块,不过有时间的话还是需要将自己的经验和大家分享下,以求共同进步. 在上章[UWP开发之Template10实践:本地文件与照相机文件操作的MVV ...
- 文件件监听器,android系统拍照功能调用后删除系统生成的照片
先说说要实现的功能: android调用系统拍照功能实时 预览 删除 上传 保存 (用户不能再本地文件夹中看到拍的照片) 再说说遇到的问题: 1.调用系统拍照在系统自带的拍照文件夹中生成一张随机命名图 ...
- ios照片获取,拍照功能
// // HYBPhotoPickerManager.h // ehui // // Created by 黄仪标 on 14/11/26. // Copyright (c) 2014年 黄 ...
- Android--启动拍照功能并返回结果
因为没有深入学习拍照这块功能,所以只是简单的调用了一下系统的拍照功能,下面代码: //拍照的方法 private void openTakePhoto(){ /** * 在启动拍照之前最好先判断一下s ...
- Cocos2d-x使用android拍照功能加载照片内存过大,通过另存照片尺寸大小解决
使用2dx调用android拍照功能,拍照结束后在2dx界面显示拍照照片,如果不对照片做处理,会出现内存过大的问题,导致程序崩溃,如果仅仅另存拍照照片,则照片质量大小均下降,导致照片不够清晰,后来发现 ...
- Java乔晓松-android中调用系统拍照功能并显示拍照的图片
android中调用系统拍照功能并显示拍照的图片 如果你是拍照完,利用onActivityResult获取data数据,把data数据转换成Bitmap数据,这样获取到的图片,是拍照的照片的缩略图 代 ...
- Android使得手机拍照功能的发展(源共享)
Android系统调用手机拍照功能有两种方法来直接调用手机自带摄像头还有一个就是要当心自己的节拍. 例Camera360 强大的一个在每个操作系统都有一个手机摄影软件:您可以捕捉不同风格,不同特效的照 ...
- 微信小程序(有始有终,全部代码)开发--- 新增模块: 图片选取以及拍照功能
开篇语 前几天发了一篇: <简年15: 微信小程序(有始有终,全部代码)开发---跑步App+音乐播放器 > 后来又发了BUG修复的版本: 简年18: 微信小程序(有始有终,全部代码)开发 ...
随机推荐
- Sublime + Chrome 本地调试 CSS 选择器
生成简单的 HTML 代码 使用MacDown写 Markdown,快捷键ALT+CMD+C拷贝成 HTML 代码 粘贴到 Sublime 中,加上 body 标签和 css 头 html <h ...
- 如何 打包整合linux系统文件夹 用于刷机包等等, 其中包括打包 句号开头 . 开头的文件, 排除系统文件 等
tar --exclude=proc/* --exclude=sys/* -cvjf rootfs.tar.bz2 * .[!.]* -R
- Django02 Django基础知识
一.内容回顾 1.web应用程序 2.HTTP协议 a.http协议特性 b.http请求格式 c.http响应格式 3.wsgiref模块 4.Django下载与简单应用 a.Django简介(MT ...
- yum 安装nginx(配置开机启动)
yum install -y nginx 通过yum安装的时候提示下面的错误 [root@localhost yum.repos.d]# yum install nginx 已加载插件:fastest ...
- 网络流入门——EK算法
转载:https://www.cnblogs.com/ZJUT-jiangnan/p/3632525.html 网络流的相关定义: 源点:有n个点,有m条有向边,有一个点很特殊,只出不进,叫做源点. ...
- C++进阶 STL(2) 第二天 一元/二元函数对象、一元/二元谓词、stack容器、queue容器、list容器(双向链表)、set容器、对组、map容器
01 上次课程回顾 昨天讲了三个容器 string string是对char*进行的封装 vector 单口容器 动态数组 deque(双端队列) 函数对象/谓词: 一元函数对象: for_each ...
- BZOJ 3876 [AHOI/JSOI2014]支线剧情 (最小费用可行流)
题面:洛谷传送门 BZOJ传送门 题目大意:给你一张有向无环图,边有边权,让我们用任意条从1号点开始的路径覆盖这张图,需要保证覆盖完成后图内所有边都被覆盖至少一次,求覆盖路径总长度的最小值 最小费用可 ...
- 批量修改Linux系统密码
截取主机IP地址最后一位数.匹配一组定义好的自定义密码.使用chpasswd修改主机账户密码 截图主机IP [root@web01 ~]# ip addr 1: lo: <LOOPBACK,UP ...
- Problem 14
Problem 14 # Problem_14.py """ The following iterative sequence is defined for the se ...
- [剑指offer] 41. 数据流中的中位数 (大小堆,优先队列)
对于海量数据与数据流,用最大堆,最小堆来管理. class Solution { public: /* * 1.定义一个规则:保证左边(大顶堆)和右边(小顶堆)个数相差不大于1,且大顶堆的数值都小于等 ...