首页 > 其他 > 详细

SurfaceView调用camera进行显示与拍照

时间:2015-04-21 14:43:37      阅读:346      评论:0      收藏:0      [点我收藏+]

1、首先继承SurfaceView并实现SurfaceHolder.Callback接口
使用接口的原因:因为使用SurfaceView 有一个原则,所有的绘图工作必须得在Surface 被创建之后才能开始(Surface—表面,这个概念在 图形编程中常常被提到。基本上我们可以把它当作显存的一个映射,写入到Surface 的内容
                      可以被直接复制到显存从而显示出来,这使得显示速度会非常快),而在Surface 被销毁之前必须结束。所以Callback 中的surfaceCreated 和surfaceDestroyed 就成了绘图处理代码的边界。


而我们在调用camera也是在他的OnCreate()方法里

  /**
         * surfaceView 被创建成功后调用此方法
         */
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            /*
             * 在SurfaceView创建好之后 打开摄像头
             * 注意是 android.hardware.Camera
             */
            camera = Camera.open(cameraPosition); //默认启用的摄像头是后置摄像头id=0,  id =1前置摄像头
            
            try {
                camera.setPreviewDisplay(holder);    //这句是用来设置显示的,不调用的话没有图像
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            Camera.Parameters parameters = camera.getParameters();    //获取他的熟悉来进行设置
            
            
                setCameraDisplayOrientation(MainActicity.this, cameraPosition, camera); //进行旋转,因为摄像头默认的

//不是显示是横向的,可以删掉这一行看看效果
            
            /* 设置预览照片的大小,此处设置为全屏 */
            WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE); // 获取当前屏幕管理器对象
            Display display = wm.getDefaultDisplay();                           // 获取屏幕信息的描述类
//            parameters.setPreviewSize(display.getWidth(), display.getHeight());  
//            parameters.setPictureSize(display.getWidth(), display.getHeight());// 如果是定制机或是进行过深度测试的不需要设置这俩个属性
           
            /* 每秒从摄像头捕获5帧画面, */
            parameters.setPreviewFrameRate(5);
            /* 设置照片的输出格式:jpg */
            parameters.setPictureFormat(PixelFormat.JPEG);
            /* 照片质量 */
            parameters.set("jpeg-quality", 85);
            /* 设置照片的大小:此处照片大小等于屏幕大小 */
            /* 将参数对象赋予到 camera 对象上 */
            camera.setParameters(parameters);
            camera.startPreview();
            preview = true;
        }



2、当被销毁的时候要关闭摄像头

       /**
         * SurfaceView 被销毁时释放掉 摄像头
         */
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            if(camera != null) {
                /* 若摄像头正在工作,先停止它 */
                if(preview) {
                    camera.stopPreview();
                    preview = false;
                }       
                camera.release();
            }
        }
      


3、切换摄像头是通过配置他的参数来设置Camera.Open(i);  i就是要打开的摄像头id;

// TODO Auto-generated method stub
             int cameraCount = 0;
             CameraInfo cameraInfo = new CameraInfo();
             cameraCount = Camera.getNumberOfCameras();//得到摄像头的个数

             for(int i = 0; i < cameraCount; i ++  ) {
                 Camera.getCameraInfo(i, cameraInfo);//得到每一个摄像头的信息
                 if(cameraPosition == 1) {
                     //现在是后置,变更为前置
                     if(cameraInfo.facing  == Camera.CameraInfo.CAMERA_FACING_FRONT) {//代表摄像头的方位,CAMERA_FACING_FRONT前置      CAMERA_FACING_BACK后置  
                         camera.stopPreview();//停掉原来摄像头的预览
                         camera.release();//释放资源
                         camera = null;//取消原来摄像头
                         camera = Camera.open(i);//打开当前选中的摄像头
                         try {
                             camera.setPreviewDisplay(holder);//通过surfaceview显示取景画面
                         } catch (IOException e) {
                             // TODO Auto-generated catch block
                             e.printStackTrace();
                         }
                         
                         setCameraDisplayOrientation(MainActicity.this, cameraPosition, camera);
                         camera.startPreview();//开始预览
                         cameraPosition = 0;
                         break;
                     }
                 } else {
                     //现在是前置, 变更为后置
                     if(cameraInfo.facing  == Camera.CameraInfo.CAMERA_FACING_BACK) {//代表摄像头的方位,CAMERA_FACING_FRONT前置      CAMERA_FACING_BACK后置  
                         camera.stopPreview();//停掉原来摄像头的预览
                         camera.release();//释放资源
                         camera = null;//取消原来摄像头
                         camera = Camera.open(i);//打开当前选中的摄像头
                         try {
                             camera.setPreviewDisplay(holder);//通过surfaceview显示取景画面
                         } catch (IOException e) {
                             // TODO Auto-generated catch block
                             e.printStackTrace();
                         }
                         setCameraDisplayOrientation(MainActicity.this, cameraPosition, camera);
                         camera.startPreview();//开始预览
                         cameraPosition = 1;
                         break;
                     }
                 }

             }
        }

4、还有就是拍照:拍照的话camera有一个回调的监听

当点击拍照的 时候jpeg对象就是他的一个对象

 //快门
            camera.autoFocus(new AutoFocusCallback() {//自动对焦
                @Override
                public void onAutoFocus(boolean success, Camera camera) {
                    // TODO Auto-generated method stub
                    if(success) {
                        //设置参数,并拍照
                        Parameters params = camera.getParameters();
                        params.setPictureFormat(PixelFormat.JPEG);//图片格式
                        params.setPreviewSize(800, 480);//图片大小
                        camera.setParameters(params);//将参数设置到我的camera
                        camera.takePicture(null, null, jpeg);//将拍摄到的照片给自定义的对象
                    }
                }

  //创建jpeg图片回调数据对象
    PictureCallback jpeg = new PictureCallback() {
        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
            // TODO Auto-generated method stub
            try {
                Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
             
                
                imageView.setImageBitmap(bitmap);
                camera.stopPreview();//关闭预览 处理数据
                camera.startPreview();//数据处理完后继续开始预览
//                bitmap.recycle();//回收bitmap空间
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    };

5、然后就是添加他的权限就好了

    <!-- 申请使用摄像头的权限 -->
    <uses-permission android:name="android.permission.CAMERA"/>



Demo下载:http://download.csdn.net/detail/u012808234/8615947


SurfaceView调用camera进行显示与拍照

原文:http://blog.csdn.net/u012808234/article/details/45168575

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!