`

Android Camera使用小结

阅读更多
 Android 中的camera的使用是个很普遍的用法,今天小结下其使用步骤,翻译自http://mobile.tutsplus.com/tutorials/android/android-essentials-create-a-mirror/

1) 设计界面,如下
  

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <FrameLayout
        android:id="@+id/camPreview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true" >
    </FrameLayout>
    <Button
        android:id="@+id/capture"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:text="@string/capture" />
</RelativeLayout>



2 开始调用摄象头,在其oncreate事件中,如下代码:
  
private Camera mCam;
private MirrorView mCamPreview;
private int mCameraId = 0;
private FrameLayout mPreviewLayout;

@Override
public void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.main);

mCameraId = findFirstFrontFacingCamera();

	mPreviewLayout = (FrameLayout) findViewById(R.id.camPreview);
	mPreviewLayout.removeAllViews();

	startCameraInLayout(mPreviewLayout, mCameraId);

}



   这里mCameraId = findFirstFrontFacingCamera();
首先找出前置摄象头,有个findFirstFrontFacingCamera()的方法,代码如下:
  

 private int findFirstFrontFacingCamera() {
        int foundId = -1;
        // find the first front facing camera
        int numCams = Camera.getNumberOfCameras();
        for (int camId = 0; camId < numCams; camId++) {
            CameraInfo info = new CameraInfo();
            Camera.getCameraInfo(camId, info);
            if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {
                Log.d(DEBUG_TAG, "Found front facing camera");
                foundId = camId;
                break;
            }
        }
        return foundId;
    }


  其实就是一个循环找出其前置摄象头



3 接下来startCameraInLayout(mPreviewLayout, mCameraId);
就是打开这个前置摄象头,将捕捉到的图象放到屏幕的界面上来,代码如下:
 

private void startCameraInLayout(FrameLayout layout, int cameraId) {   
  mCam = Camera.open(cameraId);    
 if (mCam != null) {
         mCamPreview = new MirrorView(this, mCam);         layout.addView(mCamPreview);
     }

 }


4 下面重点来看MirrorView类
     这个类其实是继承了SurfaceView类,如下,这个其实就是让camera直接写surface了

       
 public class MirrorView extends SurfaceView implements
            SurfaceHolder.Callback {
        private SurfaceHolder mHolder;
        private Camera mCamera;

        public MirrorView(Context context, Camera camera) {
            super(context);
            mCamera = camera;
            mHolder = getHolder();
            mHolder.addCallback(this);
            mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        }

        public void surfaceCreated(SurfaceHolder holder) {
            try {
                mCamera.setPreviewDisplay(holder);
                mCamera.startPreview();
            } catch (Exception error) {
                Log.d(DEBUG_TAG,
                        "Error starting mPreviewLayout: " + error.getMessage());
            }
        }

        public void surfaceDestroyed(SurfaceHolder holder) {
        }

        public void surfaceChanged(SurfaceHolder holder, int format, int w,
                int h) {
            if (mHolder.getSurface() == null) {
                return;
            }

            // can't make changes while mPreviewLayout is active
            try {
                mCamera.stopPreview();
            } catch (Exception e) {

            }

            try {
                // set rotation to match device orientation
                setCameraDisplayOrientationAndSize();

                // start up the mPreviewLayout
                mCamera.setPreviewDisplay(mHolder);
                mCamera.startPreview();

            } catch (Exception error) {
                Log.d(DEBUG_TAG,
                        "Error starting mPreviewLayout: " + error.getMessage());
            }
        }




5 最后还要适当调整下图片的比例:

   

        public void setCameraDisplayOrientationAndSize() {
            CameraInfo info = new CameraInfo();
            Camera.getCameraInfo(mCameraId, info);
            int rotation = getWindowManager().getDefaultDisplay().getRotation();
            int degrees = rotation * 90;

            /*
             * // the above is just a shorter way of doing this, but could break
             * if the values change switch (rotation) { case Surface.ROTATION_0:
             * degrees = 0; break; case Surface.ROTATION_90: degrees = 90;
             * break; case Surface.ROTATION_180: degrees = 180; break; case
             * Surface.ROTATION_270: degrees = 270; break; }
             */

            int result;
            if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
                result = (info.orientation + degrees) % 360;
                result = (360 - result) % 360;
            } else {
                result = (info.orientation - degrees + 360) % 360;
            }
            mCamera.setDisplayOrientation(result);

            Camera.Size previewSize = mCam.getParameters().getPreviewSize();
            if (result == 90 || result == 270) {
                // swap - the physical camera itself doesn't rotate in relation
                // to the screen ;)
                mHolder.setFixedSize(previewSize.height, previewSize.width);
            } else {
                mHolder.setFixedSize(previewSize.width, previewSize.height);

            }
        }


6 最后要做些清理工作,分别为onresume和onpause事件

 
@Override
    protected void onResume() {
        super.onResume();
        if (mCam == null && mPreviewLayout != null) {
            mPreviewLayout.removeAllViews();
            startCameraInLayout(mPreviewLayout, mCameraId);
        }
    }

    @Override
    protected void onPause() {
        if (mCam != null) {
            mCam.release();
            mCam = null;
        }
        super.onPause();
    }

  完整的代码还包括判断是否有摄象头,以及拍下照片保存到文件中去,详细代码见附件,
4
0
分享到:
评论
2 楼 喜物悲己 2013-07-25  
感谢楼主!~~~
1 楼 cshoney 2012-04-09  
正好刚刚接触camera,这个对我很有用,谢谢博主

相关推荐

    Android Camera使用实例

    总结来说,“Android Camera使用实例”涵盖了Android平台上的相机集成,从基础的拍照和录像,到高级的参数控制和实时图像处理。通过理解并实践这些知识点,开发者可以创建功能丰富的相机应用,满足用户的各种需求。

    Android Camera架构及源码解析

    自己总结的Android Camera系统架构及源码分析,以framework和hal为主。

    Android原生Camera2完成预览和拍照

    总结,掌握Android原生Camera2 API不仅需要理解各种类和接口的用法,还需要熟悉Android的生命周期管理和多线程处理。通过实践和调试CameraDemo2这样的示例项目,开发者可以逐步提高在Android相机开发上的技能。

    android 原生人脸识别Camera和Camera2的示例

    总结来说,Android原生的人脸识别功能可以通过`Camera`和`Camera2` API实现。`Camera` API适合简单的应用,而`Camera2` API则为需要精细控制和高性能的应用提供了更多可能。开发者应根据项目需求和目标平台选择合适...

    android Camera源码(可用)

    总结来说,“android Camera源码(可用)”是一个有价值的资源,可以帮助开发者深入了解Android相机功能的实现,提升他们在实际项目中的开发效率和质量。通过阅读和分析这个源码,开发者可以更好地理解和掌握Camera ...

    android-Camera-Code.zip_android 相机_android 相机_camera_camera and

    `Camera`类的使用涉及到权限设置,如需访问相机,需要在`AndroidManifest.xml`中声明`&lt;uses-permission android:name="android.permission.CAMERA" /&gt;`。 ### 摄像头预览 在Android相机应用中,首先需要创建一个...

    Android camera 资料合集(物有所值)

    (精品)Android Camera分析(整理).pdf Android 的Camera架构介绍.pdf Camera模块解析驱动.pdf ...学习camera framework 总结.pdf Android框架下Camera的设计与实现.pdf android_Camera框架分析.pdf

    android-Camera2Basic-master源码

    总结,"android-Camera2Basic-master"源码为我们提供了一个了解和学习Camera2 API的良好起点。通过对源码的详细解读,开发者能更好地理解和实践如何在Android应用中集成和控制相机,从而创建出更丰富的相机功能。

    AndroidCamera2BasicApp.zip

    总结,AndroidCamera2BasicApp作为学习和实践Camera2 API的实例,帮助我们理解如何利用新API实现一个基本的相机应用。通过深入研究和实践,开发者可以进一步开发出满足专业摄影需求的复杂应用,提升Android设备的...

    Android 实例实现自定义Camera和前后置摄像头切换以及图片缩小放大预览

    在具体实现代码之前,我们先来了解一下Android api对实现自定义Camera的介绍。 根据api的介绍,对于Camera应用可以简单总结以下几个步骤。 1.检查Camera是否存在,并在AndroidManifest.xml中赋予相关的权限; 2....

    android的hal层下的camera的实现

    总结来说,Android的HAL层下的camera实现是一个复杂的系统工程,涉及到硬件驱动、接口定义、流处理、性能优化等多个方面。虽然这部分代码不对外公开,但了解其工作原理对于Android相机应用的开发者和系统工程师而言...

    android Camera 系统,自定义相机

    由于Android 6.0(Marshmallow)引入了运行时权限,所以在使用相机前,需要检查并请求用户授予CAMERA权限。 六、其他高级特性 - 视频录制:Camera1 API使用MediaRecorder,Camera2 API通过VideoCapture类。 - 实时...

    Android Camera框架

    在Framework层中,`android.hardware.camera`类提供了必要的接口供应用层使用,其内部则是通过JNI技术调用Native代码来完成实际的功能实现。 ##### 2.1 Parameters类详解 `Parameters`类是一个重要的组成部分,它...

    android camera调试总结

    ### Android Camera调试总结 在Android系统的开发过程中,经常会遇到与Camera相关的各种问题,这些问题往往涉及到硬件、驱动以及软件等多个层面。本文将根据实际项目经验,总结归纳几个在Android平台上进行Camera...

    4.0android之camera

    总结,Android 4.0的Camera API改进显著提升了相机功能的可定制性和性能,为开发者提供了更多创造出色拍照和录像应用的可能性。理解和熟练运用这两个API对于Android应用开发尤其是摄影类应用至关重要。

    android camera 数据预览和处理代码

    总结来说,Android Camera API提供了一套完整的框架,用于实现相机数据的预览和处理。通过自定义相机视图,我们可以实时获取到相机的帧数据,然后进行图像转换和处理,例如面部识别。利用定时任务,可以按照指定频率...

    android4.0camera源码

    总结,Android 4.0 Camera源码包含了从硬件抽象层到用户界面的整个摄像头系统的实现,涉及设备管理、参数设置、预览、拍照、录像等多个环节。理解这些核心概念和机制对于开发复杂的相机应用或优化现有功能至关重要。...

Global site tag (gtag.js) - Google Analytics