Android Camera 和 frameword 的交互

app层和framework层交互:
./frameworks/base/core/java/android/hardware/Camera.java

拍照过程framework层和APP层的交互流程,在takePicture()方法的注释里做了详细解释:
总结一下:拍照过程中Camera service 会初始一些Callbacks,在应用中实现这些callback的接口方法,
         这个方法同样的可以触发播放声音的线程。

注册回调函数:
public final void takePicture(ShutterCallback shutter, PictureCallback raw,
            PictureCallback postview, PictureCallback jpeg) {
            ...
    }

处理回函数数据:
public void handleMessage(Message msg) {
switch(msg.what) {
   case CAMERA_MSG_SHUTTER: //有数据到达通知
   case CAMERA_MSG_RAW_IMAGE: //处理未压缩照片函数
   case CAMERA_MSG_COMPRESSED_IMAGE:  //处理压缩处理的照片函数
if (mJpegCallback != null) {
             mJpegCallback.onPictureTaken((byte[])msg.obj, mCamera);
      }
      return ;
    case CAMERA_MSG_PREVIEW_FRAME: //处理预览数据函数
    ...
}


应用实例化回调的接口:
   回到目录:packages/apps/Camera/src/com/android/camera/CameraManager.java
   private android.hardware.Camera mCamera;
   mCameraDevice.takePicture(mShutterCallback, mRawPictureCallback,
       mPostViewPictureCallback, new JpegPictureCallback(loc));

应用回调的接口,获取数据流程:
    目录:packages/apps/Camera/src/com/android/camera/Camera.java
private final class JpegPictureCallback implements PictureCallback {
public void onPictureTaken(
         final byte [] jpegData, final android.hardware.Camera camera) {
    ...
   mImageCapture.storeImage(jpegData, camera, mLocation);
   mImageSaver.addImage(jpegData, uri, title, mLocation,
                        width, height, mThumbnailViewWidth, orientation);
   ...
  }
}

packages/apps/Camera/src/com/android/camera/Camera.java  的内部类ImageSaver开启一个线程来存储图片
private class ImageSaver extends Thread {
       将数据存放入数据库
}

以上是App层也framework层的交互,主要使用回调,也就是接口。

猜你喜欢

转载自wcq20071334.iteye.com/blog/1779366
今日推荐