1、首先继承SurfaceView并实现SurfaceHolder.Callback接口
使用接口的原因:因为使用SurfaceView 有一个原则,所有的绘图工作必须得在Surface 被创建之后才能开始(Surface—表面,这个概念在 图形编程中常常被提到。基本上我们可以把它当作显存的一个映射,写入到Surface 的内容
可以被直接复制到显存从而显示出来,这使得显示速度会非常快),而在Surface 被销毁之前必须结束。所以Callback 中的surfaceCreated 和surfaceDestroyed 就成了绘图处理代码的边界。
而我们在调用camera也是在他的OnCreate()方法里
/**
* surfaceView 被创建成功后调用此方法
*/
@Override
public void surfaceCreated(SurfaceHolder holder) {
/*
* 在SurfaceView创建好之后 打开摄像头
* 注意是 android.hardware.Camera
*/
camera = Camera.open(cameraPosition); //默认启用的摄像头是后置摄像头id=0, id =1前置摄像头
try {
camera.setPreviewDisplay(holder); //这句是用来设置显示的,不调用的话没有图像
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Camera.Parameters parameters = camera.getParameters(); //获取他的熟悉来进行设置
setCameraDisplayOrientation(MainActicity.this, cameraPosition, camera); //进行旋转,因为摄像头默认的
//不是显示是横向的,可以删掉这一行看看效果
/* 设置预览照片的大小,此处设置为全屏 */
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE); // 获取当前屏幕管理器对象
Display display = wm.getDefaultDisplay(); // 获取屏幕信息的描述类
// parameters.setPreviewSize(display.getWidth(), display.getHeight());
// parameters.setPictureSize(display.getWidth(), display.getHeight());// 如果是定制机或是进行过深度测试的不需要设置这俩个属性
/* 每秒从摄像头捕获5帧画面, */
parameters.setPreviewFrameRate(5);
/* 设置照片的输出格式:jpg */
parameters.setPictureFormat(PixelFormat.JPEG);
/* 照片质量 */
parameters.set("jpeg-quality", 85);
/* 设置照片的大小:此处照片大小等于屏幕大小 */
/* 将参数对象赋予到 camera 对象上 */
camera.setParameters(parameters);
camera.startPreview();
preview = true;
}
2、当被销毁的时候要关闭摄像头
/**
* SurfaceView 被销毁时释放掉 摄像头
*/
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if(camera != null) {
/* 若摄像头正在工作,先停止它 */
if(preview) {
camera.stopPreview();
preview = false;
}
camera.release();
}
}
3、切换摄像头是通过配置他的参数来设置Camera.Open(i); i就是要打开的摄像头id;
// TODO Auto-generated method stub
int cameraCount = 0;
CameraInfo cameraInfo = new CameraInfo();
cameraCount = Camera.getNumberOfCameras();//得到摄像头的个数
for(int i = 0; i < cameraCount; i ++ ) {
Camera.getCameraInfo(i, cameraInfo);//得到每一个摄像头的信息
if(cameraPosition == 1) {
//现在是后置,变更为前置
if(cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {//代表摄像头的方位,CAMERA_FACING_FRONT前置 CAMERA_FACING_BACK后置
camera.stopPreview();//停掉原来摄像头的预览
camera.release();//释放资源
camera = null;//取消原来摄像头
camera = Camera.open(i);//打开当前选中的摄像头
try {
camera.setPreviewDisplay(holder);//通过surfaceview显示取景画面
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
setCameraDisplayOrientation(MainActicity.this, cameraPosition, camera);
camera.startPreview();//开始预览
cameraPosition = 0;
break;
}
} else {
//现在是前置, 变更为后置
if(cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {//代表摄像头的方位,CAMERA_FACING_FRONT前置 CAMERA_FACING_BACK后置
camera.stopPreview();//停掉原来摄像头的预览
camera.release();//释放资源
camera = null;//取消原来摄像头
camera = Camera.open(i);//打开当前选中的摄像头
try {
camera.setPreviewDisplay(holder);//通过surfaceview显示取景画面
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
setCameraDisplayOrientation(MainActicity.this, cameraPosition, camera);
camera.startPreview();//开始预览
cameraPosition = 1;
break;
}
}
}
}
4、还有就是拍照:拍照的话camera有一个回调的监听
当点击拍照的 时候jpeg对象就是他的一个对象
//快门
camera.autoFocus(new AutoFocusCallback() {//自动对焦
@Override
public void onAutoFocus(boolean success, Camera camera) {
// TODO Auto-generated method stub
if(success) {
//设置参数,并拍照
Parameters params = camera.getParameters();
params.setPictureFormat(PixelFormat.JPEG);//图片格式
params.setPreviewSize(800, 480);//图片大小
camera.setParameters(params);//将参数设置到我的camera
camera.takePicture(null, null, jpeg);//将拍摄到的照片给自定义的对象
}
}
//创建jpeg图片回调数据对象
PictureCallback jpeg = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
// TODO Auto-generated method stub
try {
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
imageView.setImageBitmap(bitmap);
camera.stopPreview();//关闭预览 处理数据
camera.startPreview();//数据处理完后继续开始预览
// bitmap.recycle();//回收bitmap空间
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
5、然后就是添加他的权限就好了
<!-- 申请使用摄像头的权限 -->
<uses-permission android:name="android.permission.CAMERA"/>
Demo下载:http://download.csdn.net/detail/u012808234/8615947
原文:http://blog.csdn.net/u012808234/article/details/45168575