android 相机设置
现在的手机几乎都实现照相机功能了,而且在硬件的支持下像素也越来越高,在现实生活中的用途也越来越广,而在Android中专门 提供了Camera来处理相机相关的事件,Camera 是一个专门用来连接和断开相机服务的类,Camera 下面包括如下几个事件:
Camera.AutoFocusCallback: 自动调焦功能;
Camera.ErrorCallback:错误信息捕捉;
Camera.Parameters :相机的属性参数
Camera.PictureCallback:拍照、产生图片时触发;
Camera.PreviewCallback:相机预览设置;
Camera.ShutterCallback:快门设置;
Camera.Size:图片尺寸;
要在Android中使用相机服务很简单,Camera没有构造方法,我们要使用它直接通过open()方法来打开相机设备,然后通过 Camera.Parameters 对相机的一些属性进行设置,比如输出图片的格式、大小等等。下面是Camera类一些常用的方法介绍。
Camera类的方法
方法 说明
autoFocus 设置自动对焦
getParameters 得到相机的参数
open 启动相机服务
release 释放Camera服务
setPreviewDisplay 设置预览
setParameters 设置预览参数
startPreview 开始预览
stopPreview 停止预览
takePicture 拍照
这里重点说明一下拍照的方法和使用, takePicture 方法要实现3个回调函数,分别是: Camera.ShutterCallback (快门) 和 两个Camera.PictureCallback(图像数据)。这里我们在拍照之后要取得图像数据就需要实现Camera.PictureCallback 的 onPictureTaken 方法。onPictureTaken 中第一个参数就是图像数据, 第二个参数则是相机。
下面是一个相机拍照的例子。相机需要一个界面来预览当前拍摄的效果,这里可以使用SurfaceView类。 我们先来看看在模拟器上的运行效果吧。
下面我们来看具体如何使用相机服务预览效果,最后按导航键中键来拍照,将照片保存到SD卡中(当然首先要确认有SD卡插入)。 代码如下
Activity01类
package xiaohang.zhimeng;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileOutputStream;import android.app.Activity;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.PixelFormat;import android.hardware.Camera;import android.hardware.Camera.PictureCallback;import android.os.Bundle;import android.view.KeyEvent;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.Window;public class Activity01 extends Activity {private Preview mPreview;@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); //Create our Preview view and set it as the content of our activity. mPreview = new Preview(this); setContentView(mPreview); } public boolean onKeyUp(int keyCode, KeyEvent event){ switch (keyCode) {case KeyEvent.KEYCODE_DPAD_CENTER:mPreview.takePicture();break;} return true; }} /*Preview-显示Preview*/ class Preview extends SurfaceView implements SurfaceHolder.Callback{ SurfaceHolder mHolder; Camera mCamera; Bitmap cameraBitmap; public Preview(Context context) {super(context);//得到SurfaceHolder对象mHolder = getHolder();//添加回调函数mHolder.addCallback(this);//设置SurfaceHolder 的类型mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);}//在Surface的大小发生改变时激发@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {/*构建Camera.Parameters对相机的参数进行设置*/Camera.Parameters parameters = mCamera.getParameters();/*设置拍照的图片格式*/parameters.setPictureFormat(PixelFormat.JPEG);/*设置Preview(预览)的尺寸*/parameters.setPreviewSize(320, 480);mCamera.setParameters(parameters);/*开始预览*/mCamera.startPreview();}/*拍照片*/public void takePicture(){if (mCamera != null) {mCamera.takePicture(null, null, jpegCallback);}}/*拍照后输出图片*/private PictureCallback jpegCallback = new PictureCallback(){@Overridepublic void onPictureTaken(byte[] data, Camera camera) {// TODO Handle JPEG image data//解码一个不可变的位图 从指定的字节数组cameraBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);File myCaptureFile = new File("/sdcard/camera1.jpg");try {BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));//压缩位图到指定的OutputStreamcameraBitmap.compress(Bitmap.CompressFormat.JPEG, 80, bos);//刷新此缓冲区的输出流bos.flush();//关闭此输出流并释放与此流有关的所有系统资源bos.close();/*将拍到的图片绘制出来*///锁定画布Canvas canvas = mHolder.lockCanvas();canvas.drawBitmap(cameraBitmap, 0, 0, null);//绘制后解锁,绘制后必须解锁才能显示mHolder.unlockCanvasAndPost(canvas);} catch (Exception e) {e.getMessage();}}};//在创建Surface时激发@Overridepublic void surfaceCreated(SurfaceHolder holder) {/*启动Camera*/mCamera = Camera.open();try {mCamera.setPreviewDisplay(holder);} catch (Exception e) {/*释放mCamera*/mCamera.release();mCamera = null;}} //在销毁Surface时激发@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {/*停止预览*/mCamera.stopPreview();mCamera = null;} }<uses-permission android:name="android.permission.CAMERA" /><uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" />