Android Camera进行拍照

来源:互联网 发布:求实软件操作流程 编辑:程序博客网 时间:2024/03/28 23:25

Android Camera进行拍照

  Android应用提供了Camera来控制拍照,使用Camera进行拍照的步骤:

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

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

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

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

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

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

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

  下面直接上代码:

复制代码
  1 public class CaptureImage extends Activity  2 {  3     SurfaceView sView;  4     SurfaceHolder surfaceHolder;  5     int screenWidth, screenHeight;  6     // 定义系统所用的照相机  7     Camera camera;  8     //是否在浏览中  9     boolean isPreview = false; 10     @Override 11     public void onCreate(Bundle savedInstanceState) 12     { 13         super.onCreate(savedInstanceState); 14         // 设置全屏 15         requestWindowFeature(Window.FEATURE_NO_TITLE); 16         getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 17             WindowManager.LayoutParams.FLAG_FULLSCREEN); 18         setContentView(R.layout.main); 19         WindowManager wm = (WindowManager) getSystemService( 20             Context.WINDOW_SERVICE); 21         Display display = wm.getDefaultDisplay(); 22         // 获取屏幕的宽和高 23         screenWidth = display.getWidth(); 24         screenHeight = display.getHeight(); 25         // 获取界面中SurfaceView组件 26         sView = (SurfaceView) findViewById(R.id.sView); 27         // 获得SurfaceView的SurfaceHolder 28         surfaceHolder = sView.getHolder(); 29         // 为surfaceHolder添加一个回调监听器 30         surfaceHolder.addCallback(new Callback() 31         { 32             @Override 33             public void surfaceChanged(SurfaceHolder holder, int format, int width, 34                 int height) 35             { 36             } 37             @Override 38             public void surfaceCreated(SurfaceHolder holder) 39             { 40                 // 打开摄像头 41                 initCamera(); 42             } 43             @Override 44             public void surfaceDestroyed(SurfaceHolder holder) 45             { 46                 // 如果camera不为null ,释放摄像头 47                 if (camera != null) 48                 { 49                     if (isPreview) 50                         camera.stopPreview(); 51                     camera.release(); 52                     camera = null; 53                 } 54             }         55         }); 56         // 设置该SurfaceView自己不维护缓冲     57         surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 58     } 59  60     private void initCamera() 61     { 62         if (!isPreview) 63         { 64             camera = Camera.open(); 65         } 66         if (camera != null && !isPreview) 67         { 68             try 69             { 70                 Camera.Parameters parameters = camera.getParameters(); 71                 // 设置预览照片的大小 72                 parameters.setPreviewSize(screenWidth, screenHeight); 73                 // 每秒显示4帧 74                 parameters.setPreviewFrameRate(4); 75                 // 设置图片格式 76                 parameters.setPictureFormat(PixelFormat.JPEG); 77                 // 设置JPG照片的质量 78                 parameters.set("jpeg-quality", 85); 79                 //设置照片的大小 80                 parameters.setPictureSize(screenWidth, screenHeight); 81                 camera.setParameters(parameters); 82                 //通过SurfaceView显示取景画面 83                 camera.setPreviewDisplay(surfaceHolder); 84                 // 开始预览 85                 camera.startPreview(); 86                 // 自动对焦 87                 camera.autoFocus(null); 88             } 89             catch (Exception e) 90             { 91                 e.printStackTrace(); 92             } 93             isPreview = true; 94         } 95     } 96      97     @Override 98     public boolean onKeyDown(int keyCode, KeyEvent event) 99     {100         switch (keyCode)101         {102             // 当用户单击照相键、中央键时执行拍照103             case KeyEvent.KEYCODE_DPAD_CENTER:104             case KeyEvent.KEYCODE_CAMERA:105                 if (camera != null && event.getRepeatCount() == 0)106                 {107                     // 拍照108                     camera.takePicture(null, null , myjpegCallback);109                     return true;110                 }111                 break;112         }        113         return super.onKeyDown(keyCode, event);114     }115     116     PictureCallback myjpegCallback = new PictureCallback()117     {118         @Override119         public void onPictureTaken(byte[] data, Camera camera)120         {121             // 根据拍照所得的数据创建位图122             final Bitmap bm = BitmapFactory.decodeByteArray(data123                 , 0, data.length);124             // 加载/layout/save.xml文件对应的布局资源125             View saveDialog = getLayoutInflater().inflate(126                 R.layout.save, null);127             final EditText photoName = (EditText) saveDialog128                 .findViewById(R.id.phone_name);129             // 获取saveDialog对话框上的ImageView组件130             ImageView show = (ImageView) saveDialog.findViewById(R.id.show);131             // 显示刚刚拍得的照片132             show.setImageBitmap(bm);133             //使用对话框显示saveDialog组件134             new AlertDialog.Builder(CaptureImage.this)135                 .setView(saveDialog)136                 .setPositiveButton("保存", new OnClickListener()137                 {138                     @Override139                     public void onClick(DialogInterface dialog,140                         int which)141                     {142                         // 创建一个位于SD卡上的文件143                         File file = new File(Environment.getExternalStorageDirectory()144                             ,  photoName.getText().toString() + ".jpg");145                         FileOutputStream outStream = null;146                         try147                         {148                             // 打开指定文件对应的输出流149                             outStream = new FileOutputStream(file);150                             // 把位图输出到指定文件中151                             bm.compress(CompressFormat.JPEG, 100, outStream);152                             outStream.close();153                         }154                         catch (IOException e)155                         {156                             e.printStackTrace();157                         }158                     }159                 })160                 .setNegativeButton("取消", null)161                 .show();162             //重新浏览163             camera.stopPreview();164             camera.startPreview();165             isPreview = true;166         }167     };168 }
0 0
原创粉丝点击