Camera实现预览、拍照
1.利用Intent方法实现拍照并保存
在菜单或按钮的选择操作中调用如下代码,开启系统自带Camera APP,并传递一个拍照存储的路径给系统应用程序,具体如下:
imgPath = "/sdcard/test/img.jpg";
//必须确保文件夹路径存在,否则拍照后无法完成回调
File vFile = new File(imgPath);
if(!vFile.exists())
{
File vDirPath = vFile.getParentFile(); //new File(vFile.getParent());
vDirPath.mkdirs();
}
Uri uri = Uri.fromFile(vFile);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);//
startActivityForResult(intent, SystemCapture);
上面我们使用的是startActivityForResult,所以最好需要重载void onActivityResult(int requestCode, int resultCode, Intent data)函数,不过因为当传入文件路径的的情况下,data返回参数是null值,只要resultCode为RESULT_OK,则上述代码中/sdcard/test/img.jpg的图片文件就是最新的照片文件。所以我们在这里只需给出如下简单的代码,将其显示到ImageView中
if (resultCode == RESULT_OK)
{
iViewPic.setImageURI(Uri.fromFile(new File(imgPath)));
}
假设不传参数MediaStore.EXTRA_OUTPUT的情况下,onActivityResult函数在resultCode为RESULT_OK的情况下,data返回的参数是经过实际拍摄照片经过缩放的图像数据,可以通过类似如下方法来打印缩放图像的尺寸
if (resultCode == RESULT_OK)
{
Bitmap bmp = (Bitmap)data.getExtras().get("data");
Log.d("Test", "bmp width:" + bmp.getWidth() + ", height:" + bmp.getHeight());
}
另外假如仅仅是调用系统照相机拍照,不关心拍照结果,则可以简单使用如下代码
Intent intent = new Intent(); //调用照相机
intent.setAction("android.media.action.STILL_IMAGE_CAMERA");
startActivity(intent);
备注:上面设置MediaStore.EXTRA_OUTPUT的方法,经过手机实测除了我们设定的路径下有照片外,在手机存储卡上也会保存一份照片,默认目录为sdcard/dcim/camera下面,我曾经尝试着想如果每次返回可以取得sdcard/dcim/camera下面的路径就好了,但是目前看来没办法直接获得,可以借助MediaStroe每次去查询最后一条照片记录,应该也是可行的。
2.利用Camera类实现浏览/拍照
1.Camera类
使用Camera控制拍照的几个步骤:
1、设置打开相机的权限
<uses-permission android:name = "android.permission.CAMERA" /> <uses-feature android:name = "android.hardware.camera" /> <uses-feature android:name = "android.hardware.camera.autofocus" /> 一般拍照和摄像的时候需要写到sd卡上,所以还有一向权限声明如下 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 真做摄像功能时,需要音频录制和视频录制功能,所以又需要下面两项权限声明 <uses-permission android:name="android.permission.RECORD_VIDEO"/> <uses-permission android:name="android.permission.RECORD_AUDIO"/>
user-feature:概述:<uses-feature>用来声明应用中需要用的硬件和软件的功能。
硬件特性:表明您的应用需要用的硬件功能。 如果没有这种硬件,则app不被使用
2、调用Camera的open()打开相机
public static Camera open(int cameraId)
在API9之后引用的,如果设备小于API9则无法使用
打开相机 public static Camera open()
在API9之前使用的方法 解析:在SDK 2.3之前,是没有参数的,2.3以后支持多摄像头,所以开启前可以通过getNumberOfCameras先获取摄像头数目,再通过getCameraInfo得到需要开启的摄像头id,
然后传入Open函数开启摄像头,假如摄像头开启成功则返回一个Camera对象,否则就抛出异常;传入0打开默认摄像头(一般是后置)
3、调用Camera的getParameters()获取拍照参数。该方法返回一个Camera.Paremeters对象
4、调用Camera.Parameters对象方法设置拍照的参数(参数就是照片的长、宽、是竖还是横之类的参数)
5、调用Camera.startPreview()方法开始预览取景,在预览取景之前需要调用Camera的setPreviewDisplay(SurfaceHolder holder)方法设置使用哪个SurfaceView来显示取景图片。(稍后介绍)
6、调用Camera的takePicture()方法进行拍照
public final void takePicture(Camera.ShutterCalback shutter,Camera.PictureCallback raw,Camera.PictureCallback jpeg)
//方法中的三个参数是三个回调接口,实现接口并传入该方法中
shutter 接口的意义:在相机捕获图像的时候调用 (按快门的时候)
raw :在原始图像数据可用的时候调用。
jpeg:在JEPG版本的图像可用时调用 (原始数据转换成jpeg格式时候回调)
如果不要接口:则使用null代替
7、结束程序时,调用Camera的stopPreview()结束取景预览,并调用release()方法释放资源
2、SurfaceView、SurfaceHolder与Surface
SurfaceView:SurfaceView是视图(View)的继承类,这个视图里内嵌了一个专门用于绘制的Surface。
Surface:定义:代表着原始数据的缓冲区。
Surface拥有自己的生命周期:当SurfaceView出现在屏幕上的时候,创建Surface。
当SurfaceView消失在屏幕上的时候,销毁Surface。
作用:将数据绘制在缓冲区中。Surface及其协同对象都不会自己绘制对象,要将内容绘制到缓冲区的对象让Surface的客户端在Surface未创建时,不能将内容绘制到其上。 所以说当Surface创建的时候开始绘制 当 Surface销毁后 让Camera对象取消绘制。
SurfaceView与Surface的关系: SurfaceView提供了一个可见区域,只有在这个可见区域内的Surface才能显示。(SurafaceView一般作为控件使用)
SurfaceHolder:SurfaceHolder是控制surface的一个抽象接口。
1.用于控制Surface的生命周期。
2.让协同对象将数据流入Surface的接口。
实例
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//在res/activity_main中创建了SurfaceView控件
SurfaceView surfaceView = (SurfaceView) findViewById(R.id.main_surfaceView);
//获取SurfaceHolder类
SurfaceHolder surfaceHolder = surfaceView.getHolder();
//回调Surface的生命周期
surfaceHolder.addCallback(new SurfaceHolder.Callback() {
//当被创建的时候显示
@Override
public void surfaceCreated(SurfaceHolder holder) {
}
//当Surface大小、格式改变的时候回调。首次显示在屏幕上调用。参数是Surface的像素格式、宽、高
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
//当Surface被销毁的时候显示
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
});
}
总结:从SurfaceView对象中产生Surface对象,然后通过SurfaceHolder控制Surface对象,SurfaceHolder提供Callback接口控制绘制流程。
3.Camera与Surface的关系
mCamera将获取到的数据通过SurfaceHolder对象输入到Surface的缓冲区上。然后由Camera在SurfaceHolder提供的Callback接口决定是否开始或者停止绘制在SurfaceView上(用来预览图片)。
详细Camera类的使用:http://www.cnblogs.com/franksunny/archive/2011/11/17/2252926.html
详细Surface类的使用:http://blog.csdn.net/conowen/article/details/7821409
Camera实现预览、拍照的更多相关文章
- MFC Camera 摄像头预览 拍照
windows 上开发摄像头程序,比较容易的方式是 OpenCV ,几行代码就能显示出来,但是简单的容易搞,有点难度定制化需求的就不这么容易了.所以说还是要从,最基础的 DirectShow 开始搞起 ...
- Android开发实践:掌握Camera的预览方向和拍照方向
http://ticktick.blog.51cto.com/823160/1592267?utm_source=tuicool&utm_medium=referral Android的Cam ...
- android camera 摄像头预览画面变形
问题:最近在处理一下camera的问题,发现在竖屏时预览图像会变形,而横屏时正常.但有的手机则是横竖屏都会变形. 结果:解决了预览变形的问题,同时支持前后摄像头,预览无变形,拍照生成的jpg照片方向正 ...
- ffmpeg实现mjpeg摄像头的采集-预览-拍照
摄像头输出是mjpeg格式的,需要实现在线预览功能,然后实现拍照功能 1.可以设置采集图像的分辨率,预览分辨率为640*480,可以自定义 2.ctrl+\ 拍照,ctrl+c 退出 void tes ...
- 玩转Android Camera开发(二):使用TextureView和SurfaceTexture预览Camera 基础拍照demo
Google自Android4.0出了TextureView,为什么推出呢?就是为了弥补Surfaceview的不足,另外一方面也是为了平衡GlSurfaceView,当然这是本人揣度的.关于Text ...
- Android Camera开发:使用TextureView和SurfaceTexture预览Camera 基础拍照demo
Google自Android4.0出了TextureView,为什么推出呢?就是为了弥补Surfaceview的不足,另外一方面也是为了平衡GlSurfaceView,当然这是本人揣度的.关于Text ...
- Android Camera开发:使用GLSurfaceView预览Camera 基础拍照
GLSurfaceView是OpenGL中的一个类,也是可以预览Camera的,而且在预览Camera上有其独到之处.独到之处在哪?当使用Surfaceview无能为力.痛不欲生时就只有使用GLSur ...
- 【转】玩转Android Camera开发(三):国内首发---使用GLSurfaceView预览Camera 基础拍照demo
http://blog.csdn.net/yanzi1225627/article/details/33339965 GLSurfaceView是OpenGL中的一个类,也是可以预览Camera的,而 ...
- 玩转Android Camera开发(三):国内首发---使用GLSurfaceView预览Camera 基础拍照demo
GLSurfaceView是OpenGL中的一个类,也是能够预览Camera的,并且在预览Camera上有其独到之处. 独到之处在哪?当使用Surfaceview无能为力.痛不欲生时就仅仅有使用GLS ...
随机推荐
- asp.net实现伪静态遇到的问题
之前在一次项目(asp.net网站)中要用到伪静态技术,实现的思路大致是这样的: 在全局配置文件Global.asax(普通的类可以通过实现IHttpModule来完成)中的Application_B ...
- 从数据库中导出.csv文件
需求: 本次将数据库中的数据导出成.csv文件(office可以打开), //数据的生成,根据你所选中的数据进行生成 //params:$activity_id -> 活动的id //param ...
- python虚拟环境Virtualenvwrapper无法升降级虚拟环境软件解决方法
virtualenv用于创建独立的Python环境,多个Python相互独立,互不影响,它能够在没有权限的情况下安装新套件,不同应用可以使用不同的套件版本,套件升级不影响其他应用. Virtaulen ...
- zeromq-python使用
安装参考saltstack编译安装.note 官方使用文档: http://zguide.zeromq.org/page:all 中文翻译文档: http://iyuan.iteye.com/blog ...
- 恶补ASP.NET基础【1】委托
委托(delegate)是一种可以把引用存储为函数的类型. 委托的声明类似于函数,但不带函数体,且要使用delegate关键字,委托的声明指定了一个返回类型和一个参数列表. 在定义了委托之后,就可以声 ...
- SQL Server 中可以被锁住的 12 种资源
第1种: DB 整个数据库 第2种: file 数据库文件 第3种: table 第4种: hobt(堆)BTree(B树) 第5种: extent 一个区(8个8KB页面) 第6种: page 数据 ...
- Nginx 教程的连载计划
下面以教程系列为单位,列举出了已经发表和计划发表的连载教程: Nginx 新手起步 Nginx 是如何匹配 URI 的 Nginx 变量漫谈 Nginx 配置指令的执行顺序 Nginx 的 if 是邪 ...
- Seafile 推出 “分布式文件同步技术” 打造的私有云服务
近两年来 Dropbox 等云储存服务迅速窜红,各大巨头纷纷推出自家的云储存服务(苹果的 iCloud, 微软的 SkyDrive, Google 即将推出的 GDrive),国内也有类似的服务(金山 ...
- HDU 4082 Hou Yi's secret(暴力)
直接6重循环就行了吧...判三角形相似直接从小到大枚举两向量夹角是否相等就行了.注意去重点跟三点共线就行了... #include<algorithm> #include<iostr ...
- (七)boost库之单例类
(七)boost库之单例类 一.boost.serialzation的单件实现 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一 ...