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         @Override
119         public void onPictureTaken(byte[] data, Camera camera)
120         {
121             // 根据拍照所得的数据创建位图
122             final Bitmap bm = BitmapFactory.decodeByteArray(data
123                 , 0, data.length);
124             // 加载/layout/save.xml文件对应的布局资源
125             View saveDialog = getLayoutInflater().inflate(
126                 R.layout.save, null);
127             final EditText photoName = (EditText) saveDialog
128                 .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                     @Override
139                     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                         try
147                         {
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 }
原文地址:https://www.cnblogs.com/phj981805903/p/3306435.html