SurfaceView调用camera进行显示与拍照

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

时间: 2024-10-01 22:27:43

SurfaceView调用camera进行显示与拍照的相关文章

Android中使用Camera类编写手机拍照App的实例教程

Camera是Android摄像头硬件的相机类,位于硬件包"android.hardware.Camera"下.它主要用于摄像头捕获图片.启动/停止预览图片.拍照.获取视频帧等,它是设备本地的服务,负责管理设备上的摄像头硬件. Camera既然用于管理设备上的摄像头硬件,那么它也为开发人员提供了相应的方法,并且这些方法大部分都是native的,用C++在底层实现,下面简单介绍一下Camera的一些方法: static Camera open():打开Camera,返回一个Camera实

flex4.6 用camera调用手机摄像头显示的影像逆时针90度

问题描述 flex4.6 用camera调用手机摄像头显示的影像逆时针90度 我用flex4.6创建手机项目,并且运行了用camera调用摄像头的代码,在模拟器中运行的结果显示正常,但是在手机上运行后,发现显示的图像逆时针90度. 注:肯定不是代码的问题. 希望大家帮忙解决一下或者提点改进的方法. 解决方案 楼主,你现在这个问题解决了么.求解,我现在也遇到了这个问题,谢谢~~~ 解决方案二: 自己再回答一下,方便以后查阅,在*-app.xml文件中把已经注释的 改为landscape 这个横屏即

魅族 2 amera-魅族MX2 程序中调用Camera, 拍照问题

问题描述 魅族MX2 程序中调用Camera, 拍照问题 魅族MX2摄像头: 在程序中调用Camera, 拍出来的图片逆时针180度,而且只是拍摄图片的一部分,三星,小米,nexus5拍出来的图片都是正的,,这是怎么回事啊? if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) { parameters.set("orientation", "

Android编程调用Camera和相册功能详解

本文实例讲述了Android编程调用Camera和相册功能.分享给大家供大家参考,具体如下: xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="

Android编程实现调用相册、相机及拍照后直接裁剪的方法

本文实例讲述了Android编程实现调用相册.相机及拍照后直接裁剪的方法.分享给大家供大家参考,具体如下: package com.cvte.health.phone; import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; import android.app.Activity; import android.content.ContentResolver; import android.co

ios8 cordova3.8 的camera插件,无法拍照

问题描述 ios8 cordova3.8 的camera插件,无法拍照 一个ios应用,使用了cordova3.8构建的应用,在使用cordova-plugin-camera插件时,可以调出拍照界面,但是没有拍照按钮,连cancel按钮也没有,ios sdk版本8.3,请教各位如何解决这个问题?

android-Android 调用系统相机的问题:怎么调用系统相机实现连续拍照

问题描述 Android 调用系统相机的问题:怎么调用系统相机实现连续拍照 调用系统相机只能拍一张照片就返回了~能不能多拍几张再返回的常量 解决方案 在实现拍照的功能时遇到了很多问题,搜索了很多资料,尝试了很多办法,终于解决了,下面简要的描述下在开发过程中遇到的问题. 虽然之前看过android开发的书,但是没有做过东西,这次也是临时决定让我做一个android采集系统的演示程序.拍照是其中一个功能,让网搜索了下拍照有两种方式,其中一种就是调用系统相机实现拍照功能. 启动照相机进行拍照,代码如下

driver-camera hal调用camera驱动的连接方式

问题描述 camera hal调用camera驱动的连接方式 Camera.java--->Camera.java(framework)--->android_hardware_camera.cpp(jni)---->Camera.cpp--->ICameraService ---(通过binder机制)---->CameraService.cpp---->CameraHardwareInterface.h->QualcommCamera->Qualcomm

摄像压缩-android 调用camera摄像 如何进行压缩!

问题描述 android 调用camera摄像 如何进行压缩! 百度不出来具体资料 怎么感觉好难找 谁有 分享下 多谢! 是调用摄像头摄像压缩 解决方案 我有demo加我QQ8069159 我发给你 解决方案二: /** * 根据分辨率图片压缩 * * @param srcPath * @return */ public static String compressImageResolution(String srcPath) { BitmapFactory.Options newOpts =