一,时序图
二、过程说明
初始化过程不详细介绍。可以根据上述时序图进行分析。详细介绍拍照过程。
1、点击拍照按钮,拍照按钮是ShutterButton类的实例。点击后,调用performClick方法。在这个方法里面,有语句mListener.onShutterButtonClick();。其中mListener 是PhotoController的实例,也就是在PhotoUI类里面的创建的PhotoController的对象mController。mController的实例,其实是通过PhotoModule 的 init方法里面的mUI = new PhotoUI(activity, this, parent);语句,调用PhotoUI构造函数。第二个参数就是传给mController的值,就是PhotoModule的实例。所以mListener.onShutterButtonClick();就是调用PhotoModule的onShutterButtonClick方法。
2、在onShutterButtonClick方法里,执行mFocusManager.doSnap();语句,调用FocusOverlayManager的doSnap方法。然后再调用capture方法。再调用PhotoModule方法的capture方法。在这个方法里,执行语句
mCameraDevice.takePicture(mHandler,
newShutterCallback(!animateBefore),
mRawPictureCallback,mPostViewPictureCallback,
new JpegPictureCallback(loc));
分析得知,拍照后回调JpegPictureCallback 类的onPictureTaken方法。在这个方法里,有语句
mActivity.getMediaSaveService().addImage(
jpegData, title, date,mLocation, width, height,
orientation, exif,mOnMediaSavedListener, mContentResolver);
其中mActivity.getMediaSaveService()获取的是MediaSaveService的对象。调用MediaSaveService的addImage方法。其中语句
ImageSaveTask t = new ImageSaveTask(data, title, date,
(loc == null) ? null : newLocation(loc),
width, height, orientation,exif, resolver, l);
当执行t.execute();的时候,执行ImageSaveTask类的doInBackground方法。在这个方法里,调用Storage.addImage(resolver, title, date, loc, orientation, exif,data, width, height);语句。然后调用 Storage 类的
writeFile(path, jpeg);来存储拍的照片。