当前位置:首页 > 嵌入式 > 嵌入式软件
[导读] com.android.camera.Camera.java,主要的实现Activity,继承于ActivityBase。ActivityBase在ActivityBase中执行流程:onCreate中进行判断是否是平板;onResume中判断是否锁

 com.android.camera.Camera.java,主要的实现Activity,继承于ActivityBase。

ActivityBase

在ActivityBase中执行流程:

onCreate中进行判断是否是平板;

onResume中判断是否锁屏,锁屏&camera不存在时候,mOnResumePending置为true,否则置为false并执行doOnResume;

onWindowFocusChanged中判断是否获取到焦点&mOnResumePending,满足的话执行doOnResume;

onPause中将mOnResumePending置为false;

Camera.java

接下来分析Camera.java,执行流程:

1、onCreate

复制代码

// 获得摄像头的数量,前置和后置

getPreferredCameraId();

// 获得对焦设置eg:连续对焦或者其它

String[] defaultFocusModes = getResources().getStringArray(R.array.pref_camera_focusmode_default_array);

//实例化Focus管理对象

mFocusManager = new FocusManager(mPreferences, defaultFocusModes);

// 开启线程来启动摄像头

mCameraOpenThread.start();

// 是否是第三方应用启动拍照功能

mIsImageCaptureIntent = isImageCaptureIntent();

// 设置UI布局文件

setContentView(R.layout.camera);

if (mIsImageCaptureIntent) {

// 当第三方其送拍照,需要显示不同的UI,比如取消键盘

mReviewDoneButton = (Rotatable) findViewById(R.id.btn_done);

mReviewCancelButton = (Rotatable) findViewById(R.id.btn_cancel);

findViewById(R.id.btn_cancel).setVisibility(View.VISIBLE);

} else {

// 反之显示缩略图

mThumbnailView = (RotateImageView) findViewById(R.id.thumbnail);

mThumbnailView.enableFilter(false);

mThumbnailView.setVisibility(View.VISIBLE);

}

// 一个能旋转的dialog.比如相机设置的dialog,这个类实现了旋转的父类

mRotateDialog = new RotateDialogController(this, R.layout.rotate_dialog);

// 设置camera的ID,写道SharedPreference中

mPreferences.setLocalId(this, mCameraId);

// 更新preference

CameraSettings.upgradeLocalPreferences(mPreferences.getLocal());

// 获得相机数

mNumberOfCameras = CameraHolder.instance().getNumberOfCameras();

// 貌似是获得是否是快速拍照

mQuickCapture = getIntent().getBooleanExtra(EXTRA_QUICK_CAPTURE, false);

// 为当前的preview重置曝光值

resetExposureCompensation();

// 隐藏系统导航栏等

Util.enterLightsOutMode(getWindow());

//SurfaceView

SurfaceView preview = (SurfaceView) findViewById(R.id.camera_preview);

SurfaceHolder holder = preview.getHolder();

holder.addCallback(this);

holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

try {

// 这个join语句就是为了保证openCamera的线程执行完后,当前的线程才开始运行。主要是为了确保camera设备被打开了

mCameraOpenThread.join();

// 线程执行完后置为空来让系统回收资源

mCameraOpenThread = null;

if (mOpenCameraFail) {

// 打开camera失败,显示“无法连接到相机”

Util.showErrorAndFinish(this, R.string.cannot_connect_camera);

return;

} else if (mCameraDisabled) {

// 由于安全政策限制,相机已被停用

Util.showErrorAndFinish(this, R.string.camera_disabled);

return;

}

} catch (InterruptedException ex) {

// ignore

}

//开启显示的子线程

mCameraPreviewThread.start();

if (mIsImageCaptureIntent) {

//如果是第三方开启的 ,setupCaptureParams 设置拍照的参数

setupCaptureParams();

} else {

//设置ModePicker

mModePicker = (ModePicker) findViewById(R.id.mode_picker);

mModePicker.setVisibility(View.VISIBLE);

mModePicker.setOnModeChangeListener(this);

mModePicker.setCurrentMode(ModePicker.MODE_CAMERA);

}

mZoomControl = (ZoomControl) findViewById(R.id.zoom_control);

mOnScreenIndicators = (Rotatable) findViewById(R.id.on_screen_indicators);

mLocationManager = new LocationManager(this, this);

//摄像头ID

mBackCameraId = CameraHolder.instance().getBackCameraId();

mFrontCameraId = CameraHolder.instance().getFrontCameraId();

// 在startPreview里面有notify方法

synchronized (mCameraPreviewThread) {

try {

mCameraPreviewThread.wait();

} catch (InterruptedException ex) {

// ignore

}

}

// 初始化各种控制按钮

initializeIndicatorControl();

//初始化拍照声音

mCameraSound = new CameraSound();

try {

//确保显示

mCameraPreviewThread.join();

} catch (InterruptedException ex) {

// ignore

}

mCameraPreviewThread = null;

复制代码

2、surfaceCreated

啥都没做

3、surfaceChanged

复制代码

// 确保在holder中有surface

if (holder.getSurface() == null) {

Log.d(TAG, "holder.getSurface() == null");

return;

}

// We need to save the holder for later use, even when the mCameraDevice

// is null. This could happen if onResume() is invoked after this[!--empirenews.page--]

