首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

android 照相机设置

2012-08-28 
android 相机设置现在的手机几乎都实现照相机功能了,而且在硬件的支持下像素也越来越高,在现实生活中的用

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" />


  源码见附件

热点排行