我们可以使用两类方法:
一是借助Intent和MediaStroe调用系统Camera App程序来实现拍照和摄像功能
二是根据Camera API自写Camera程序(如360的拍照软件)
这里主要记录第二点
1.【添加权限】
必须在manifest内声明使用权限,通常由以下三项
<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"/>
2.【初始化】
在Activity的OnCreate函数中设置好SurfaceView,包括设置SurfaceHolder.Callback对象和SurfaceHolder对象的类型,具体如下
sv = (SurfaceView)findViewById(R.id.peoplemanage_sv_001);
sh = sv.getHolder();
sh.addCallback(this);//(这里注意,要求Activity实现接口 implements Callback ,下面3,4,5步的三个函数都是实现这个接口的)
sh.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); // 设置该SurfaceHolder自己不维护缓冲
3.【打开摄像头】
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
if (!isOpen) {// 如果相机未打开
try {
int num = Camera.getNumberOfCameras();//获取摄像头的数量
for (int i = 0; i < num; i++) {
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(i,info);
if (info.facing == CameraInfo.CAMERA_FACING_BACK) {//后置摄像头
camera = Camera.open(i); // 打开相机
isOpen = true;
break;
}
}
} catch (Exception e) {
// TODO: handle exception
isOpen = false;
}
}
}
4.【预览】
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {
// TODO Auto-generated method stub
if (isOpen) {
try {
camera.setPreviewDisplay(sh); // 设置用于显示预览的SurfaceView
Camera.Parameters parameters = camera.getParameters(); // 获取相机参数
parameters.setPictureFormat(PixelFormat.JPEG); // 指定图片为JPEG图片
parameters.set("jpeg-quality", 80); // 设置图片的质量
parameters.set("orientation", "landscape"); // 设置竖屏
parameters.setPictureSize(640, 480); // 设置拍摄图片的尺寸
camera.setParameters(parameters); // 重新设置相机参数
camera.setDisplayOrientation(90);
camera.autoFocus(null); // 设置自动对焦
camera.startPreview(); // 开始预览
} catch (IOException e) {
e.printStackTrace();
}
}
}
5.【释放摄像头】
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
// 释放手机摄像头
camera.release();
}
6.【其它细节】
private SurfaceView sv = null;
private SurfaceHolder sh = null;
private Camera camera; // 相机对象
private boolean isOpen = false; // 是否为预览模式
<SurfaceView
android:id="@+id/peoplemanage_sv_001"
android:layout_width="match_parent"
android:layout_height="match_parent" />
参考http://www.cnblogs.com/franksunny/archive/2011/11/17/2252926.html