Android Camera进行拍照

来源:互联网 发布:知敬畏存戒惧守底线 编辑:程序博客网 时间:2024/04/26 19:28
Android应用提供了Camera来控制拍照,使用Camera进行拍照的步骤:

  1、调用Camera的open()方法打开相机。

 2、调用Camera的getParameters()方法获取拍照参数,该方法返回一个Camera.Parameters对象。

  3、调用Camera.Parameters对象方法设置拍照参数。

 4、调用Camera的setParameter(),将Camera.Parameters对象作为参数传入,既可对相机的拍照参数进行控制,注:Android2.2.3以后不需要这步。

 5、调用Camera的startPreview()方法开始预览取景,在预览取景之前需调用Camera的setPreviewDisplay(SurfaceHolderholder)方法设置使用哪个SurfaceView来显示取景图片。

  6、调用Camera的takePicture()方法进行拍照。

 7、结束程序时,调用Camera的stopPreview()结束取景预览,并调用release()方法释放资源。

  下面直接上代码:

public class CaptureImage extends Activity
{
 SurfaceView sView;
 SurfaceHolder surfaceHolder;
 int screenWidth, screenHeight;
 // 定义系统所用的照相机
 Camera camera;
 //是否在浏览中
 boolean isPreview = false;
   @Override
 public void onCreate(BundlesavedInstanceState)
 {
  super.onCreate(savedInstanceState);
  // 设置全屏
  requestWindowFeature(Window.FEATURE_NO_TITLE);
  getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
   WindowManager.LayoutParams.FLAG_FULLSCREEN);
  setContentView(R.layout.main);
  WindowManager wm =(WindowManager) getSystemService(
   Context.WINDOW_SERVICE);
  Display display =wm.getDefaultDisplay();
  // 获取屏幕的宽和高
  screenWidth =display.getWidth();
  screenHeight =display.getHeight();
  // 获取界面中SurfaceView组件
  sView = (SurfaceView)findViewById(R.id.sView);
  //获得SurfaceView的SurfaceHolder
  surfaceHolder =sView.getHolder();
  //为surfaceHolder添加一个回调监听器
  surfaceHolder.addCallback(newCallback()
  {
   @Override
   public voidsurfaceChanged(SurfaceHolder holder, int format, int width,
    intheight)
   {
   }
   @Override
   public voidsurfaceCreated(SurfaceHolder holder)
   {
    //打开摄像头
    initCamera();
   }
   @Override
   public voidsurfaceDestroyed(SurfaceHolder holder)
   {
    //如果camera不为null ,释放摄像头
    if(camera != null)
    {
     if(isPreview)
      camera.stopPreview();
     camera.release();
     camera= null;
    }
    
  });
  //设置该SurfaceView自己不维护缓冲   
  surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
 }

 private void initCamera()
 {
  if (!isPreview)
  {
   camera =Camera.open();
  }
  if (camera != null &&!isPreview)
  {
   try
   {
    Camera.Parametersparameters = camera.getParameters();
    //设置预览照片的大小
    parameters.setPreviewSize(screenWidth,screenHeight);
    //每秒显示4帧
    parameters.setPreviewFrameRate(4);
    //设置图片格式
    parameters.setPictureFormat(PixelFormat.JPEG);
    //设置JPG照片的质量
    parameters.set("jpeg-quality",85);
    //设置照片的大小
    parameters.setPictureSize(screenWidth,screenHeight);
    camera.setParameters(parameters);
    //通过SurfaceView显示取景画面
    camera.setPreviewDisplay(surfaceHolder);
    //开始预览
    camera.startPreview();
    //自动对焦
    camera.autoFocus(null);
   }
   catch(Exception e)
   {
    e.printStackTrace();
   }
   isPreview =true;
  }
 }
 
 @Override
 public boolean onKeyDown(int keyCode, KeyEventevent)
 {
  switch (keyCode)
  {
   //当用户单击照相键、中央键时执行拍照
   caseKeyEvent.KEYCODE_DPAD_CENTER:
   caseKeyEvent.KEYCODE_CAMERA:
    if(camera != null && event.getRepeatCount() == 0)
    {
     //拍照
     camera.takePicture(null,null , myjpegCallback);
     returntrue;
    }
    break;
   
  return super.onKeyDown(keyCode,event);
 }
 
 PictureCallback myjpegCallback = newPictureCallback()
 {
  @Override
  public voidonPictureTaken(byte[] data, Camera camera)
  {
   //根据拍照所得的数据创建位图
   final Bitmapbm = BitmapFactory.decodeByteArray(data
    ,0, data.length);
   //加载/layout/save.xml文件对应的布局资源
   ViewsaveDialog = getLayoutInflater().inflate(
    R.layout.save,null);
   finalEditText photoName = (EditText) saveDialog
    .findViewById(R.id.phone_name);
   //获取saveDialog对话框上的ImageView组件
   ImageViewshow = (ImageView) saveDialog.findViewById(R.id.show);
   //显示刚刚拍得的照片
   show.setImageBitmap(bm);
   //使用对话框显示saveDialog组件
   newAlertDialog.Builder(CaptureImage.this)
    .setView(saveDialog)
    .setPositiveButton("保存",new OnClickListener()
    {
     @Override
     publicvoid onClick(DialogInterface dialog,
      intwhich)
     {
      //创建一个位于SD卡上的文件
      Filefile = new File(Environment.getExternalStorageDirectory()
       photoName.getText().toString() + ".jpg");
      FileOutputStreamoutStream = null;
      try
      {
       //打开指定文件对应的输出流
       outStream= new FileOutputStream(file);
       //把位图输出到指定文件中
       bm.compress(CompressFormat.JPEG,100, outStream);
       outStream.close();
      }
      catch(IOException e)
      {
       e.printStackTrace();
      }
     }
    })
    .setNegativeButton("取消",null)
    .show();
   //重新浏览
   camera.stopPreview();
   camera.startPreview();
   isPreview =true;
  }
 };
}

原创粉丝点击