zoukankan      html  css  js  c++  java
  • 使用Camera进行拍照

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

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

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

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

    4、调用Camera的setParameters(),并将Camera.Parameters对象作为参数传入,这样即可对相机的拍照参数进行控制。

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

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

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

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectOutputStream.PutField;

    import android.os.Bundle;
    import android.os.Environment;
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.graphics.Bitmap;
    import android.graphics.Bitmap.CompressFormat;
    import android.graphics.BitmapFactory;
    import android.graphics.Paint;
    import android.graphics.PixelFormat;
    import android.hardware.Camera;
    import android.hardware.Camera.PictureCallback;
    import android.view.Display;
    import android.view.KeyEvent;
    import android.view.Menu;
    import android.view.SurfaceHolder;
    import android.view.SurfaceHolder.Callback;
    import android.view.SurfaceView;
    import android.view.View;
    import android.view.Window;
    import android.view.WindowManager;
    import android.widget.EditText;
    import android.widget.ImageView;

    public class CaptureImage extends Activity {
      SurfaceView sView;
      SurfaceHolder surfaceHolder;
      int screenWidth;
      int screenHeight;
      //定义系统使用的照相机
      Camera camera;
      //是否在浏览中
      boolean isPreiew = false;

      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //设置全屏
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_capture_image);
        WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
        Paint size = new Paint();
        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(new Callback() {

          @Override
          public void surfaceDestroyed(SurfaceHolder holder) {
            // 如果Camera不为null,释放摄像头
            if(camera != null){
              if(isPreiew){
                camera.stopPreview();
              }
              camera.release();
              camera = null;
            }
          }

          @Override
          public void surfaceCreated(SurfaceHolder holder) {
            // 打开摄像头
            initCamera();
          }

          @Override
          public void surfaceChanged(SurfaceHolder holder, int format, int width,
                                      int height) {
          }
        });
        //设置该SurfaceView自己不维护缓冲
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
      }

      private void initCamera(){
        if(!isPreiew){
          camera = Camera.open();
        }
        if(camera != null && !isPreiew){
          try {
            Camera.Parameters parameters = 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();
          }
          isPreiew = true;

        }
      }

      @Override
      public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode) {
          //当用户单击照相键、中央键时执行拍照
          case KeyEvent.KEYCODE_DPAD_CENTER:
          case KeyEvent.KEYCODE_CAMERA:
            if(camera != null && event.getRepeatCount() == 0){
              //拍照
              camera.takePicture(null, null, myjpegCallback);
              return true;
            }
            break;
        }
        return super.onKeyDown(keyCode, event);
      }

      PictureCallback myjpegCallback = new PictureCallback() {

        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
          // 根据拍照所得的数据创建位图
          final Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);
          //加载/layout.save.xml文件对应的布局资源
          View saveDialog = getLayoutInflater().inflate(R.layout.save, null);
          final EditText phoneName = (EditText) saveDialog.findViewById(R.id.phone_name);
          ImageView show = (ImageView) saveDialog.findViewById(R.id.show);
          //显示刚刚拍得的照片
          show.setImageBitmap(bm);
          //使用对话框显示saveDialog组件
          new AlertDialog.Builder(CaptureImage.this).setView(saveDialog)
              .setPositiveButton("保存!", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
              // 创建一个位于SD卡上的文件
              File file = new File(Environment.getExternalStorageDirectory(),phoneName.getText().toString()+".jpg");
              FileOutputStream outStream = null;
              try {
                //打开指定文件对应的输出流
                outStream = new FileOutputStream(file);
                //把位图输出到指定文件中
                bm.compress(CompressFormat.JPEG, 100, outStream);
                outStream.close();
              } catch (FileNotFoundException e) {
                e.printStackTrace();
              } catch (IOException e) {
                e.printStackTrace();
              }

            }
          }).setNegativeButton("取消",null).show();
          //重新浏览
          camera.stopPreview();
          camera.startPreview();
          isPreiew = true;
        }
      };


    }

    Android模拟器不会使用宿主机上的摄像头作为相机镜头,当用户进行拍照时,系统将会使用一张已有的图片作为相片。

    运行该程序需要获得相机拍照的权限,因此需要在AndroidManifest.xml文件中增加如下代码片段进行授权:

    <!-- 授权程序使用摄像头的权限 -->
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-feature android:name="android.hardware.camera"/>
    <uses-feature android:name="android.hardware.camera.autofocus"/>

  • 相关阅读:
    第一次作业 —— 【作业7】问卷调查
    讲座观后感
    学习进度表(随缘更新)
    数据结构与算法思维导图
    作业七问卷调查
    《创新者的逆袭,用第一性原理做颠覆式创新》读后感
    结对项目--四则运算生成器(Java) 刘彦享+龙俊健
    个人项目---WordCount实现(Java)
    自我介绍+软工五问
    简洁又快速地处理集合——Java8 Stream(下)
  • 原文地址:https://www.cnblogs.com/jiww/p/5620442.html
Copyright © 2011-2022 走看看