(frameworks\base\core\java\android\hardware\camera2)
CameraManager 会根据传递过来的参数不同,调用不同的Opencamera 方法。
@RequiresPermission(android.Manifest.permission.CAMERA)
public void openCamera(@NonNull String cameraId,
@NonNull final CameraDevice.StateCallback callback, @Nullable Handler handler)
throws CameraAccessException {
openCameraForUid(cameraId, callback, CameraDeviceImpl.checkAndWrapHandler(handler),
USE_CALLING_UID);
}
// CameraDeviceImpl.checkAndWrapHandler 会将 Handler 封装成Executor 类型
public static Executor checkAndWrapHandler(Handler handler) {
return new CameraHandlerExecutor(checkHandler(handler));
}
@RequiresPermission(android.Manifest.permission.CAMERA)
public void openCamera(@NonNull String cameraId,
@NonNull @CallbackExecutor Executor executor,
@NonNull final CameraDevice.StateCallback callback)
throws CameraAccessException {
openCameraForUid(cameraId, callback, executor, USE_CALLING_UID);
}
从代码中看,openCamera 参数主要区别是 CallbackExecutor 、Handler 这两个,最终都会走到 openCameraForUid 方法。
openCameraForUid 主要是 根据 Camera id 打开一个Camera 连接。
public void openCameraForUid(@NonNull String cameraId,
@NonNull final CameraDevice.StateCallback callback, @NonNull Executor executor,
int clientUid)
throws CameraAccessException {
//
openCameraDeviceUserAsync(cameraId, callback, executor, clientUid);
}
openCameraForUid 会调用 openCameraDeviceUserAsync 方法去帮助opencamera 连接的创建
private CameraDevice openCameraDeviceUserAsync(String cameraId,
CameraDevice.StateCallback callback, Executor executor, final int uid)
throws CameraAccessException {
// 获取 特定camera的特性
CameraCharacteristics characteristics = getCameraCharacteristics(cameraId);
android.hardware.camera2.impl.CameraDeviceImpl deviceImpl = new CameraDeviceImpl();
ICameraDeviceCallbacks callbacks = deviceImpl.getCallbacks()
if (supportsCamera2ApiLocked(cameraId)) {
// Use cameraservice’s cameradeviceclient implementation for HAL3.2+ devices
ICameraService cameraService = CameraManagerGlobal.get().getCameraService();
cameraService.connectDevice(callbacks, cameraId,mContext.getOpPackageName(), uid);
}else{
… …
}
// TODO: factor out callback to be non-nested, then move setter to constructor
// For now, calling setRemoteDevice will fire initial
// onOpened/onUnconfigured callbacks.
// This function call may post onDisconnected and throw CAMERA_DISCONNECTED if
// cameraUser dies during setup.
deviceImpl.setRemoteDevice(cameraUser);
}
cameraService是通过Binder 继承 ICameraServiceListener.Stub
private static final class CameraManagerGlobal extends ICameraServiceListener.Stub
implements IBinder.DeathRecipient {
// This must match the ICameraService definition
private static final String CAMERA_SERVICE_BINDER_NAME = “media.camera”;
public ICameraService getCameraService() {
synchronized(mLock) {
//
connectCameraServiceLocked();
return mCameraService;
}
}
private void connectCameraServiceLocked() {
IBinder cameraServiceBinder = ServiceManager.getService(CAMERA_SERVICE_BINDER_NAME);
ICameraService cameraService = ICameraService.Stub.asInterface(cameraServiceBinder);
for (CameraStatus c : cameraStatuses) {
onStatusChangedLocked(c.status, c.cameraId);
}
mCameraService = cameraService;
}
}
3.CameraService.cpp
(frameworks\av\services\camera\libcameraservice)
cameraService.connectDevice 通过AIDL 到用到 CameraService.cpp 中的connectDevice 方法。
Status CameraService::connectDevice(
const sphardware::camera2::ICameraDeviceCallbacks& cameraCb,
const String16& cameraId,
const String16& clientPackageName,
int clientUid,
/out/
sphardware::camera2::ICameraDeviceUser* device) {
//调用connectHelper 方法
ret = connectHelperhardware::camera2::ICameraDeviceCallbacks,CameraDeviceClient(cameraCb, id,
/api1CameraId/-1,
CAMERA_HAL_API_VERSION_UNSPECIFIED, clientPackageNameAdj,
clientUid, USE_CALLING_PID, API_2, /shimUpdateOnly/ false, /out/client);
}
connectDevice 会调用到 connectHelper 方法
Status CameraService::connectHelper(){
// 闪光灯进入预准备阶段
mFlashlight->prepareDeviceOpen(cameraId);
//获取当前设备的Version
int deviceVersion = getDeviceVersion(cameraId, /out/&facing);
// 初始化CameraproviderManager
err = client->initialize(mCameraProviderManager, mMonitorTags);
}
4.CameraProviderManager.cpp
(frameworks\av\services\camera\libcameraservice\common)
status_t CameraProviderManager::initialize(wpCameraProviderManager::StatusListener listener,
ServiceInteractionProxy* proxy) {
// 调用 addProviderLocked 方法
for (const auto& instance : mServiceProxy->listServices()) {
this->addProviderLocked(instance);
}
}
status_t CameraProviderManager::addProviderLocked(const std::string& newProvider) {
sp providerInfo = new ProviderInfo(newProvider, this);
status_t res = providerInfo->initialize(interface, mDeviceState);
}
//ProviderInfo::initialize 初始化方法
status_t CameraProviderManager::ProviderInfo::initialize(){
status_t res = addDevice(device, common::V1_0::CameraDeviceStatus::PRESENT, &id);
}
status_t CameraProviderManager::ProviderInfo::addDevice(const std::string& name,
CameraDeviceStatus initialStatus, /out/ std::string* parsedId) {
//
deviceInfo = initializeDeviceInfo(name, mProviderTagid,
id, minor);
}
std::unique_ptrCameraProviderManager::ProviderInfo::DeviceInfo
CameraProviderManager::ProviderInfo::initializeDeviceInfo(){
// 后续调用待完善 如何 跳转到 Camera3device.cpp 的initialize 方法
return std::unique_ptr(
new DeviceInfoT(name, tagId, id, minorVersion, resourceCost, this,
mProviderPublicCameraIds, cameraInterface));
}
5.Camera3Device.cpp
(frameworks\av\services\camera\libcameraservice\device3)
status_t Camera3Device::initialize(sp manager, const String8& monitorTags) {
// 调用 CameraProviderManager openSession
ATRACE_BEGIN(“CameraHal::openSession”);
status_t res = manager->openSession(mId.string(), this,
/out/ &session);
ATRACE_END();
return initializeCommonLocked();
}
6.CameraProviderManager.cpp
(frameworks\av\services\camera\libcameraservice\common)
status_t CameraProviderManager::openSession(const std::string &id,
const spdevice::V3_2::ICameraDeviceCallback& callback,
/out/
spdevice::V3_2::ICameraDeviceSession *session) {
auto interface = deviceInfo3->startDeviceInterface<
CameraProviderManager::ProviderInfo::DeviceInfo3::InterfaceT>();
ret = interface->open(callback, [&status, &session]
(Status s, const spdevice::V3_2::ICameraDeviceSession& cameraSession) {
status = s;
if (status == Status::OK) {
*session = cameraSession;
}
});
}
7.ICameraDevice.hal
(hardware\interfaces\camera\device\3.2)
//Power on and initialize this camera device for active use, returning a
//session handle for active operations.
open(ICameraDeviceCallback callback) generates
(Status status, ICameraDeviceSession session);
8.CameraDevice.cpp
(hardware\interfaces\camera\device\3.2\default)
Return CameraDevice::open(const sp& callback,
ICameraDevice::open_cb _hidl_cb) {
/** Open HAL device */
status_t res;
camera3_device_t *device;
// 1. 开始 open Hal Device
ATRACE_BEGIN(“camera3->open”);
res = mModule->open(mCameraId.c_str(),
reinterpret_cast<hw_device_t**>(&device));
ATRACE_END();
// 2. 获取Camera 信息
res = mModule->getCameraInfo(mCameraIdInt, &info);
// 3. 创建 CameraDeviceSession
session = createSession(device, info.static_camera_characteristics, callback);
}
- CameraModule.cpp
(hardware\interfaces\camera\common\1.0\default)
int CameraModule::open(const char* id, struct hw_device_t** device) {
int res;
ATRACE_BEGIN(“camera_module->open”);
res = filterOpenErrorCode(mModule->common.methods->open(&mModule->common, id, device));
ATRACE_END();
return res;
}
10.Camxhal3entry.cpp
(vendor\qcom\proprietary\camx\src\core\hal)
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数同学面临毕业设计项目选题时,很多人都会感到无从下手,尤其是对于计算机专业的学生来说,选择一个合适的题目尤为重要。因为毕业设计不仅是我们在大学四年学习的一个总结,更是展示自己能力的重要机会。
因此收集整理了一份《2024年计算机毕业设计项目大全》,初衷也很简单,就是希望能够帮助提高效率,同时减轻大家的负担。
既有Java、Web、PHP、也有C、小程序、Python等项目供你选择,真正体系化!
由于项目比较多,这里只是将部分目录截图出来,每个节点里面都包含素材文档、项目源码、讲解视频
如果你觉得这些内容对你有帮助,可以添加VX:vip1024c (备注项目大全获取)
Camxhal3entry.cpp
(vendor\qcom\proprietary\camx\src\core\hal)
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数同学面临毕业设计项目选题时,很多人都会感到无从下手,尤其是对于计算机专业的学生来说,选择一个合适的题目尤为重要。因为毕业设计不仅是我们在大学四年学习的一个总结,更是展示自己能力的重要机会。
因此收集整理了一份《2024年计算机毕业设计项目大全》,初衷也很简单,就是希望能够帮助提高效率,同时减轻大家的负担。
[外链图片转存中…(img-VTALrCRi-1712513236446)]
[外链图片转存中…(img-AW1le0Cn-1712513236447)]
[外链图片转存中…(img-KI48WCB8-1712513236447)]
既有Java、Web、PHP、也有C、小程序、Python等项目供你选择,真正体系化!
由于项目比较多,这里只是将部分目录截图出来,每个节点里面都包含素材文档、项目源码、讲解视频
如果你觉得这些内容对你有帮助,可以添加VX:vip1024c (备注项目大全获取)
[外链图片转存中…(img-JAYjDuhs-1712513236447)]