Android编程实现拍照功能的2种方法分析
本文实例讲述了android编程实现拍照功能的2种方法。分享给大家供大家参考,具体如下:
android系统的照相功能,已实现2种方法,可供大家参考:
1. 调用系统摄像头来拍照
首先,找到androidmanifest.xml文件里加入用户权限
<uses-permission android:name="android.permission.camera"></uses-permission> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" />
其次,在主类java文件里加入2个控件(button和imageview),是用来触发按钮事件和显示图片的,纯是个人爱好
final int take_picture = 1; //为了表示返回方法中辨识你的程序打开的相机
关键是这里:
是打开系统自带相机,以下是处理拍照得到的数据,将数据保存下来
protected void onactivityresult(int requestcode, int resultcode, intent data) { if (requestcode == take_picture) { if (resultcode == result_ok) { bitmap bm = (bitmap) data.getextras().get("data"); img.setimagebitmap(bm);//想图像显示在imageview视图上,private imageview img; file mycapturefile = new file("sdcard/123456.jpg"); try { bufferedoutputstream bos = new bufferedoutputstream(new fileoutputstream(mycapturefile)); /* 采用压缩转档方法 */ bm.compress(bitmap.compressformat.jpeg, 80, bos); /* 调用flush()方法,更新bufferstream */ bos.flush(); /* 结束outputstream */ bos.close(); } catch (filenotfoundexception e) { // todo auto-generated catch block e.printstacktrace(); } catch (ioexception e) { // todo auto-generated catch block e.printstacktrace(); } } } }
这样就能实现调用系统自带的摄像头了,很简单的操作。
2. 自己写程序来保存照片
照片格局文件lay.xml里要先进行这些定义
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <linearlayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingleft="130px" android:paddingright="200px" > <surfaceview android:id="@+id/msurfaceview1" android:visibility="visible" android:layout_width="320px" android:layout_height="240px"> </surfaceview> </linearlayout> </linearlayout>
其中surfaceview是用来进行预览的,
在oncreat函数里初始化一系列的值:
requestwindowfeature(window.feature_no_title); setcontentview(r.layout.lay); /* 取得屏幕解析像素 */ displaymetrics dm = new displaymetrics(); getwindowmanager().getdefaultdisplay().getmetrics(dm); // mimageview01 = (imageview) findviewbyid(r.id.myimageview1); /* 以surfaceview作为相机preview之用 */ msurfaceview01 = (surfaceview) findviewbyid(r.id.msurfaceview1); /* 绑定surfaceview,取得surfaceholder对象 */ msurfaceholder01 = msurfaceview01.getholder(); /* activity必须实现surfaceholder.callback */ msurfaceholder01.addcallback(takephoto.this); /* * 以surface_type_push_buffers(3) * 作为surfaceholder显示类型 * */ msurfaceholder01.settype (surfaceholder.surface_type_push_buffers);
首先进行初始化照相机的功能函数和参数设置:
private camera mcamera01; mcamera01 = camera.open(); /* 创建camera.parameters对象 */ camera.parameters parameters = mcamera01.getparameters(); /* 设置相片格式为jpeg */ parameters.setpictureformat(pixelformat.jpeg); log.i(tag, "pic is jpeg"); /* 指定preview的屏幕大小 */ parameters.setpreviewsize(320, 240); log.i(tag, "pic pingmu fenbianlv"); /* 设置图片分辨率大小 */ parameters.setpicturesize(1024, 768); log.i(tag, "pic tupian fenbianlv"); /* 将camera.parameters设置予camera */ mcamera01.setparameters(parameters); /* setpreviewdisplay唯一的参数为surfaceholder */ mcamera01.setpreviewdisplay(msurfaceholder01); /* 立即运行preview */ mcamera01.startpreview();
初始化成功后就可以进行拍照了,拍照函数依然是通过调用camera类的函数来实现
只需实现jpegcallback这个回调函数来就行解码、保存即可,前2个参数可以直接设为null,不过系统一般会自动帮你把这些都写进来的
private picturecallback jpegcallback = new picturecallback() { public void onpicturetaken(byte[] _data, camera _camera) { // todo handle jpeg image data /* onpicturetaken传入的第一个参数即为相片的byte */ bitmap bm = bitmapfactory.decodebytearray (_data, 0, _data.length); /* 创建新文件 */ picname = "sdcard/1234566.jpg";//要保存在哪里,路径你自己设 file mycapturefile = new file(picname); try { bufferedoutputstream bos = new bufferedoutputstream (new fileoutputstream(mycapturefile)); /* 采用压缩转档方法 */ bm.compress(bitmap.compressformat.jpeg, 80, bos); /* 调用flush()方法,更新bufferstream */ bos.flush(); /* 结束outputstream */ bos.close(); /* 将拍照下来且存储完毕的图文件,显示出来 */ //mimageview01.setimagebitmap(bm); /* 显示完图文件,立即重置相机,并关闭预览 */ resetcamera(); } catch (exception e) { log.e(tag, e.getmessage()); } } };
拍照完了要重置照相机,然后可以继续拍照
/* 相机重置 */ private void resetcamera() { if (mcamera01 != null && bifpreview) { mcamera01.stoppreview(); /* 扩展学习,释放camera对象 */ mcamera01.release(); mcamera01 = null; bifpreview = false; } }
2种拍照方式的比较
①. 调用系统自带的照相机,照片格式大小只有几种选择,照片拍出来比较大,而自己程序实现的话可以调节照片大小为任意尺寸,图片的容量可以调节
②. 调用系统的简单,而且外观一般比自己设置的要好看
③. 调用系统的操作简单、方便,不易出错,自己编程的话需要注意,容易引起系统出错意外终止
更多关于android相关内容感兴趣的读者可查看本站专题:《android拍照与图片处理技巧总结》、《android图形与图像处理技巧总结》、《android开发入门与进阶教程》、《android调试技巧与常见问题解决方法汇总》、《android基本组件用法总结》、《android视图view技巧总结》、《android布局layout技巧总结》及《android控件用法总结》
希望本文所述对大家android程序设计有所帮助。