admin 发表于 2013-11-27 13:55:50

手机控制CAMERA拍照的方法归纳

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;
}
};
}



页: [1]
查看完整版本: 手机控制CAMERA拍照的方法归纳