14.3.2 实现自己的拍照Activity(1) 本节的例子代码所在的工程目录是srcch14ch14_camera 拍照的核心类是android.hardware.Camera,通过Camera 类的静态方法open 可以获得Camera 对象,并通过 Camera 类的startPreview 方法开始拍照,最后通过Camera类的takePicture 方法结束拍照,并在相应的事件中处理照片数据。 上述的过程只是拍照过程的简化。在拍照之前,还需要做如下的准备工作。 指定用于显示拍照过程影像的容器,通常是SurfaceHolder 对象。由于影像需要在SurfaceView 对象中显示,因此可以使用 SurfaceView 类的getHolder 方法获得SurfaceHolder 对象。 在拍照过程中涉及到一些状态的变化。这些状态包括开始拍照(对应surfaceCreated 事件方法);拍照状态变化(例如图像格式或方向,对应 surfaceChanged 事件方法);结束拍照(对应surfaceDestroyed 事件方法)。这 3 个事件方法都是在 SurfaceHolder.Callback 接口中定义的,因此,需要使用 SurfaceHolder 接口的addCallback 方法指定 SurfaceHolder.Callback 对象,以便捕捉这 3 个事件。 拍完照后需要处理照片数据。处理这些数据的工作需要在PictureCallback 接口的onPictureTaken 方法中完成。当调用 Camera 类的takePicture 方法后,onPictureTaken 事件方法被调用。 如果需要自动对焦,需要调用 Camera 类的autoFocus 方法。该方法需要一个AutoFocusCallback 类型的参数值。 AutoFocusCallback 是一个接口,在该接口中定义了一个 onAutoFocus 方法,当摄像头正在对焦或对焦成功都会调用该方法。 为了使拍照功能更容易使用,本节的例子将拍照功能封装在了 Preview 类中,代码如下: 1. class Preview extends SurfaceView implements SurfaceHolder.Callback 2. { 3. private SurfaceHolder holder; 4. private Camera camera; 5. // 创建一个 PictureCallback对象,并实现其中的onPictureTaken方法 6. private PictureCallback pictureCallback = new PictureCallback() 7. { 8. // 该方法用于处理拍摄后的照片数据 9. @Override 10. public void onPictureTaken(byte[] data, Camera camera) 11. { 12. // data参数值就是照片数据,将这些数据以 key-value形式保存,以便其他调用该 Activity的程序可 13. // 以获得照片数据 14. getIntent().putExtra("bytes", da...