Android 培训之直接控制摄像头 这个课时将会讨论如何通过系统的 APIs 来直接控制摄像头。 和使用相机程序拍照和录制视频比起来,直接控制摄像头要比较麻烦一点点。如果您想开发一个专业的相机程序或者完全自定义拍照的界面,这个课时将告诉你如何去做。 你也可以参考开发指南里的摄像头章节学习更多的知识。 打开摄像头 在控制摄像头之前,需要先获取到 Camera 对象。和 Android 自带的相机程序一样,推荐在另外一个线程中打开摄像头。打开摄像头可能需要消耗一些时间,放到非 UI线程中就不会出现 ANR了。一般可以在 onResume() 函数中启动打开摄像头的线程。 如果摄像头正在被其他程序使用,那么调用 Camera.open() 会抛出一个异常,所以要用 try 来处理这个异常。 privatebooleansafeCameraOpen(int id){ booleanqOpened=false; try{ releaseCameraAndPreview(); mCamera=Camera.open(id); qOpened=(mCamera!=null); }catch(Exception e){ Log.e(getString(R.string.app_name), "failed to open Camera"); e.printStackTrace(); } returnqOpened; } privatevoidreleaseCameraAndPreview(){ mPreview.setCamera(null); if(mCamera!=null){ mCamera.release(); mCamera=null; } } 从 API level 9 开始,框架支持多个摄像头了。如果使用旧的 API,不设置任何参数调用函数 open() 将会打开第一个背面的摄像头。 创建 Camera Preview 拍照程序通常在用户按下快门之前显示一个预览窗口。要实现这个预览窗口需要使用SurfaceView 对象。 Preview Class 要显示一个预览图像就需要一个预览的类。该类需要实现 android.view .SurfaceHolder.Callback接口,该接口用来把摄像头获取的数据传递给预览窗口显示。 class Preview extendsViewGroupimplementsSurfaceHolder.Callback{ SurfaceViewmSurfaceView; SurfaceHoldermHolder; Preview(Context context){ super(context); mSurfaceView=newSurfaceView(context); addView(mSurfaceView); // Install a SurfaceHolder.Callback so we get notified when the // underlying surface is created and destroyed. mHolder=mSurfaceView.getHolder(); mHolder.addCallback(this); mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } ... } 在显示预览图像之前,需要把这个预览类设置到 Camera ...