在Android平台中,相机(Camera)的打开流程是一个涉及多个类和步骤的过程。本文档主要关注于CameraActivity.java和CameraDeviceCtrl.java这两个关键组件的源代码分析,展示了如何在Android应用中实现相机的初始化和打开。 首先,从CameraActivity.java的onCreate方法开始,用户界面(UI)层通过调用`mCameraDeviceCtrl.openCamera()`来请求打开相机。这一行为触发了底层的CameraDeviceCtrl类的处理。当这个方法被调用时,它会检查当前的相机状态(通过`getCameraState()`),如果状态不是`STATE_CAMERA_CLOSED`,则直接返回,表明相机可能已经打开或者正在打开过程中。 在CameraDeviceCtrl.java中,`openCamera()`方法进一步执行了一系列操作。当`getCameraState()`返回`STATE_OPENING_CAMERA`时,意味着相机正在打开或尝试打开。该方法设置了当前状态为`STATE_OPENING_CAMERA`,然后启动一个后台线程`mCameraStartUpThread.openCamera()`,以异步处理相机的实际打开过程。同时,为了协调多线程间的同步,方法还定义了一个`synchronized`块,并设置`mOpenCamera`为true和`mCancel`为false,以便后续的监控和取消操作。 接着,`openCamera()`方法内部的`openCamera(boolean isDualCamera)`函数会根据设备是否支持双摄像头进行选择。如果`isDualCamera`为true,会获取用户的偏好设置中的相机ID,如果不匹配,会更新偏好设置并尝试打开特定的相机。这个过程涉及到设备识别和用户设置的交互。 值得注意的是,代码中提到的`// TODO will delete this`部分可能表示将来有删除或优化这部分代码的计划,具体可能是移除冗余的代码逻辑或者处理特定版本兼容性问题。 在整个流程中,Android相机的打开是一个系统级的操作,涉及到应用程序、系统服务、硬件驱动等多个层面的交互。开发者需要理解这些细节才能确保相机功能的稳定性和用户体验。此外,随着Android系统的不断更新,相关的API和行为可能会有所变化,因此持续关注官方文档和最新的开发指南是至关重要的。
一.上层调用
CameraActivity.java (src\com\android\camera) 101442 2015-7-23
@Override
public void onCreate(Bundle icicle) {
............
mCameraDeviceCtrl.openCamera();
}
CameraDeviceCtrl.java (src\com\android\camera\bridge) 64825 2015-10-16
public void openCamera() {
Log.d(TAG, "[openCamera] cameraState:" + getCameraState());//D/CAM_ori/CameraDeviceCtrl( 3621): [openCamera] cameraState:STATE_OPENING_CAMERA
if (getCameraState() != CameraState.STATE_CAMERA_CLOSED) {
return;
}
mCameraStartUpThread.openCamera();
setCameraState(CameraState.STATE_OPENING_CAMERA);
}
public synchronized void openCamera() {
mOpenCamera = true;
mCancel = false;
notifyAll();
}
private int openCamera(boolean isDualCamera) {
Log.i(TAG, "[openCamera] isDualCamera:" + isDualCamera + "mCameraId:" + mCameraId);//I/CAM_ori/CameraDeviceCtrl( 3621): [openCamera] isDualCamera:falsemCameraId:0
int cameraId = getPreferredCameraId(mPreferences);
if (mCameraId != cameraId) {
}
try {
// TODO will delete this
if (mCameraActivity.isNeedOpenStereoCamera()) {
String ROPERTY_KEY_CLIENT_APPMODE = "client.appmode";
String APP_MODE_NAME_MTK_DUAL_CAMERA = "MtkStereo";
android.hardware.Camera.setProperty(ROPERTY_KEY_CLIENT_APPMODE,
APP_MODE_NAME_MTK_DUAL_CAMERA);
}
Util.openCamera(mCameraActivity, isDualCamera, mCameraId);
mCameraDevice = CameraHolder.instance().getCameraProxy(mCameraId);
mTopCamId = (mCameraId == CameraHolder.instance().getBackCameraId()) ? CameraHolder
.instance().getFrontCameraId() : CameraHolder.instance().getBackCameraId();
mTopCamDevice = CameraHolder.instance().getCameraProxy(mTopCamId);
// M: added for mock camera
prepareMockCamera();
// mIsCameraOpened = true;
} catch (CameraHardwareException e) {
Log.i(TAG, "[openCamera]CameraHardwareException e:" + e);
mIsOpenCameraFail = true;
mMainHandler.sendEmptyMessage(MSG_OPEN_CAMERA_FAIL);
return CAMERA_HARDWARE_EXCEPTION;
} catch (CameraDisabledException e) {
Log.i(TAG, "[openCamera]CameraDisabledException e:" + e);
mIsOpenCameraFail = true;
mMainHandler.sendEmptyMessage(MSG_OPEN_CAMERA_DISABLED);
return CAMERA_DISABLED_EXCEPTION;
}
mParameters = (mCameraDevice == null) ? null : CameraHolder.instance()
剩余24页未读,继续阅读
- 粉丝: 1
- 资源: 10
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C++标准程序库:权威指南
- Java解惑:奇数判断误区与改进方法
- C++编程必读:20种设计模式详解与实战
- LM3S8962微控制器数据手册
- 51单片机C语言实战教程:从入门到精通
- Spring3.0权威指南:JavaEE6实战
- Win32多线程程序设计详解
- Lucene2.9.1开发全攻略:从环境配置到索引创建
- 内存虚拟硬盘技术:提升电脑速度的秘密武器
- Java操作数据库:保存与显示图片到数据库及页面
- ISO14001:2004环境管理体系要求详解
- ShopExV4.8二次开发详解
- 企业形象与产品推广一站式网站建设技术方案揭秘
- Shopex二次开发:触发器与控制器重定向技术详解
- FPGA开发实战指南:创新设计与进阶技巧
- ShopExV4.8二次开发入门:解决升级问题与功能扩展