基于android4.4的camera的各个文件功能梳理

本文详细阐述了Android系统中相机管理的核心组件AndroidCameraManagerImpl的实现方式,以及其在CameraManagerFactory、CameraHolder和CameraUtil类中的应用。通过解析这些类的方法调用流程,揭示了如何在不同场景下创建、打开和操作Android设备的相机,为开发者提供了一个全面的指南。

第一:AndroidCameraManagerImpl,实现了接口:CameraManager,内部实习的class图表结构如下:


第二:该class在CameraManagerFactory这个工厂类中被new,从而创建一个camera的线程,该工厂类在CameraHolder调用,用于创建一个camera的设备实例:

f (mMockCameraInfo == null) {
                mCameraDevice = CameraManagerFactory
                        .getAndroidCameraManager().cameraOpen(handler, cameraId, cb);

}

第三:cameraholder类主要的作用是"The class is used to hold an {@code android.hardware.Camera} instance."内部定义的class图标显示如下:



第四:该类定义的open在CameraUtil类中引用:

public static CameraManager.CameraProxy openCamera(
            Activity activity, final int cameraId,
            Handler handler, final CameraManager.CameraOpenErrorCallback cb) {
        try {
            throwIfCameraDisabled(activity);
            return CameraHolder.instance().open(handler, cameraId, cb);
        } catch (CameraDisabledException ex) {
            handler.post(new Runnable() {
                @Override
                public void run() {
                    cb.onCameraDisabled(cameraId);
                }
            });
        }
        return null;
    }

第五:CameraUtil的opencamera在PhotoModule中被引用:

private boolean prepareCamera() {
        // We need to check whether the activity is paused before long
        // operations to ensure that onPause() can be done ASAP.
        Log.v(TAG, "Open camera device.");
        mCameraDevice = CameraUtil.openCamera(
                mActivity, mCameraId, mHandler,
                mActivity.getCameraOpenErrorCallback());

        if (mCameraDevice == null) {
            Log.e(TAG, "Failed to open camera:" + mCameraId);
            return false;
        }
        mParameters = mCameraDevice.getParameters();


        initializeCapabilities();
        if (mFocusManager == null) initializeFocusManager();
        setCameraParameters(UPDATE_PARAM_ALL);
        mHandler.sendEmptyMessage(CAMERA_OPEN_DONE);
        mCameraPreviewParamsReady = true;
        startPreview();
        mOnResumeTime = SystemClock.uptimeMillis();
        checkDisplayRotation();
        return true;
    }

photomodule类定义的class图表如下:




prepareCamera被调用于:

 private void onResumeTasks() {
        Log.v(TAG, "Executing onResumeTasks.");
        if (mOpenCameraFail || mCameraDisabled) return;


        mJpegPictureCallbackTime = 0;
        mZoomValue = 0;
        resetExposureCompensation();
        if (!prepareCamera()) {
            // Camera failure.
            return;
        }

。。。。。。

}

 public void onResumeAfterSuper() {
        // Add delay on resume from lock screen only, in order to to speed up
        // the onResume --> onPause --> onResume cycle from lock screen.
        // Don't do always because letting go of thread can cause delay.
        String action = mActivity.getIntent().getAction();
        if (MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA.equals(action)
                || MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE.equals(action)) {
            Log.v(TAG, "On resume, from lock screen.");
            // Note: onPauseAfterSuper() will delete this runnable, so we will
            // at most have 1 copy queued up.
            mHandler.postDelayed(new Runnable() {
                public void run() {
                    onResumeTasks();
                }
            }, ON_RESUME_TASKS_DELAY_MSEC);
        } else {
            Log.v(TAG, "On resume.");
            onResumeTasks();
        }
    }

onResumeAfterSuper被调用于:

CameraActivity的

 public voidonResume() {
        // TODO: Handle this in OrientationManager.
        // Auto-rotate off
        if (Settings.System.getInt(getContentResolver(),
                Settings.System.ACCELEROMETER_ROTATION, 0) == 0) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
            mAutoRotateScreen = false;
        } else {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
            mAutoRotateScreen = true;
        }


        UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA,
                UsageStatistics.ACTION_FOREGROUNDED, this.getClass().getSimpleName());


        mOrientationListener.enable();
        mCurrentModule.onResumeBeforeSuper();
        super.onResume();
       
mCurrentModule.onResumeAfterSuper();

.......

}

第六:CameraActivity该类的内部实现图表如下:




评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值