zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    实例讲解Springboot以Repository方式整合Redis
    Spark join 源码跟读记录
    数理统计与参数估计杂记
    常见的距离算法和相似度(相关系数)计算方法
    生成模型(Generative Model)与判别模型(Discriminative Model)
    Java 积累复习用
    RangePartitioner 实现简记
    Spark常见问题汇总
    2016年终总结
    学习资料库
  • 原文地址:https://www.cnblogs.com/phj981805903/p/3306435.html
Copyright © 2011-2022 走看看