现在的手机一般都会提供相机功能,有些相机的镜头甚至支持1300万以上像素,有些甚至支持独立对焦、光学变焦这些只有单反才有的功能,甚至有些手机直接宣传可以拍到星星。可以说手机已经变成了专业数码相机。为了充分利用手机上的相机功能, android系统提供了camera类来控制相机拍照。现在就让我们看一下如果使用camera类来控制手机拍照。
使用camera控制手机拍照的步骤如下:
1) 调用camera的open()方法打开相机。该方法默认打开后置摄像头。如果需要打开指定摄像头,可以为该方法传入摄像头id。
2) 调用camera的getparameters()方法获取拍照参数。该方法返回一个 camera.parameters 对象。
3) 调用camera.parameters对象方法设置拍照参数。
4) 调用camera的startpreview()方法开始预览取景,在预览取景之前需要调用camera 的 setpreviewdisplay(surfaceholder holder)方法设置使用哪个surface view 来显示取景照片。
5) 调用camera的takepicture()方法进行拍照。
6) 结束程序时,调用camera的stoppreview()结束取景预览,并调用release()方法释放资源。
应用实例:拍照时自动对焦
下面的实例示范了使用camera来进行拍照、当用户按下拍照键时,该应用会自动对焦,当对焦成功时拍下照片。该程序的界面中只提供了一个surfaceview来显示预览取景,十分简单。该程序代码如下:
package com.jph.camera; import java.io.file; import java.io.fileoutputstream; import java.io.ioexception; import java.text.simpledateformat; import java.util.date; import java.util.locale; import android.app.activity; import android.graphics.bitmap; import android.graphics.bitmap.compressformat; import android.graphics.bitmapfactory; import android.graphics.imageformat; import android.hardware.camera; import android.hardware.camera.autofocuscallback; import android.hardware.camera.picturecallback; import android.hardware.camera.shuttercallback; import android.os.bundle; import android.os.environment; import android.util.displaymetrics; import android.view.display; import android.view.surfaceholder; import android.view.surfaceholder.callback; import android.view.surfaceview; import android.view.view; import android.view.window; import android.view.windowmanager; import android.widget.edittext; import android.widget.imageview; import android.widget.toast; /** * 控制手机拍照 * @author jph * date:2014.08.20 * */ public class captureimage extends activity { surfaceview sview; surfaceholder surfaceholder; int screenwidth, screenheight; // 定义系统所用的照相机 camera camera; // 是否在预览中 boolean ispreview = false; @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); // 设置全屏 requestwindowfeature(window.feature_no_title); getwindow().setflags(windowmanager.layoutparams.flag_fullscreen, windowmanager.layoutparams.flag_fullscreen); setcontentview(r.layout.main); // 获取窗口管理器 windowmanager wm = getwindowmanager(); display display = wm.getdefaultdisplay(); displaymetrics metrics = new displaymetrics(); // 获取屏幕的宽和高 display.getmetrics(metrics); screenwidth = metrics.widthpixels; screenheight = metrics.heightpixels; // 获取界面中surfaceview组件 sview = (surfaceview) findviewbyid(r.id.sview); // 获得surfaceview的surfaceholder surfaceholder = sview.getholder(); // 为surfaceholder添加一个回调监听器 surfaceholder.addcallback(new callback() { @override public void surfacechanged(surfaceholder holder, int format, int width, int height) { } @override public void surfacecreated(surfaceholder holder) { // 打开摄像头 initcamera(); } @override public void surfacedestroyed(surfaceholder holder) { // 如果camera不为null ,释放摄像头 if (camera != null) { if (ispreview) camera.stoppreview(); camera.release(); camera = null; } } }); } private void initcamera() { if (!ispreview) { // 此处默认打开后置摄像头。 // 通过传入参数可以打开前置摄像头 camera = camera.open(0); //① camera.setdisplayorientation(90); } if (camera != null && !ispreview) { try { camera.parameters parameters = camera.getparameters(); // 设置预览照片的大小 parameters.setpreviewsize(screenwidth, screenheight); // 设置预览照片时每秒显示多少帧的最小值和最大值 parameters.setpreviewfpsrange(4, 10); // 设置图片格式 parameters.setpictureformat(imageformat.jpeg); // 设置jpg照片的质量 parameters.set("jpeg-quality", 85); // 设置照片的大小 parameters.setpicturesize(screenwidth, screenheight); // 通过surfaceview显示取景画面 camera.setpreviewdisplay(surfaceholder); //② // 开始预览 camera.startpreview(); //③ } catch (exception e) { e.printstacktrace(); } ispreview = true; } } /** * 此方法在布局文件中调用 * */ public void capture(view source) { if (camera != null) { // 控制摄像头自动对焦后才拍照 camera.autofocus(autofocuscallback); //④ } } autofocuscallback autofocuscallback = new autofocuscallback() { // 当自动对焦时激发该方法 @override public void onautofocus(boolean success, camera camera) { if (success) { // takepicture()方法需要传入3个监听器参数 // 第1个监听器:当用户按下快门时激发该监听器 // 第2个监听器:当相机获取原始照片时激发该监听器 // 第3个监听器:当相机获取jpg照片时激发该监听器 camera.takepicture(new shuttercallback() { public void onshutter() { // 按下快门瞬间会执行此处代码 } }, new picturecallback() { public void onpicturetaken(byte[] data, camera c) { // 此处代码可以决定是否需要保存原始照片信息 } }, myjpegcallback); //⑤ } } }; picturecallback myjpegcallback = new picturecallback() { @override public void onpicturetaken(byte[] data, camera camera) { // 根据拍照所得的数据创建位图 final bitmap bm = bitmapfactory.decodebytearray(data, 0, data.length); string filename=getfilenmae(); if (filename==null) return; // 创建一个位于sd卡上的文件 file file = new file(filename); fileoutputstream outstream = null; try { // 打开指定文件对应的输出流 outstream = new fileoutputstream(file); // 把位图输出到指定文件中 bm.compress(compressformat.jpeg, 100, outstream); outstream.close(); toast.maketext(captureimage.this, "照片以保存到"+filename, toast.length_short).show(); } catch (ioexception e) { e.printstacktrace(); } // 重新浏览 camera.stoppreview(); camera.startpreview(); ispreview = true; } }; /** * 返回摄取照片的文件名 * @return 文件名 * */ protected string getfilenmae() { // todo auto-generated method stub string filename; if (!environment.getexternalstoragestate().equals (environment.media_mounted)) { toast.maketext(this, "监测到你的手机没有插入sd卡,请插入sd卡后再试", toast.length_long).show(); return null; } simpledateformat sdf=new simpledateformat("yyyy-mm-dd hh.mm.ss", locale.getdefault()); filename=environment.getexternalstoragedirectory()+file.separator +sdf.format(new date())+".jpg"; return filename; } }
程序运行效果图:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。