// function.

mSurfaceHolder = holder;

if (mCameraDevice == null) return;

if (mPausing || isFinishing()) return;

// Set preview display if the surface is being created. Preview was

// already started. Also restart the preview if display rotation has

// changed. Sometimes this happens when the device is held in portrait

// and camera app is opened. Rotation animation takes some time and

// display rotation in onCreate may not be what we want.

if (mCameraState == PREVIEW_STOPPED) {

startPreview();

startFaceDetection();

} else {

if (Util.getDisplayRotation(this) != mDisplayRotation) {

setDisplayOrientation();

}

if (holder.isCreating()) {

// Set preview display if the surface is being created and preview

// was already started. That means preview display was set to null

// and we need to set it now.

setPreviewDisplay(holder);

}

}

// If first time initialization is not finished, send a message to do

// it later. We want to finish surfaceChanged as soon as possible to let

// user see preview first.

if (!mFirstTimeInitialized) {

mHandler.sendEmptyMessage(FIRST_TIME_INIT);

} else {

initializeSecondTime();

}

复制代码

如果是第一次加载,则执行mHandler.sendEmptyMessage(FIRST_TIME_INIT); 对应处理的是initializeFirstTime();

复制代码

/**

* 初始化,第一次初始化

* // Snapshots can only be taken after this is called. It should be called

* // once only. We could have done these things in onCreate() but we want to

* // make preview screen appear as soon as possible.

*/

private void initializeFirstTime() {

if (mFirstTimeInitialized) return;

// Create orientation listenter. This should be done first because it

// takes some time to get first orientation.

mOrientationListener = new MyOrientationEventListener(Camera.this);

mOrientationListener.enable();

// Initialize location sevice.

boolean recordLocation = RecordLocationPreference.get(

mPreferences, getContentResolver());

// 初始化屏幕最上方的标志,比如开启了曝光值啊,什么的

initOnScreenIndicator();

// 位置服务

mLocationManager.recordLocation(recordLocation);

keepMediaProviderInstance();

// 检查存储空间和初始化储存目录

checkStorage();

// Initialize last picture button.

mContentResolver = getContentResolver();

if (!mIsImageCaptureIntent) { // no thumbnail in image capture intent

// 初始化缩略图

initThumbnailButton();

}

// Initialize shutter button.

// 初始化拍照按钮并设置监听事件

mShutterButton = (ShutterButton) findViewById(R.id.shutter_button);

mShutterButton.setOnShutterButtonListener(this);

mShutterButton.setVisibility(View.VISIBLE);

// Initialize focus UI.

mPreviewFrame = findViewById(R.id.camera_preview);

mPreviewFrame.setOnTouchListener(this);

// 聚焦框

mFocusAreaIndicator = (RotateLayout) findViewById(R.id.focus_indicator_rotate_layout);

CameraInfo info = CameraHolder.instance().getCameraInfo()[mCameraId];

boolean mirror = (info.facing == CameraInfo.CAMERA_FACING_FRONT);

mFocusManager.initialize(mFocusAreaIndicator, mPreviewFrame, mFaceView, this,

mirror, mDisplayOrientation);

// 初始化一个图片的保存线程

mImageSaver = new ImageSaver();

// 设置屏幕亮度

Util.initializeScreenBrightness(getWindow(), getContentResolver());

// 注册SD卡相关的广播,比如拔出存储卡什么的

installIntentFilter();

// 初始化缩放UI

initializeZoom();

// 更新屏幕上的闪光灯什么的标记

updateOnScreenIndicators();

// 开始面部检测

startFaceDetection();

// Show the tap to focus toast if this is the first start.

// 假如是第一次启动,提示用户“触摸对焦”

if (mFocusAreaSupported &&

mPreferences.getBoolean(CameraSettings.KEY_CAMERA_FIRST_USE_HINT_SHOWN, true)) {

// Delay the toast for one second to wait for orientation.

mHandler.sendEmptyMessageDelayed(SHOW_TAP_TO_FOCUS_TOAST, 1000);

}

mFirstTimeInitialized = true;

addIdleHandler();

}

复制代码

如果不是,则执行initializeSecondTime();

复制代码

/**

* // If the activity is paused and resumed, this method will be called in

* // onResume.

*/

private void initializeSecondTime() {

// Start orientation listener as soon as possible because it takes

// some time to get first orientation.

//方向翻转设置enable,其中包括翻转的时候的动画

mOrientationListener.enable();

// Start location update if needed.[!--empirenews.page--]

boolean recordLocation = RecordLocationPreference.get(

mPreferences, getContentResolver());

mLocationManager.recordLocation(recordLocation);

//设置SD卡广播

installIntentFilter();

mImageSaver = new ImageSaver();

//初始化Zoom

initializeZoom();

//mMediaProviderClient=媒体Provider对象

keepMediaProviderInstance();

//检查硬盘

checkStorage();

//淡出retake和done的Button

hidePostCaptureAlert();

if (!mIsImageCaptureIntent) {

//如果不是第三方开启,则更新缩略图

updateThumbnailButton();

mModePicker.setCurrentMode(ModePicker.MODE_CAMERA);

}

}

复制代码

4、surfaceDestroyed

stopPreview();

mSurfaceHolder = null;

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