Android实现控制摄像头拍照
现在的手机一般都会提供相机功能,有些相机的镜头甚至支持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;
}
}程序运行效果图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持萬仟网。
看完文章,还可以扫描下面的二维码下载快手极速版领4元红包
除了扫码领红包之外,大家还可以在快手极速版做签到,看视频,做任务,参与抽奖,邀请好友赚钱)。
邀请两个好友奖最高196元,如下图所示:






