1 /*
2 * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "hcamera_service.h"
17
18 #include <algorithm>
19 #include <memory>
20 #include <mutex>
21 #include <parameter.h>
22 #include <parameters.h>
23 #include <securec.h>
24 #include <string>
25 #include <unordered_set>
26 #include <vector>
27
28 #include "access_token.h"
29 #include "accesstoken_kit.h"
30 #include "camera_info_dumper.h"
31 #include "camera_log.h"
32 #include "camera_report_uitls.h"
33 #include "camera_util.h"
34 #include "datashare_helper.h"
35 #include "datashare_predicates.h"
36 #include "datashare_result_set.h"
37 #include "deferred_processing_service.h"
38 #include "display_manager.h"
39 #include "hcamera_device_manager.h"
40 #include "hcamera_preconfig.h"
41 #ifdef DEVICE_MANAGER
42 #include "device_manager_impl.h"
43 #endif
44 #include "ipc_skeleton.h"
45 #include "iservice_registry.h"
46 #include "os_account_manager.h"
47 #include "system_ability_definition.h"
48 #include "tokenid_kit.h"
49 #include "uri.h"
50
51 namespace OHOS {
52 namespace CameraStandard {
53 REGISTER_SYSTEM_ABILITY_BY_ID(HCameraService, CAMERA_SERVICE_ID, true)
54 #ifdef CAMERA_USE_SENSOR
55 constexpr int32_t SENSOR_SUCCESS = 0;
56 constexpr int32_t POSTURE_INTERVAL = 1000000;
57 #endif
58 constexpr uint8_t POSITION_FOLD_INNER = 3;
59 constexpr uint32_t ROOT_UID = 0;
60 constexpr uint32_t FACE_CLIENT_UID = 1088;
61 constexpr uint32_t RSS_UID = 1096;
62 static std::mutex g_cameraServiceInstanceMutex;
63 static HCameraService* g_cameraServiceInstance = nullptr;
64 static sptr<HCameraService> g_cameraServiceHolder = nullptr;
65 static bool g_isFoldScreen = system::GetParameter("const.window.foldscreen.type", "") != "";
66
67 static const std::string SETTINGS_DATA_BASE_URI =
68 "datashare:///com.ohos.settingsdata/entry/settingsdata/SETTINGSDATA?Proxy=true";
69 static const std::string SETTINGS_DATA_EXT_URI = "datashare:///com.ohos.settingsdata.DataAbility";
70 static const std::string SETTINGS_DATA_FIELD_KEYWORD = "KEYWORD";
71 static const std::string SETTINGS_DATA_FIELD_VALUE = "VALUE";
72 static const std::string PREDICATES_STRING = "settings.camera.mute_persist";
73 mutex g_dataShareHelperMutex;
74 mutex g_dmDeviceInfoMutex;
75 thread_local uint32_t g_dumpDepth = 0;
76
HCameraService(int32_t systemAbilityId,bool runOnCreate)77 HCameraService::HCameraService(int32_t systemAbilityId, bool runOnCreate)
78 : SystemAbility(systemAbilityId, runOnCreate), muteModeStored_(false), isRegisterSensorSuccess(false)
79 {
80 MEDIA_INFO_LOG("HCameraService Construct begin");
81 g_cameraServiceHolder = this;
82 {
83 std::lock_guard<std::mutex> lock(g_cameraServiceInstanceMutex);
84 g_cameraServiceInstance = this;
85 }
86 statusCallback_ = std::make_shared<ServiceHostStatus>(this);
87 cameraHostManager_ = new (std::nothrow) HCameraHostManager(statusCallback_);
88 CHECK_AND_RETURN_LOG(
89 cameraHostManager_ != nullptr, "HCameraService OnStart failed to create HCameraHostManager obj");
90 MEDIA_INFO_LOG("HCameraService Construct end");
91 serviceStatus_ = CameraServiceStatus::SERVICE_NOT_READY;
92 }
93
HCameraService(sptr<HCameraHostManager> cameraHostManager)94 HCameraService::HCameraService(sptr<HCameraHostManager> cameraHostManager)
95 : cameraHostManager_(cameraHostManager), muteModeStored_(false), isRegisterSensorSuccess(false)
96 {}
97
~HCameraService()98 HCameraService::~HCameraService() {}
99
100 #ifdef DEVICE_MANAGER
101 class HCameraService::DeviceInitCallBack : public DistributedHardware::DmInitCallback {
102 void OnRemoteDied() override;
103 };
104
OnRemoteDied()105 void HCameraService::DeviceInitCallBack::OnRemoteDied()
106 {
107 MEDIA_INFO_LOG("CameraManager::DeviceInitCallBack OnRemoteDied");
108 }
109 #endif
110
OnStart()111 void HCameraService::OnStart()
112 {
113 MEDIA_INFO_LOG("HCameraService OnStart begin");
114 CHECK_ERROR_PRINT_LOG(cameraHostManager_->Init() != CAMERA_OK,
115 "HCameraService OnStart failed to init camera host manager.");
116 // initialize deferred processing service.
117 DeferredProcessing::DeferredProcessingService::GetInstance().Initialize();
118 DeferredProcessing::DeferredProcessingService::GetInstance().Start();
119
120 #ifdef CAMERA_USE_SENSOR
121 RegisterSensorCallback();
122 #endif
123 AddSystemAbilityListener(DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID);
124 cameraDataShareHelper_ = std::make_shared<CameraDataShareHelper>();
125 if (Publish(this)) {
126 MEDIA_INFO_LOG("HCameraService publish OnStart sucess");
127 } else {
128 MEDIA_INFO_LOG("HCameraService publish OnStart failed");
129 }
130 MEDIA_INFO_LOG("HCameraService OnStart end");
131 }
132
OnDump()133 void HCameraService::OnDump()
134 {
135 MEDIA_INFO_LOG("HCameraService::OnDump called");
136 }
137
OnStop()138 void HCameraService::OnStop()
139 {
140 MEDIA_INFO_LOG("HCameraService::OnStop called");
141 cameraHostManager_->DeInit();
142 UnRegisterFoldStatusListener();
143 #ifdef CAMERA_USE_SENSOR
144 UnRegisterSensorCallback();
145 #endif
146 DeferredProcessing::DeferredProcessingService::GetInstance().Stop();
147 }
148
GetMuteModeFromDataShareHelper(bool & muteMode)149 int32_t HCameraService::GetMuteModeFromDataShareHelper(bool &muteMode)
150 {
151 lock_guard<mutex> lock(g_dataShareHelperMutex);
152 CHECK_ERROR_RETURN_RET_LOG(cameraDataShareHelper_ == nullptr, CAMERA_INVALID_ARG,
153 "GetMuteModeFromDataShareHelper NULL");
154 std::string value = "";
155 auto ret = cameraDataShareHelper_->QueryOnce(PREDICATES_STRING, value);
156 MEDIA_INFO_LOG("GetMuteModeFromDataShareHelper Query ret = %{public}d, value = %{public}s", ret, value.c_str());
157 CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK, CAMERA_INVALID_ARG, "GetMuteModeFromDataShareHelper QueryOnce fail.");
158 value = (value == "0" || value == "1") ? value : "0";
159 int32_t muteModeVal = std::stoi(value);
160 CHECK_ERROR_RETURN_RET_LOG(muteModeVal != 0 && muteModeVal != 1, CAMERA_INVALID_ARG,
161 "GetMuteModeFromDataShareHelper Query MuteMode invald, value = %{public}d", muteModeVal);
162 muteMode = (muteModeVal == 1) ? true: false;
163 this->muteModeStored_ = muteMode;
164 return CAMERA_OK;
165 }
166
SetMuteModeByDataShareHelper(bool muteMode)167 int32_t HCameraService::SetMuteModeByDataShareHelper(bool muteMode)
168 {
169 lock_guard<mutex> lock(g_dataShareHelperMutex);
170 CHECK_ERROR_RETURN_RET_LOG(cameraDataShareHelper_ == nullptr, CAMERA_ALLOC_ERROR,
171 "GetMuteModeFromDataShareHelper NULL");
172 std::string unMuteModeStr = "0";
173 std::string muteModeStr = "1";
174 std::string value = muteMode? muteModeStr : unMuteModeStr;
175 auto ret = cameraDataShareHelper_->UpdateOnce(PREDICATES_STRING, value);
176 CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK, CAMERA_ALLOC_ERROR, "SetMuteModeByDataShareHelper UpdateOnce fail.");
177 return CAMERA_OK;
178 }
179
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)180 void HCameraService::OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId)
181 {
182 MEDIA_INFO_LOG("OnAddSystemAbility systemAbilityId:%{public}d", systemAbilityId);
183 bool muteMode = false;
184 int32_t ret = -1;
185 int32_t cnt = 0;
186 const int32_t retryCnt = 5;
187 const int32_t retryTimeout = 1;
188 switch (systemAbilityId) {
189 case DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID:
190 MEDIA_INFO_LOG("OnAddSystemAbility RegisterObserver start");
191 while (cnt++ < retryCnt) {
192 ret = GetMuteModeFromDataShareHelper(muteMode);
193 MEDIA_INFO_LOG("OnAddSystemAbility GetMuteModeFromDataShareHelper, tryCount=%{public}d", cnt);
194 if (ret == CAMERA_OK) {
195 break;
196 }
197 sleep(retryTimeout);
198 }
199 this->SetServiceStatus(CameraServiceStatus::SERVICE_READY);
200 MuteCameraFunc(muteMode);
201 muteModeStored_ = muteMode;
202 MEDIA_INFO_LOG("OnAddSystemAbility GetMuteModeFromDataShareHelper Success, muteMode = %{public}d, "
203 "final retryCnt=%{public}d",
204 muteMode, cnt);
205 break;
206 default:
207 MEDIA_INFO_LOG("OnAddSystemAbility unhandled sysabilityId:%{public}d", systemAbilityId);
208 break;
209 }
210 MEDIA_INFO_LOG("OnAddSystemAbility done");
211 }
212
OnRemoveSystemAbility(int32_t systemAbilityId,const std::string & deviceId)213 void HCameraService::OnRemoveSystemAbility(int32_t systemAbilityId, const std::string& deviceId)
214 {
215 MEDIA_DEBUG_LOG("HCameraService::OnRemoveSystemAbility systemAbilityId:%{public}d removed", systemAbilityId);
216 }
217
GetCameras(vector<string> & cameraIds,vector<shared_ptr<OHOS::Camera::CameraMetadata>> & cameraAbilityList)218 int32_t HCameraService::GetCameras(
219 vector<string>& cameraIds, vector<shared_ptr<OHOS::Camera::CameraMetadata>>& cameraAbilityList)
220 {
221 CAMERA_SYNC_TRACE;
222 isFoldable = isFoldableInit ? isFoldable : g_isFoldScreen;
223 isFoldableInit = true;
224 int32_t ret = cameraHostManager_->GetCameras(cameraIds);
225 CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK, ret, "HCameraService::GetCameras failed");
226 shared_ptr<OHOS::Camera::CameraMetadata> cameraAbility;
227 vector<shared_ptr<CameraMetaInfo>> cameraInfos;
228 for (auto id : cameraIds) {
229 ret = cameraHostManager_->GetCameraAbility(id, cameraAbility);
230 CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK || cameraAbility == nullptr, ret,
231 "HCameraService::GetCameraAbility failed");
232 auto cameraMetaInfo = GetCameraMetaInfo(id, cameraAbility);
233 if (cameraMetaInfo == nullptr) {
234 continue;
235 }
236 cameraInfos.emplace_back(cameraMetaInfo);
237 }
238 FillCameras(cameraInfos, cameraIds, cameraAbilityList);
239 return ret;
240 }
241
GetCameraMetaInfo(std::string & cameraId,shared_ptr<OHOS::Camera::CameraMetadata> cameraAbility)242 shared_ptr<CameraMetaInfo>HCameraService::GetCameraMetaInfo(std::string &cameraId,
243 shared_ptr<OHOS::Camera::CameraMetadata>cameraAbility)
244 {
245 camera_metadata_item_t item;
246 common_metadata_header_t* metadata = cameraAbility->get();
247 int32_t res = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_ABILITY_CAMERA_POSITION, &item);
248 uint8_t cameraPosition = (res == CAM_META_SUCCESS) ? item.data.u8[0] : OHOS_CAMERA_POSITION_OTHER;
249 res = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_ABILITY_CAMERA_FOLDSCREEN_TYPE, &item);
250 uint8_t foldType = (res == CAM_META_SUCCESS) ? item.data.u8[0] : OHOS_CAMERA_FOLDSCREEN_OTHER;
251 if (isFoldable && cameraPosition == OHOS_CAMERA_POSITION_FRONT && foldType == OHOS_CAMERA_POSITION_OTHER &&
252 system::GetParameter("const.window.foldscreen.type", "")[0] == '1') {
253 return nullptr;
254 }
255 if (isFoldable && cameraPosition == OHOS_CAMERA_POSITION_FRONT && foldType == OHOS_CAMERA_FOLDSCREEN_INNER) {
256 cameraPosition = POSITION_FOLD_INNER;
257 }
258 res = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_ABILITY_CAMERA_TYPE, &item);
259 uint8_t cameraType = (res == CAM_META_SUCCESS) ? item.data.u8[0] : OHOS_CAMERA_TYPE_UNSPECIFIED;
260 res = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_ABILITY_CAMERA_CONNECTION_TYPE, &item);
261 uint8_t connectionType = (res == CAM_META_SUCCESS) ? item.data.u8[0] : OHOS_CAMERA_CONNECTION_TYPE_BUILTIN;
262 res = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_CONTROL_CAPTURE_MIRROR_SUPPORTED, &item);
263 bool isMirrorSupported = (res == CAM_META_SUCCESS) ? (item.count != 0) : false;
264 res = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_ABILITY_CAMERA_FOLD_STATUS, &item);
265 uint8_t foldStatus = (res == CAM_META_SUCCESS) ? item.data.u8[0] : OHOS_CAMERA_FOLD_STATUS_NONFOLDABLE;
266 res = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_ABILITY_CAMERA_MODES, &item);
267 std::vector<uint8_t> supportModes = {};
268 for (uint32_t i = 0; i < item.count; i++) {
269 supportModes.push_back(item.data.u8[i]);
270 }
271 CAMERA_SYSEVENT_STATISTIC(CreateMsg("CameraManager GetCameras camera ID:%s, Camera position:%d, "
272 "Camera Type:%d, Connection Type:%d, Mirror support:%d, Fold status %d",
273 cameraId.c_str(), cameraPosition, cameraType, connectionType, isMirrorSupported, foldStatus));
274 return make_shared<CameraMetaInfo>(cameraId, cameraType, cameraPosition, connectionType,
275 foldStatus, supportModes, cameraAbility);
276 }
277
FillCameras(vector<shared_ptr<CameraMetaInfo>> & cameraInfos,vector<string> & cameraIds,vector<shared_ptr<OHOS::Camera::CameraMetadata>> & cameraAbilityList)278 void HCameraService::FillCameras(vector<shared_ptr<CameraMetaInfo>>& cameraInfos,
279 vector<string>& cameraIds, vector<shared_ptr<OHOS::Camera::CameraMetadata>>& cameraAbilityList)
280 {
281 vector<shared_ptr<CameraMetaInfo>> choosedCameras = ChooseDeFaultCameras(cameraInfos);
282 cameraIds.clear();
283 cameraAbilityList.clear();
284 for (const auto& camera: choosedCameras) {
285 cameraIds.emplace_back(camera->cameraId);
286 cameraAbilityList.emplace_back(camera->cameraAbility);
287 }
288 int32_t uid = IPCSkeleton::GetCallingUid();
289 if (uid == ROOT_UID || uid == FACE_CLIENT_UID || uid == RSS_UID ||
290 OHOS::Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(IPCSkeleton::GetCallingFullTokenID())) {
291 vector<shared_ptr<CameraMetaInfo>> physicalCameras = ChoosePhysicalCameras(cameraInfos, choosedCameras);
292 for (const auto& camera: physicalCameras) {
293 cameraIds.emplace_back(camera->cameraId);
294 cameraAbilityList.emplace_back(camera->cameraAbility);
295 }
296 } else {
297 MEDIA_INFO_LOG("current token id not support physical camera");
298 }
299 }
300
ChoosePhysicalCameras(const vector<shared_ptr<CameraMetaInfo>> & cameraInfos,const vector<shared_ptr<CameraMetaInfo>> & choosedCameras)301 vector<shared_ptr<CameraMetaInfo>> HCameraService::ChoosePhysicalCameras(
302 const vector<shared_ptr<CameraMetaInfo>>& cameraInfos, const vector<shared_ptr<CameraMetaInfo>>& choosedCameras)
303 {
304 std::vector<OHOS::HDI::Camera::V1_3::OperationMode> supportedPhysicalCamerasModes = {
305 OHOS::HDI::Camera::V1_3::OperationMode::PROFESSIONAL_PHOTO,
306 OHOS::HDI::Camera::V1_3::OperationMode::PROFESSIONAL_VIDEO,
307 OHOS::HDI::Camera::V1_3::OperationMode::HIGH_RESOLUTION_PHOTO,
308 };
309 vector<shared_ptr<CameraMetaInfo>> physicalCameraInfos = {};
310 for (auto& camera : cameraInfos) {
311 if (std::any_of(choosedCameras.begin(), choosedCameras.end(), [camera](const auto& defaultCamera) {
312 return camera->cameraId == defaultCamera->cameraId;
313 })
314 ) {
315 MEDIA_INFO_LOG("ChoosePhysicalCameras alreadly has default camera: %{public}s", camera->cameraId.c_str());
316 } else {
317 physicalCameraInfos.push_back(camera);
318 }
319 }
320 vector<shared_ptr<CameraMetaInfo>> physicalCameras = {};
321 for (auto& camera : physicalCameraInfos) {
322 MEDIA_INFO_LOG("ChoosePhysicalCameras camera ID:%s, CameraType: %{public}d, Camera position:%{public}d, "
323 "Connection Type:%{public}d",
324 camera->cameraId.c_str(), camera->cameraType, camera->position, camera->connectionType);
325 bool isSupportPhysicalCamera = std::any_of(camera->supportModes.begin(), camera->supportModes.end(),
326 [&supportedPhysicalCamerasModes](auto mode) -> bool {
327 return any_of(supportedPhysicalCamerasModes.begin(), supportedPhysicalCamerasModes.end(),
328 [mode](auto it)-> bool { return it == mode; });
329 });
330 if (camera->cameraType != camera_type_enum_t::OHOS_CAMERA_TYPE_UNSPECIFIED && isSupportPhysicalCamera) {
331 physicalCameras.emplace_back(camera);
332 MEDIA_INFO_LOG("ChoosePhysicalCameras add camera ID:%{public}s", camera->cameraId.c_str());
333 }
334 }
335 return physicalCameras;
336 }
337
ChooseDeFaultCameras(vector<shared_ptr<CameraMetaInfo>> cameraInfos)338 vector<shared_ptr<CameraMetaInfo>> HCameraService::ChooseDeFaultCameras(vector<shared_ptr<CameraMetaInfo>> cameraInfos)
339 {
340 vector<shared_ptr<CameraMetaInfo>> choosedCameras;
341 for (auto& camera : cameraInfos) {
342 MEDIA_INFO_LOG("ChooseDeFaultCameras camera ID:%s, Camera position:%{public}d, Connection Type:%{public}d",
343 camera->cameraId.c_str(), camera->position, camera->connectionType);
344 if (any_of(choosedCameras.begin(), choosedCameras.end(),
345 [camera](const auto& defaultCamera) {
346 return (camera->connectionType != OHOS_CAMERA_CONNECTION_TYPE_USB_PLUGIN &&
347 defaultCamera->position == camera->position &&
348 defaultCamera->connectionType == camera->connectionType &&
349 defaultCamera->foldStatus == camera->foldStatus);
350 })
351 ) {
352 MEDIA_INFO_LOG("ChooseDeFaultCameras alreadly has default camera");
353 } else {
354 choosedCameras.emplace_back(camera);
355 MEDIA_INFO_LOG("add camera ID:%{public}s", camera->cameraId.c_str());
356 }
357 }
358 return choosedCameras;
359 }
360
GetCameraIds(vector<string> & cameraIds)361 int32_t HCameraService::GetCameraIds(vector<string>& cameraIds)
362 {
363 CAMERA_SYNC_TRACE;
364 int32_t ret = CAMERA_OK;
365 MEDIA_DEBUG_LOG("HCameraService::GetCameraIds");
366 std::vector<std::shared_ptr<OHOS::Camera::CameraMetadata>> cameraAbilityList;
367 ret = GetCameras(cameraIds, cameraAbilityList);
368 CHECK_ERROR_PRINT_LOG(ret != CAMERA_OK, "HCameraService::GetCameraIds failed");
369 return ret;
370 }
371
GetCameraAbility(std::string & cameraId,std::shared_ptr<OHOS::Camera::CameraMetadata> & cameraAbility)372 int32_t HCameraService::GetCameraAbility(std::string& cameraId,
373 std::shared_ptr<OHOS::Camera::CameraMetadata>& cameraAbility)
374 {
375 CAMERA_SYNC_TRACE;
376 int32_t ret = CAMERA_OK;
377 MEDIA_DEBUG_LOG("HCameraService::GetCameraAbility");
378
379 std::vector<std::string> cameraIds;
380 std::vector<std::shared_ptr<OHOS::Camera::CameraMetadata>> cameraAbilityList;
381 ret = GetCameras(cameraIds, cameraAbilityList);
382 CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK, ret, "HCameraService::GetCameraAbility failed");
383
384 int32_t index = 0;
385 for (auto id : cameraIds) {
386 if (id.compare(cameraId) == 0) {
387 break;
388 }
389 index++;
390 }
391 int32_t abilityIndex = 0;
392 for (auto it : cameraAbilityList) {
393 if (abilityIndex == index) {
394 cameraAbility = it;
395 break;
396 }
397 abilityIndex++;
398 }
399 return ret;
400 }
401
CreateCameraDevice(string cameraId,sptr<ICameraDeviceService> & device)402 int32_t HCameraService::CreateCameraDevice(string cameraId, sptr<ICameraDeviceService>& device)
403 {
404 CAMERA_SYNC_TRACE;
405 OHOS::Security::AccessToken::AccessTokenID callerToken = IPCSkeleton::GetCallingTokenID();
406 MEDIA_INFO_LOG("HCameraService::CreateCameraDevice prepare execute, cameraId:%{public}s", cameraId.c_str());
407
408 string permissionName = OHOS_PERMISSION_CAMERA;
409 int32_t ret = CheckPermission(permissionName, callerToken);
410 CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK, ret,
411 "HCameraService::CreateCameraDevice Check OHOS_PERMISSION_CAMERA fail %{public}d", ret);
412 // if callerToken is invalid, will not call IsAllowedUsingPermission
413 CHECK_ERROR_RETURN_RET_LOG(!IsInForeGround(callerToken), CAMERA_ALLOC_ERROR,
414 "HCameraService::CreateCameraDevice is not allowed!");
415 sptr<HCameraDevice> cameraDevice = new (nothrow) HCameraDevice(cameraHostManager_, cameraId, callerToken);
416 CHECK_ERROR_RETURN_RET_LOG(cameraDevice == nullptr, CAMERA_ALLOC_ERROR,
417 "HCameraService::CreateCameraDevice HCameraDevice allocation failed");
418 CHECK_ERROR_RETURN_RET_LOG(GetServiceStatus() != CameraServiceStatus::SERVICE_READY, CAMERA_INVALID_STATE,
419 "HCameraService::CreateCameraDevice CameraService not ready!");
420 {
421 lock_guard<mutex> lock(g_dataShareHelperMutex);
422 // when create camera device, update mute setting truely.
423 if (IsCameraMuteSupported(cameraId)) {
424 if (UpdateMuteSetting(cameraDevice, muteModeStored_) != CAMERA_OK) {
425 MEDIA_ERR_LOG("UpdateMuteSetting Failed, cameraId: %{public}s", cameraId.c_str());
426 }
427 } else {
428 MEDIA_ERR_LOG("HCameraService::CreateCameraDevice MuteCamera not Supported");
429 }
430 device = cameraDevice;
431 cameraDevice->SetDeviceMuteMode(muteModeStored_);
432 }
433 #ifdef CAMERA_USE_SENSOR
434 RegisterSensorCallback();
435 #endif
436 CAMERA_SYSEVENT_STATISTIC(CreateMsg("CameraManager_CreateCameraInput CameraId:%s", cameraId.c_str()));
437 MEDIA_INFO_LOG("HCameraService::CreateCameraDevice execute success");
438 return CAMERA_OK;
439 }
440
CreateCaptureSession(sptr<ICaptureSession> & session,int32_t opMode)441 int32_t HCameraService::CreateCaptureSession(sptr<ICaptureSession>& session, int32_t opMode)
442 {
443 CAMERA_SYNC_TRACE;
444 std::lock_guard<std::mutex> lock(mutex_);
445 int32_t rc = CAMERA_OK;
446 MEDIA_INFO_LOG("HCameraService::CreateCaptureSession opMode_= %{public}d", opMode);
447
448 OHOS::Security::AccessToken::AccessTokenID callerToken = IPCSkeleton::GetCallingTokenID();
449 sptr<HCaptureSession> captureSession = HCaptureSession::NewInstance(callerToken, opMode);
450 if (captureSession == nullptr) {
451 rc = CAMERA_ALLOC_ERROR;
452 MEDIA_ERR_LOG("HCameraService::CreateCaptureSession allocation failed");
453 CameraReportUtils::ReportCameraError(
454 "HCameraService::CreateCaptureSession", rc, false, CameraReportUtils::GetCallerInfo());
455 return rc;
456 }
457 session = captureSession;
458 pid_t pid = IPCSkeleton::GetCallingPid();
459 captureSessionsManager_.EnsureInsert(pid, captureSession);
460 return rc;
461 }
462
CreateDeferredPhotoProcessingSession(int32_t userId,sptr<DeferredProcessing::IDeferredPhotoProcessingSessionCallback> & callback,sptr<DeferredProcessing::IDeferredPhotoProcessingSession> & session)463 int32_t HCameraService::CreateDeferredPhotoProcessingSession(int32_t userId,
464 sptr<DeferredProcessing::IDeferredPhotoProcessingSessionCallback>& callback,
465 sptr<DeferredProcessing::IDeferredPhotoProcessingSession>& session)
466 {
467 CAMERA_SYNC_TRACE;
468 MEDIA_INFO_LOG("HCameraService::CreateDeferredPhotoProcessingSession enter.");
469 sptr<DeferredProcessing::IDeferredPhotoProcessingSession> photoSession;
470 int32_t uid = IPCSkeleton::GetCallingUid();
471 AccountSA::OsAccountManager::GetOsAccountLocalIdFromUid(uid, userId);
472 MEDIA_INFO_LOG("CreateDeferredPhotoProcessingSession get uid:%{public}d userId:%{public}d", uid, userId);
473 photoSession =
474 DeferredProcessing::DeferredProcessingService::GetInstance().CreateDeferredPhotoProcessingSession(userId,
475 callback);
476 session = photoSession;
477 return CAMERA_OK;
478 }
479
CreateDeferredVideoProcessingSession(int32_t userId,sptr<DeferredProcessing::IDeferredVideoProcessingSessionCallback> & callback,sptr<DeferredProcessing::IDeferredVideoProcessingSession> & session)480 int32_t HCameraService::CreateDeferredVideoProcessingSession(int32_t userId,
481 sptr<DeferredProcessing::IDeferredVideoProcessingSessionCallback>& callback,
482 sptr<DeferredProcessing::IDeferredVideoProcessingSession>& session)
483 {
484 CAMERA_SYNC_TRACE;
485 MEDIA_INFO_LOG("HCameraService::CreateDeferredVideoProcessingSession enter.");
486 sptr<DeferredProcessing::IDeferredVideoProcessingSession> videoSession;
487 int32_t uid = IPCSkeleton::GetCallingUid();
488 AccountSA::OsAccountManager::GetOsAccountLocalIdFromUid(uid, userId);
489 MEDIA_INFO_LOG("CreateDeferredVideoProcessingSession get uid:%{public}d userId:%{public}d", uid, userId);
490 videoSession =
491 DeferredProcessing::DeferredProcessingService::GetInstance().CreateDeferredVideoProcessingSession(userId,
492 callback);
493 session = videoSession;
494 return CAMERA_OK;
495 }
496
CreatePhotoOutput(const sptr<OHOS::IBufferProducer> & producer,int32_t format,int32_t width,int32_t height,sptr<IStreamCapture> & photoOutput)497 int32_t HCameraService::CreatePhotoOutput(const sptr<OHOS::IBufferProducer>& producer, int32_t format, int32_t width,
498 int32_t height, sptr<IStreamCapture>& photoOutput)
499 {
500 CAMERA_SYNC_TRACE;
501 int32_t rc = CAMERA_OK;
502 MEDIA_INFO_LOG("HCameraService::CreatePhotoOutput prepare execute");
503 if ((producer == nullptr) || (width == 0) || (height == 0)) {
504 rc = CAMERA_INVALID_ARG;
505 MEDIA_ERR_LOG("HCameraService::CreatePhotoOutput producer is null");
506 CameraReportUtils::ReportCameraError(
507 "HCameraService::CreatePhotoOutput", rc, false, CameraReportUtils::GetCallerInfo());
508 return rc;
509 }
510 sptr<HStreamCapture> streamCapture = new (nothrow) HStreamCapture(producer, format, width, height);
511 if (streamCapture == nullptr) {
512 rc = CAMERA_ALLOC_ERROR;
513 MEDIA_ERR_LOG("HCameraService::CreatePhotoOutput streamCapture is null");
514 CameraReportUtils::ReportCameraError(
515 "HCameraService::CreatePhotoOutput", rc, false, CameraReportUtils::GetCallerInfo());
516 return rc;
517 }
518
519 stringstream ss;
520 ss << "format=" << format << " width=" << width << " height=" << height;
521 CameraReportUtils::GetInstance().UpdateProfileInfo(ss.str());
522 photoOutput = streamCapture;
523 MEDIA_INFO_LOG("HCameraService::CreatePhotoOutput execute success");
524 return rc;
525 }
526
CreateDeferredPreviewOutput(int32_t format,int32_t width,int32_t height,sptr<IStreamRepeat> & previewOutput)527 int32_t HCameraService::CreateDeferredPreviewOutput(
528 int32_t format, int32_t width, int32_t height, sptr<IStreamRepeat>& previewOutput)
529 {
530 CAMERA_SYNC_TRACE;
531 sptr<HStreamRepeat> streamDeferredPreview;
532 MEDIA_INFO_LOG("HCameraService::CreateDeferredPreviewOutput prepare execute");
533 CHECK_ERROR_RETURN_RET_LOG((width == 0) || (height == 0), CAMERA_INVALID_ARG,
534 "HCameraService::CreateDeferredPreviewOutput producer is null!");
535 streamDeferredPreview = new (nothrow) HStreamRepeat(nullptr, format, width, height, RepeatStreamType::PREVIEW);
536 CHECK_ERROR_RETURN_RET_LOG(streamDeferredPreview == nullptr, CAMERA_ALLOC_ERROR,
537 "HCameraService::CreateDeferredPreviewOutput HStreamRepeat allocation failed");
538 previewOutput = streamDeferredPreview;
539 MEDIA_INFO_LOG("HCameraService::CreateDeferredPreviewOutput execute success");
540 return CAMERA_OK;
541 }
542
CreatePreviewOutput(const sptr<OHOS::IBufferProducer> & producer,int32_t format,int32_t width,int32_t height,sptr<IStreamRepeat> & previewOutput)543 int32_t HCameraService::CreatePreviewOutput(const sptr<OHOS::IBufferProducer>& producer, int32_t format, int32_t width,
544 int32_t height, sptr<IStreamRepeat>& previewOutput)
545 {
546 CAMERA_SYNC_TRACE;
547 sptr<HStreamRepeat> streamRepeatPreview;
548 int32_t rc = CAMERA_OK;
549 MEDIA_INFO_LOG("HCameraService::CreatePreviewOutput prepare execute");
550
551 if ((producer == nullptr) || (width == 0) || (height == 0)) {
552 rc = CAMERA_INVALID_ARG;
553 MEDIA_ERR_LOG("HCameraService::CreatePreviewOutput producer is null");
554 CameraReportUtils::ReportCameraError(
555 "HCameraService::CreatePreviewOutput", rc, false, CameraReportUtils::GetCallerInfo());
556 return rc;
557 }
558 streamRepeatPreview = new (nothrow) HStreamRepeat(producer, format, width, height, RepeatStreamType::PREVIEW);
559 if (streamRepeatPreview == nullptr) {
560 rc = CAMERA_ALLOC_ERROR;
561 MEDIA_ERR_LOG("HCameraService::CreatePreviewOutput HStreamRepeat allocation failed");
562 CameraReportUtils::ReportCameraError(
563 "HCameraService::CreatePreviewOutput", rc, false, CameraReportUtils::GetCallerInfo());
564 return rc;
565 }
566 previewOutput = streamRepeatPreview;
567 MEDIA_INFO_LOG("HCameraService::CreatePreviewOutput execute success");
568 return rc;
569 }
570
CreateDepthDataOutput(const sptr<OHOS::IBufferProducer> & producer,int32_t format,int32_t width,int32_t height,sptr<IStreamDepthData> & depthDataOutput)571 int32_t HCameraService::CreateDepthDataOutput(const sptr<OHOS::IBufferProducer>& producer, int32_t format,
572 int32_t width, int32_t height, sptr<IStreamDepthData>& depthDataOutput)
573 {
574 CAMERA_SYNC_TRACE;
575 sptr<HStreamDepthData> streamDepthData;
576 int32_t rc = CAMERA_OK;
577 MEDIA_INFO_LOG("HCameraService::CreateDepthDataOutput prepare execute");
578
579 if ((producer == nullptr) || (width == 0) || (height == 0)) {
580 rc = CAMERA_INVALID_ARG;
581 MEDIA_ERR_LOG("HCameraService::CreateDepthDataOutput producer is null");
582 CameraReportUtils::ReportCameraError(
583 "HCameraService::CreateDepthDataOutput", rc, false, CameraReportUtils::GetCallerInfo());
584 return rc;
585 }
586 streamDepthData = new (nothrow) HStreamDepthData(producer, format, width, height);
587 if (streamDepthData == nullptr) {
588 rc = CAMERA_ALLOC_ERROR;
589 MEDIA_ERR_LOG("HCameraService::CreateDepthDataOutput HStreamRepeat allocation failed");
590 CameraReportUtils::ReportCameraError(
591 "HCameraService::CreateDepthDataOutput", rc, false, CameraReportUtils::GetCallerInfo());
592 return rc;
593 }
594 depthDataOutput = streamDepthData;
595 MEDIA_INFO_LOG("HCameraService::CreateDepthDataOutput execute success");
596 return rc;
597 }
598
CreateMetadataOutput(const sptr<OHOS::IBufferProducer> & producer,int32_t format,std::vector<int32_t> metadataTypes,sptr<IStreamMetadata> & metadataOutput)599 int32_t HCameraService::CreateMetadataOutput(const sptr<OHOS::IBufferProducer>& producer, int32_t format,
600 std::vector<int32_t> metadataTypes, sptr<IStreamMetadata>& metadataOutput)
601 {
602 CAMERA_SYNC_TRACE;
603 sptr<HStreamMetadata> streamMetadata;
604 MEDIA_INFO_LOG("HCameraService::CreateMetadataOutput prepare execute");
605
606 CHECK_ERROR_RETURN_RET_LOG(producer == nullptr, CAMERA_INVALID_ARG,
607 "HCameraService::CreateMetadataOutput producer is null");
608 streamMetadata = new (nothrow) HStreamMetadata(producer, format, metadataTypes);
609 CHECK_ERROR_RETURN_RET_LOG(streamMetadata == nullptr, CAMERA_ALLOC_ERROR,
610 "HCameraService::CreateMetadataOutput HStreamMetadata allocation failed");
611
612 metadataOutput = streamMetadata;
613 MEDIA_INFO_LOG("HCameraService::CreateMetadataOutput execute success");
614 return CAMERA_OK;
615 }
616
CreateVideoOutput(const sptr<OHOS::IBufferProducer> & producer,int32_t format,int32_t width,int32_t height,sptr<IStreamRepeat> & videoOutput)617 int32_t HCameraService::CreateVideoOutput(const sptr<OHOS::IBufferProducer>& producer, int32_t format, int32_t width,
618 int32_t height, sptr<IStreamRepeat>& videoOutput)
619 {
620 CAMERA_SYNC_TRACE;
621 sptr<HStreamRepeat> streamRepeatVideo;
622 int32_t rc = CAMERA_OK;
623 MEDIA_INFO_LOG("HCameraService::CreateVideoOutput prepare execute");
624
625 if ((producer == nullptr) || (width == 0) || (height == 0)) {
626 rc = CAMERA_INVALID_ARG;
627 MEDIA_ERR_LOG("HCameraService::CreateVideoOutput producer is null");
628 CameraReportUtils::ReportCameraError(
629 "HCameraService::CreateVideoOutput", rc, false, CameraReportUtils::GetCallerInfo());
630 return rc;
631 }
632 streamRepeatVideo = new (nothrow) HStreamRepeat(producer, format, width, height, RepeatStreamType::VIDEO);
633 if (streamRepeatVideo == nullptr) {
634 rc = CAMERA_ALLOC_ERROR;
635 MEDIA_ERR_LOG("HCameraService::CreateVideoOutput HStreamRepeat allocation failed");
636 CameraReportUtils::ReportCameraError(
637 "HCameraService::CreateVideoOutput", rc, false, CameraReportUtils::GetCallerInfo());
638 return rc;
639 }
640 stringstream ss;
641 ss << "format=" << format << " width=" << width << " height=" << height;
642 CameraReportUtils::GetInstance().UpdateProfileInfo(ss.str());
643 videoOutput = streamRepeatVideo;
644 MEDIA_INFO_LOG("HCameraService::CreateVideoOutput execute success");
645 return rc;
646 }
647
ShouldSkipStatusUpdates(pid_t pid)648 bool HCameraService::ShouldSkipStatusUpdates(pid_t pid)
649 {
650 std::lock_guard<std::mutex> lock(freezedPidListMutex_);
651 CHECK_AND_RETURN_RET(freezedPidList_.count(pid) != 0, false);
652 MEDIA_INFO_LOG("ShouldSkipStatusUpdates pid = %{public}d", pid);
653 return true;
654 }
655
OnCameraStatus(const string & cameraId,CameraStatus status,CallbackInvoker invoker)656 void HCameraService::OnCameraStatus(const string& cameraId, CameraStatus status, CallbackInvoker invoker)
657 {
658 lock_guard<mutex> lock(cameraCbMutex_);
659 std::string bundleName = "";
660 if (invoker == CallbackInvoker::APPLICATION) {
661 bundleName = GetClientBundle(IPCSkeleton::GetCallingUid());
662 }
663 MEDIA_INFO_LOG("HCameraService::OnCameraStatus callbacks.size = %{public}zu, cameraId = %{public}s, "
664 "status = %{public}d, pid = %{public}d, bundleName = %{public}s", cameraServiceCallbacks_.size(),
665 cameraId.c_str(), status, IPCSkeleton::GetCallingPid(), bundleName.c_str());
666 for (auto it : cameraServiceCallbacks_) {
667 if (it.second == nullptr) {
668 MEDIA_ERR_LOG("HCameraService::OnCameraStatus pid:%{public}d cameraServiceCallback is null", it.first);
669 continue;
670 }
671 uint32_t pid = it.first;
672 if (ShouldSkipStatusUpdates(pid)) {
673 continue;
674 }
675 it.second->OnCameraStatusChanged(cameraId, status, bundleName);
676 cameraStatusCallbacks_[cameraId] = CameraStatusCallbacksInfo{status, bundleName};
677 CAMERA_SYSEVENT_BEHAVIOR(CreateMsg("OnCameraStatusChanged! for cameraId:%s, current Camera Status:%d",
678 cameraId.c_str(), status));
679 }
680 }
681
OnFlashlightStatus(const string & cameraId,FlashStatus status)682 void HCameraService::OnFlashlightStatus(const string& cameraId, FlashStatus status)
683 {
684 lock_guard<mutex> lock(cameraCbMutex_);
685 MEDIA_INFO_LOG("HCameraService::OnFlashlightStatus callbacks.size = %{public}zu, cameraId = %{public}s, "
686 "status = %{public}d, pid = %{public}d", cameraServiceCallbacks_.size(), cameraId.c_str(), status,
687 IPCSkeleton::GetCallingPid());
688 for (auto it : cameraServiceCallbacks_) {
689 if (it.second == nullptr) {
690 MEDIA_ERR_LOG("HCameraService::OnCameraStatus pid:%{public}d cameraServiceCallback is null", it.first);
691 continue;
692 }
693 uint32_t pid = it.first;
694 if (ShouldSkipStatusUpdates(pid)) {
695 continue;
696 }
697 it.second->OnFlashlightStatusChanged(cameraId, status);
698 }
699 }
700
OnMute(bool muteMode)701 void HCameraService::OnMute(bool muteMode)
702 {
703 lock_guard<mutex> lock(muteCbMutex_);
704 if (!cameraMuteServiceCallbacks_.empty()) {
705 for (auto it : cameraMuteServiceCallbacks_) {
706 if (it.second == nullptr) {
707 MEDIA_ERR_LOG("HCameraService::OnMute pid:%{public}d cameraMuteServiceCallback is null", it.first);
708 continue;
709 }
710 uint32_t pid = it.first;
711 if (ShouldSkipStatusUpdates(pid)) {
712 continue;
713 }
714 it.second->OnCameraMute(muteMode);
715 CAMERA_SYSEVENT_BEHAVIOR(CreateMsg("OnCameraMute! current Camera muteMode:%d", muteMode));
716 }
717 }
718 if (peerCallback_ != nullptr) {
719 MEDIA_INFO_LOG("HCameraService::NotifyMuteCamera peerCallback current camera muteMode:%{public}d", muteMode);
720 peerCallback_->NotifyMuteCamera(muteMode);
721 }
722 }
723
OnTorchStatus(TorchStatus status)724 void HCameraService::OnTorchStatus(TorchStatus status)
725 {
726 lock_guard<recursive_mutex> lock(torchCbMutex_);
727 torchStatus_ = status;
728 MEDIA_INFO_LOG("HCameraService::OnTorchtStatus callbacks.size = %{public}zu, status = %{public}d, pid = %{public}d",
729 torchServiceCallbacks_.size(), status, IPCSkeleton::GetCallingPid());
730 for (auto it : torchServiceCallbacks_) {
731 if (it.second == nullptr) {
732 MEDIA_ERR_LOG("HCameraService::OnTorchtStatus pid:%{public}d torchServiceCallback is null", it.first);
733 continue;
734 }
735 uint32_t pid = it.first;
736 if (ShouldSkipStatusUpdates(pid)) {
737 continue;
738 }
739 it.second->OnTorchStatusChange(status);
740 }
741 }
742
OnFoldStatusChanged(OHOS::Rosen::FoldStatus foldStatus)743 void HCameraService::OnFoldStatusChanged(OHOS::Rosen::FoldStatus foldStatus)
744 {
745 MEDIA_INFO_LOG("OnFoldStatusChanged preFoldStatus = %{public}d, foldStatus = %{public}d, pid = %{public}d",
746 preFoldStatus_, foldStatus, IPCSkeleton::GetCallingPid());
747 auto curFoldStatus = (FoldStatus)foldStatus;
748 if ((curFoldStatus == FoldStatus::HALF_FOLD && preFoldStatus_ == FoldStatus::EXPAND) ||
749 (curFoldStatus == FoldStatus::EXPAND && preFoldStatus_ == FoldStatus::HALF_FOLD)) {
750 preFoldStatus_ = curFoldStatus;
751 return;
752 }
753 preFoldStatus_ = curFoldStatus;
754 if (curFoldStatus == FoldStatus::HALF_FOLD) {
755 curFoldStatus = FoldStatus::EXPAND;
756 }
757 lock_guard<recursive_mutex> lock(foldCbMutex_);
758 CHECK_EXECUTE(innerFoldCallback_, innerFoldCallback_->OnFoldStatusChanged(curFoldStatus));
759 CHECK_ERROR_RETURN_LOG(foldServiceCallbacks_.empty(), "OnFoldStatusChanged foldServiceCallbacks is empty");
760 MEDIA_INFO_LOG("OnFoldStatusChanged foldStatusCallback size = %{public}zu", foldServiceCallbacks_.size());
761 for (auto it : foldServiceCallbacks_) {
762 if (it.second == nullptr) {
763 MEDIA_ERR_LOG("OnFoldStatusChanged pid:%{public}d foldStatusCallbacks is null", it.first);
764 continue;
765 }
766 uint32_t pid = it.first;
767 if (ShouldSkipStatusUpdates(pid)) {
768 continue;
769 }
770 it.second->OnFoldStatusChanged(curFoldStatus);
771 }
772 }
773
CloseCameraForDestory(pid_t pid)774 int32_t HCameraService::CloseCameraForDestory(pid_t pid)
775 {
776 MEDIA_INFO_LOG("HCameraService::CloseCameraForDestory enter");
777 sptr<HCameraDeviceManager> deviceManager = HCameraDeviceManager::GetInstance();
778 sptr<HCameraDevice> deviceNeedClose = deviceManager->GetCameraByPid(pid);
779 if (deviceNeedClose != nullptr) {
780 deviceNeedClose->Close();
781 }
782 return CAMERA_OK;
783 }
784
ExecutePidSetCallback(sptr<ICameraServiceCallback> & callback,std::vector<std::string> & cameraIds)785 void HCameraService::ExecutePidSetCallback(sptr<ICameraServiceCallback>& callback, std::vector<std::string> &cameraIds)
786 {
787 for (const auto& cameraId : cameraIds) {
788 auto it = cameraStatusCallbacks_.find(cameraId);
789 if (it != cameraStatusCallbacks_.end()) {
790 MEDIA_INFO_LOG("ExecutePidSetCallback cameraId = %{public}s, status = %{public}d, bundleName = %{public}s",
791 cameraId.c_str(), it->second.status, it->second.bundleName.c_str());
792 callback->OnCameraStatusChanged(cameraId, it->second.status, it->second.bundleName);
793 } else {
794 MEDIA_INFO_LOG("ExecutePidSetCallback cameraId = %{public}s, status = 2", cameraId.c_str());
795 callback->OnCameraStatusChanged(cameraId, CameraStatus::CAMERA_STATUS_AVAILABLE);
796 }
797 }
798 }
799
SetCameraCallback(sptr<ICameraServiceCallback> & callback)800 int32_t HCameraService::SetCameraCallback(sptr<ICameraServiceCallback>& callback)
801 {
802 std::vector<std::string> cameraIds;
803 GetCameraIds(cameraIds);
804 lock_guard<mutex> lock(cameraCbMutex_);
805 pid_t pid = IPCSkeleton::GetCallingPid();
806 MEDIA_INFO_LOG("HCameraService::SetCameraCallback pid = %{public}d", pid);
807 CHECK_ERROR_RETURN_RET_LOG(callback == nullptr, CAMERA_INVALID_ARG,
808 "HCameraService::SetCameraCallback callback is null");
809 auto callbackItem = cameraServiceCallbacks_.find(pid);
810 if (callbackItem != cameraServiceCallbacks_.end()) {
811 callbackItem->second = nullptr;
812 (void)cameraServiceCallbacks_.erase(callbackItem);
813 }
814 cameraServiceCallbacks_.insert(make_pair(pid, callback));
815 ExecutePidSetCallback(callback, cameraIds);
816 return CAMERA_OK;
817 }
818
SetMuteCallback(sptr<ICameraMuteServiceCallback> & callback)819 int32_t HCameraService::SetMuteCallback(sptr<ICameraMuteServiceCallback>& callback)
820 {
821 lock_guard<mutex> lock(muteCbMutex_);
822 pid_t pid = IPCSkeleton::GetCallingPid();
823 MEDIA_INFO_LOG("HCameraService::SetMuteCallback pid = %{public}d", pid);
824 CHECK_ERROR_RETURN_RET_LOG(callback == nullptr, CAMERA_INVALID_ARG,
825 "HCameraService::SetMuteCallback callback is null");
826 // If the callback set by the SA caller is later than the camera service is started,
827 // the callback cannot be triggered to obtain the mute state. Therefore,
828 // when the SA sets the callback, the callback is triggered immediately to return the mute state.
829 constexpr int32_t maxSaUid = 10000;
830 if (IPCSkeleton::GetCallingUid() > 0 && IPCSkeleton::GetCallingUid() < maxSaUid) {
831 callback->OnCameraMute(muteModeStored_);
832 }
833 cameraMuteServiceCallbacks_.insert(make_pair(pid, callback));
834 return CAMERA_OK;
835 }
836
SetTorchCallback(sptr<ITorchServiceCallback> & callback)837 int32_t HCameraService::SetTorchCallback(sptr<ITorchServiceCallback>& callback)
838 {
839 lock_guard<recursive_mutex> lock(torchCbMutex_);
840 pid_t pid = IPCSkeleton::GetCallingPid();
841 MEDIA_INFO_LOG("HCameraService::SetTorchCallback pid = %{public}d", pid);
842 CHECK_ERROR_RETURN_RET_LOG(callback == nullptr, CAMERA_INVALID_ARG,
843 "HCameraService::SetTorchCallback callback is null");
844 torchServiceCallbacks_.insert(make_pair(pid, callback));
845
846 MEDIA_INFO_LOG("HCameraService::SetTorchCallback notify pid = %{public}d", pid);
847 callback->OnTorchStatusChange(torchStatus_);
848 return CAMERA_OK;
849 }
850
SetFoldStatusCallback(sptr<IFoldServiceCallback> & callback,bool isInnerCallback)851 int32_t HCameraService::SetFoldStatusCallback(sptr<IFoldServiceCallback>& callback, bool isInnerCallback)
852 {
853 lock_guard<recursive_mutex> lock(foldCbMutex_);
854 isFoldable = isFoldableInit ? isFoldable : g_isFoldScreen;
855 CHECK_EXECUTE((isFoldable && !isFoldRegister), RegisterFoldStatusListener());
856 if (isInnerCallback) {
857 innerFoldCallback_ = callback;
858 } else {
859 pid_t pid = IPCSkeleton::GetCallingPid();
860 MEDIA_INFO_LOG("HCameraService::SetFoldStatusCallback pid = %{public}d", pid);
861 CHECK_ERROR_RETURN_RET_LOG(callback == nullptr, CAMERA_INVALID_ARG,
862 "HCameraService::SetFoldStatusCallback callback is null");
863 foldServiceCallbacks_.insert(make_pair(pid, callback));
864 }
865 return CAMERA_OK;
866 }
867
UnSetCameraCallback(pid_t pid)868 int32_t HCameraService::UnSetCameraCallback(pid_t pid)
869 {
870 lock_guard<mutex> lock(cameraCbMutex_);
871 MEDIA_INFO_LOG("HCameraService::UnSetCameraCallback pid = %{public}d, size = %{public}zu",
872 pid, cameraServiceCallbacks_.size());
873 if (!cameraServiceCallbacks_.empty()) {
874 MEDIA_INFO_LOG("HCameraService::UnSetCameraCallback cameraServiceCallbacks_ is not empty, reset it");
875 auto it = cameraServiceCallbacks_.find(pid);
876 if ((it != cameraServiceCallbacks_.end()) && (it->second != nullptr)) {
877 it->second = nullptr;
878 cameraServiceCallbacks_.erase(it);
879 }
880 }
881 MEDIA_INFO_LOG("HCameraService::UnSetCameraCallback after erase pid = %{public}d, size = %{public}zu",
882 pid, cameraServiceCallbacks_.size());
883 return CAMERA_OK;
884 }
885
UnSetMuteCallback(pid_t pid)886 int32_t HCameraService::UnSetMuteCallback(pid_t pid)
887 {
888 lock_guard<mutex> lock(muteCbMutex_);
889 MEDIA_INFO_LOG("HCameraService::UnSetMuteCallback pid = %{public}d, size = %{public}zu",
890 pid, cameraMuteServiceCallbacks_.size());
891 if (!cameraMuteServiceCallbacks_.empty()) {
892 MEDIA_INFO_LOG("HCameraService::UnSetMuteCallback cameraMuteServiceCallbacks_ is not empty, reset it");
893 auto it = cameraMuteServiceCallbacks_.find(pid);
894 if ((it != cameraMuteServiceCallbacks_.end()) && (it->second)) {
895 it->second = nullptr;
896 cameraMuteServiceCallbacks_.erase(it);
897 }
898 }
899
900 MEDIA_INFO_LOG("HCameraService::UnSetMuteCallback after erase pid = %{public}d, size = %{public}zu",
901 pid, cameraMuteServiceCallbacks_.size());
902 return CAMERA_OK;
903 }
904
UnSetTorchCallback(pid_t pid)905 int32_t HCameraService::UnSetTorchCallback(pid_t pid)
906 {
907 lock_guard<recursive_mutex> lock(torchCbMutex_);
908 MEDIA_INFO_LOG("HCameraService::UnSetTorchCallback pid = %{public}d, size = %{public}zu",
909 pid, torchServiceCallbacks_.size());
910 if (!torchServiceCallbacks_.empty()) {
911 MEDIA_INFO_LOG("HCameraService::UnSetTorchCallback torchServiceCallbacks_ is not empty, reset it");
912 auto it = torchServiceCallbacks_.find(pid);
913 if ((it != torchServiceCallbacks_.end()) && (it->second)) {
914 it->second = nullptr;
915 torchServiceCallbacks_.erase(it);
916 }
917 }
918
919 MEDIA_INFO_LOG("HCameraService::UnSetTorchCallback after erase pid = %{public}d, size = %{public}zu",
920 pid, torchServiceCallbacks_.size());
921 return CAMERA_OK;
922 }
923
UnSetFoldStatusCallback(pid_t pid)924 int32_t HCameraService::UnSetFoldStatusCallback(pid_t pid)
925 {
926 lock_guard<recursive_mutex> lock(foldCbMutex_);
927 MEDIA_INFO_LOG("HCameraService::UnSetFoldStatusCallback pid = %{public}d, size = %{public}zu",
928 pid, foldServiceCallbacks_.size());
929 if (!foldServiceCallbacks_.empty()) {
930 MEDIA_INFO_LOG("HCameraService::UnSetFoldStatusCallback foldServiceCallbacks_ is not empty, reset it");
931 auto it = foldServiceCallbacks_.find(pid);
932 if ((it != foldServiceCallbacks_.end()) && (it->second)) {
933 it->second = nullptr;
934 foldServiceCallbacks_.erase(it);
935 }
936 }
937 MEDIA_INFO_LOG("HCameraService::UnSetFoldStatusCallback after erase pid = %{public}d, size = %{public}zu",
938 pid, foldServiceCallbacks_.size());
939 innerFoldCallback_ = nullptr;
940 return CAMERA_OK;
941 }
942
RegisterFoldStatusListener()943 void HCameraService::RegisterFoldStatusListener()
944 {
945 MEDIA_INFO_LOG("RegisterFoldStatusListener is called");
946 preFoldStatus_ = (FoldStatus)OHOS::Rosen::DisplayManager::GetInstance().GetFoldStatus();
947 auto ret = OHOS::Rosen::DisplayManager::GetInstance().RegisterFoldStatusListener(this);
948 CHECK_ERROR_RETURN_LOG(ret != OHOS::Rosen::DMError::DM_OK, "RegisterFoldStatusListener failed");
949 isFoldRegister = true;
950 }
951
UnRegisterFoldStatusListener()952 void HCameraService::UnRegisterFoldStatusListener()
953 {
954 MEDIA_INFO_LOG("UnRegisterFoldStatusListener is called");
955 auto ret = OHOS::Rosen::DisplayManager::GetInstance().UnregisterFoldStatusListener(this);
956 preFoldStatus_ = FoldStatus::UNKNOWN_FOLD;
957 CHECK_ERROR_PRINT_LOG(ret != OHOS::Rosen::DMError::DM_OK, "UnRegisterFoldStatusListener failed");
958 isFoldRegister = false;
959 }
960
UnSetAllCallback(pid_t pid)961 int32_t HCameraService::UnSetAllCallback(pid_t pid)
962 {
963 MEDIA_INFO_LOG("HCameraService::UnSetAllCallback enter");
964 UnSetCameraCallback(pid);
965 UnSetMuteCallback(pid);
966 UnSetTorchCallback(pid);
967 UnSetFoldStatusCallback(pid);
968 return CAMERA_OK;
969 }
970
IsCameraMuteSupported(string cameraId)971 bool HCameraService::IsCameraMuteSupported(string cameraId)
972 {
973 bool isMuteSupported = false;
974 shared_ptr<OHOS::Camera::CameraMetadata> cameraAbility;
975 int32_t ret = cameraHostManager_->GetCameraAbility(cameraId, cameraAbility);
976 CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK, false, "HCameraService::IsCameraMuted GetCameraAbility failed");
977 camera_metadata_item_t item;
978 common_metadata_header_t* metadata = cameraAbility->get();
979 ret = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_ABILITY_MUTE_MODES, &item);
980 if (ret == CAM_META_SUCCESS) {
981 for (uint32_t i = 0; i < item.count; i++) {
982 MEDIA_INFO_LOG("OHOS_ABILITY_MUTE_MODES %{public}d th is %{public}d", i, item.data.u8[i]);
983 if (item.data.u8[i] == OHOS_CAMERA_MUTE_MODE_SOLID_COLOR_BLACK) {
984 isMuteSupported = true;
985 break;
986 }
987 }
988 } else {
989 isMuteSupported = false;
990 MEDIA_ERR_LOG("HCameraService::IsCameraMuted not find MUTE ability");
991 }
992 MEDIA_DEBUG_LOG("HCameraService::IsCameraMuted supported: %{public}d", isMuteSupported);
993 return isMuteSupported;
994 }
995
UpdateMuteSetting(sptr<HCameraDevice> cameraDevice,bool muteMode)996 int32_t HCameraService::UpdateMuteSetting(sptr<HCameraDevice> cameraDevice, bool muteMode)
997 {
998 constexpr int32_t DEFAULT_ITEMS = 1;
999 constexpr int32_t DEFAULT_DATA_LENGTH = 1;
1000 shared_ptr<OHOS::Camera::CameraMetadata> changedMetadata =
1001 make_shared<OHOS::Camera::CameraMetadata>(DEFAULT_ITEMS, DEFAULT_DATA_LENGTH);
1002 bool status = false;
1003 int32_t ret;
1004 int32_t count = 1;
1005 uint8_t mode = muteMode ? OHOS_CAMERA_MUTE_MODE_SOLID_COLOR_BLACK : OHOS_CAMERA_MUTE_MODE_OFF;
1006 camera_metadata_item_t item;
1007
1008 MEDIA_DEBUG_LOG("UpdateMuteSetting muteMode: %{public}d", muteMode);
1009
1010 ret = OHOS::Camera::FindCameraMetadataItem(changedMetadata->get(), OHOS_CONTROL_MUTE_MODE, &item);
1011 if (ret == CAM_META_ITEM_NOT_FOUND) {
1012 status = changedMetadata->addEntry(OHOS_CONTROL_MUTE_MODE, &mode, count);
1013 } else if (ret == CAM_META_SUCCESS) {
1014 status = changedMetadata->updateEntry(OHOS_CONTROL_MUTE_MODE, &mode, count);
1015 }
1016 ret = cameraDevice->UpdateSetting(changedMetadata);
1017 CHECK_ERROR_RETURN_RET_LOG(!status || ret != CAMERA_OK, CAMERA_UNKNOWN_ERROR, "UpdateMuteSetting muteMode Failed");
1018 return CAMERA_OK;
1019 }
1020
MuteCameraFunc(bool muteMode)1021 int32_t HCameraService::MuteCameraFunc(bool muteMode)
1022 {
1023 {
1024 lock_guard<mutex> lock(g_dataShareHelperMutex);
1025 cameraHostManager_->SetMuteMode(muteMode);
1026 }
1027 int32_t ret = CAMERA_OK;
1028 bool currentMuteMode = muteModeStored_;
1029 sptr<HCameraDeviceManager> deviceManager = HCameraDeviceManager::GetInstance();
1030 pid_t activeClient = deviceManager->GetActiveClient();
1031 if (activeClient == -1) {
1032 OnMute(muteMode);
1033 int32_t retCode = SetMuteModeByDataShareHelper(muteMode);
1034 muteModeStored_ = muteMode;
1035 if (retCode != CAMERA_OK) {
1036 MEDIA_ERR_LOG("no activeClient, SetMuteModeByDataShareHelper: ret=%{public}d", retCode);
1037 muteModeStored_ = currentMuteMode;
1038 }
1039 return retCode;
1040 }
1041 sptr<HCameraDevice> activeDevice = deviceManager->GetCameraByPid(activeClient);
1042 if (activeDevice != nullptr) {
1043 string cameraId = activeDevice->GetCameraId();
1044 CHECK_ERROR_RETURN_RET_LOG(!IsCameraMuteSupported(cameraId), CAMERA_UNSUPPORTED,
1045 "Not Supported Mute,cameraId: %{public}s", cameraId.c_str());
1046 if (activeDevice != nullptr) {
1047 ret = UpdateMuteSetting(activeDevice, muteMode);
1048 }
1049 if (ret != CAMERA_OK) {
1050 MEDIA_ERR_LOG("UpdateMuteSetting Failed, cameraId: %{public}s", cameraId.c_str());
1051 muteModeStored_ = currentMuteMode;
1052 }
1053 }
1054 if (ret == CAMERA_OK) {
1055 OnMute(muteMode);
1056 }
1057 if (activeDevice != nullptr) {
1058 activeDevice->SetDeviceMuteMode(muteMode);
1059 }
1060 ret = SetMuteModeByDataShareHelper(muteMode);
1061 if (ret == CAMERA_OK) {
1062 muteModeStored_ = muteMode;
1063 }
1064 return ret;
1065 }
1066
1067 static std::map<PolicyType, Security::AccessToken::PolicyType> g_policyTypeMap_ = {
1068 {PolicyType::EDM, Security::AccessToken::PolicyType::EDM},
1069 {PolicyType::PRIVACY, Security::AccessToken::PolicyType::PRIVACY},
1070 };
1071
MuteCamera(bool muteMode)1072 int32_t HCameraService::MuteCamera(bool muteMode)
1073 {
1074 int32_t ret = CheckPermission(OHOS_PERMISSION_MANAGE_CAMERA_CONFIG, IPCSkeleton::GetCallingTokenID());
1075 CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK, ret, "CheckPermission argumentis failed!");
1076 CameraReportUtils::GetInstance().ReportUserBehavior(DFX_UB_MUTE_CAMERA,
1077 to_string(muteMode), CameraReportUtils::GetCallerInfo());
1078 return MuteCameraFunc(muteMode);
1079 }
1080
MuteCameraPersist(PolicyType policyType,bool isMute)1081 int32_t HCameraService::MuteCameraPersist(PolicyType policyType, bool isMute)
1082 {
1083 int32_t ret = CheckPermission(OHOS_PERMISSION_CAMERA_CONTROL, IPCSkeleton::GetCallingTokenID());
1084 CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK, ret, "CheckPermission arguments failed!");
1085 CameraReportUtils::GetInstance().ReportUserBehavior(DFX_UB_MUTE_CAMERA,
1086 to_string(isMute), CameraReportUtils::GetCallerInfo());
1087 CHECK_ERROR_RETURN_RET_LOG(g_policyTypeMap_.count(policyType) == 0, CAMERA_INVALID_ARG,
1088 "MuteCameraPersist Failed, invalid param policyType = %{public}d", static_cast<int32_t>(policyType));
1089 bool targetMuteMode = isMute;
1090 const Security::AccessToken::PolicyType secPolicyType = g_policyTypeMap_[policyType];
1091 const Security::AccessToken::CallerType secCaller = Security::AccessToken::CallerType::CAMERA;
1092 ret = Security::AccessToken::PrivacyKit::SetMutePolicy(secPolicyType, secCaller, isMute);
1093 if (ret != Security::AccessToken::RET_SUCCESS) {
1094 MEDIA_ERR_LOG("MuteCameraPersist SetMutePolicy return false, policyType = %{public}d, retCode = %{public}d",
1095 static_cast<int32_t>(policyType), static_cast<int32_t>(ret));
1096 targetMuteMode = muteModeStored_;
1097 }
1098 return MuteCameraFunc(targetMuteMode);
1099 }
1100
PrelaunchCamera()1101 int32_t HCameraService::PrelaunchCamera()
1102 {
1103 CAMERA_SYNC_TRACE;
1104 MEDIA_INFO_LOG("HCameraService::PrelaunchCamera");
1105 CHECK_ERROR_RETURN_RET_LOG(HCameraDeviceManager::GetInstance()->GetCameraStateOfASide().Size() != 0,
1106 CAMERA_DEVICE_CONFLICT, "HCameraService::PrelaunchCamera there is a device active in A side, abort!");
1107 if (preCameraId_.empty()) {
1108 vector<string> cameraIds_;
1109 cameraHostManager_->GetCameras(cameraIds_);
1110 if (cameraIds_.empty()) {
1111 return CAMERA_OK;
1112 }
1113 preCameraId_ = cameraIds_.front();
1114 }
1115 MEDIA_INFO_LOG("HCameraService::PrelaunchCamera preCameraId_ is: %{public}s", preCameraId_.c_str());
1116 CAMERA_SYSEVENT_STATISTIC(CreateMsg("Camera Prelaunch CameraId:%s", preCameraId_.c_str()));
1117 CameraReportUtils::GetInstance().SetOpenCamPerfPreInfo(preCameraId_.c_str(), CameraReportUtils::GetCallerInfo());
1118 int32_t ret = cameraHostManager_->Prelaunch(preCameraId_, preCameraClient_);
1119 CHECK_ERROR_PRINT_LOG(ret != CAMERA_OK, "HCameraService::Prelaunch failed");
1120 return ret;
1121 }
1122
PreSwitchCamera(const std::string cameraId)1123 int32_t HCameraService::PreSwitchCamera(const std::string cameraId)
1124 {
1125 CAMERA_SYNC_TRACE;
1126 MEDIA_INFO_LOG("HCameraService::PreSwitchCamera");
1127 if (cameraId.empty()) {
1128 return CAMERA_INVALID_ARG;
1129 }
1130 std::vector<std::string> cameraIds_;
1131 cameraHostManager_->GetCameras(cameraIds_);
1132 CHECK_AND_RETURN_RET(!cameraIds_.empty(), CAMERA_INVALID_STATE);
1133 auto it = std::find(cameraIds_.begin(), cameraIds_.end(), cameraId);
1134 CHECK_AND_RETURN_RET(it != cameraIds_.end(), CAMERA_INVALID_ARG);
1135 MEDIA_INFO_LOG("HCameraService::PreSwitchCamera cameraId is: %{public}s", cameraId.c_str());
1136 CameraReportUtils::GetInstance().SetSwitchCamPerfStartInfo(CameraReportUtils::GetCallerInfo());
1137 int32_t ret = cameraHostManager_->PreSwitchCamera(cameraId);
1138 CHECK_ERROR_PRINT_LOG(ret != CAMERA_OK, "HCameraService::Prelaunch failed");
1139 return ret;
1140 }
1141
SetPrelaunchConfig(string cameraId,RestoreParamTypeOhos restoreParamType,int activeTime,EffectParam effectParam)1142 int32_t HCameraService::SetPrelaunchConfig(string cameraId, RestoreParamTypeOhos restoreParamType, int activeTime,
1143 EffectParam effectParam)
1144 {
1145 CAMERA_SYNC_TRACE;
1146 OHOS::Security::AccessToken::AccessTokenID callerToken = IPCSkeleton::GetCallingTokenID();
1147 string permissionName = OHOS_PERMISSION_CAMERA;
1148 int32_t ret = CheckPermission(permissionName, callerToken);
1149 CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK, ret,
1150 "HCameraService::SetPrelaunchConfig failed permission is: %{public}s", permissionName.c_str());
1151
1152 MEDIA_INFO_LOG("HCameraService::SetPrelaunchConfig cameraId %{public}s", (cameraId).c_str());
1153 vector<string> cameraIds_;
1154 cameraHostManager_->GetCameras(cameraIds_);
1155 if ((find(cameraIds_.begin(), cameraIds_.end(), cameraId) != cameraIds_.end()) && IsPrelaunchSupported(cameraId)) {
1156 preCameraId_ = cameraId;
1157 MEDIA_INFO_LOG("CameraHostInfo::prelaunch 111 for cameraId %{public}s", (cameraId).c_str());
1158 sptr<HCaptureSession> captureSession_ = nullptr;
1159 pid_t pid = IPCSkeleton::GetCallingPid();
1160 captureSessionsManager_.Find(pid, captureSession_);
1161 SaveCurrentParamForRestore(cameraId, static_cast<RestoreParamTypeOhos>(restoreParamType), activeTime,
1162 effectParam, captureSession_);
1163 captureSessionsManager_.Clear();
1164 captureSessionsManager_.EnsureInsert(pid, captureSession_);
1165 } else {
1166 MEDIA_ERR_LOG("HCameraService::SetPrelaunchConfig illegal");
1167 ret = CAMERA_INVALID_ARG;
1168 }
1169 return ret;
1170 }
1171
SetTorchLevel(float level)1172 int32_t HCameraService::SetTorchLevel(float level)
1173 {
1174 int32_t ret = cameraHostManager_->SetTorchLevel(level);
1175 CHECK_ERROR_PRINT_LOG(ret != CAMERA_OK, "Failed to SetTorchLevel");
1176 return ret;
1177 }
1178
AllowOpenByOHSide(std::string cameraId,int32_t state,bool & canOpenCamera)1179 int32_t HCameraService::AllowOpenByOHSide(std::string cameraId, int32_t state, bool& canOpenCamera)
1180 {
1181 MEDIA_INFO_LOG("HCameraService::AllowOpenByOHSide start");
1182 pid_t activePid = HCameraDeviceManager::GetInstance()->GetActiveClient();
1183 if (activePid == -1) {
1184 MEDIA_INFO_LOG("AllowOpenByOHSide::Open allow open camera");
1185 NotifyCameraState(cameraId, 0);
1186 canOpenCamera = true;
1187 return CAMERA_OK;
1188 }
1189 sptr<HCameraDevice> cameraNeedEvict = HCameraDeviceManager::GetInstance()->GetCameraByPid(activePid);
1190 if (cameraNeedEvict != nullptr) {
1191 cameraNeedEvict->OnError(DEVICE_PREEMPT, 0);
1192 cameraNeedEvict->Close();
1193 NotifyCameraState(cameraId, 0);
1194 canOpenCamera = true;
1195 }
1196 MEDIA_INFO_LOG("HCameraService::AllowOpenByOHSide end");
1197 return CAMERA_OK;
1198 }
1199
NotifyCameraState(std::string cameraId,int32_t state)1200 int32_t HCameraService::NotifyCameraState(std::string cameraId, int32_t state)
1201 {
1202 // 把cameraId和前后台状态刷新给device manager
1203 MEDIA_INFO_LOG(
1204 "HCameraService::NotifyCameraState SetStateOfACamera %{public}s:%{public}d", cameraId.c_str(), state);
1205 HCameraDeviceManager::GetInstance()->SetStateOfACamera(cameraId, state);
1206 return CAMERA_OK;
1207 }
1208
SetPeerCallback(sptr<ICameraBroker> & callback)1209 int32_t HCameraService::SetPeerCallback(sptr<ICameraBroker>& callback)
1210 {
1211 MEDIA_INFO_LOG("SetPeerCallback get callback");
1212 CHECK_ERROR_RETURN_RET(callback == nullptr, CAMERA_INVALID_ARG);
1213 peerCallback_ = callback;
1214 MEDIA_INFO_LOG("HCameraService::SetPeerCallback current muteMode:%{public}d", muteModeStored_);
1215 callback->NotifyMuteCamera(muteModeStored_);
1216 HCameraDeviceManager::GetInstance()->SetPeerCallback(callback);
1217 return CAMERA_OK;
1218 }
1219
UnsetPeerCallback()1220 int32_t HCameraService::UnsetPeerCallback()
1221 {
1222 MEDIA_INFO_LOG("UnsetPeerCallback callback");
1223 peerCallback_ = nullptr;
1224 HCameraDeviceManager::GetInstance()->UnsetPeerCallback();
1225 return CAMERA_OK;
1226 }
1227
IsPrelaunchSupported(string cameraId)1228 bool HCameraService::IsPrelaunchSupported(string cameraId)
1229 {
1230 bool isPrelaunchSupported = false;
1231 shared_ptr<OHOS::Camera::CameraMetadata> cameraAbility;
1232 int32_t ret = cameraHostManager_->GetCameraAbility(cameraId, cameraAbility);
1233 CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK, isPrelaunchSupported,
1234 "HCameraService::IsCameraMuted GetCameraAbility failed");
1235 camera_metadata_item_t item;
1236 common_metadata_header_t* metadata = cameraAbility->get();
1237 ret = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_ABILITY_PRELAUNCH_AVAILABLE, &item);
1238 if (ret == 0) {
1239 MEDIA_INFO_LOG(
1240 "CameraManager::IsPrelaunchSupported() OHOS_ABILITY_PRELAUNCH_AVAILABLE is %{public}d", item.data.u8[0]);
1241 isPrelaunchSupported = (item.data.u8[0] == 1);
1242 } else {
1243 MEDIA_ERR_LOG("Failed to get OHOS_ABILITY_PRELAUNCH_AVAILABLE ret = %{public}d", ret);
1244 }
1245 return isPrelaunchSupported;
1246 }
1247
GetServiceStatus()1248 CameraServiceStatus HCameraService::GetServiceStatus()
1249 {
1250 lock_guard<mutex> lock(serviceStatusMutex_);
1251 return serviceStatus_;
1252 }
1253
SetServiceStatus(CameraServiceStatus serviceStatus)1254 void HCameraService::SetServiceStatus(CameraServiceStatus serviceStatus)
1255 {
1256 lock_guard<mutex> lock(serviceStatusMutex_);
1257 serviceStatus_ = serviceStatus;
1258 MEDIA_DEBUG_LOG("HCameraService::SetServiceStatus success. serviceStatus: %{public}d", serviceStatus);
1259 }
1260
IsCameraMuted(bool & muteMode)1261 int32_t HCameraService::IsCameraMuted(bool& muteMode)
1262 {
1263 lock_guard<mutex> lock(g_dataShareHelperMutex);
1264 CHECK_ERROR_RETURN_RET(GetServiceStatus() != CameraServiceStatus::SERVICE_READY, CAMERA_INVALID_STATE);
1265 muteMode = muteModeStored_;
1266
1267 MEDIA_DEBUG_LOG("HCameraService::IsCameraMuted success. isMuted: %{public}d", muteMode);
1268 return CAMERA_OK;
1269 }
1270
DumpCameraSummary(vector<string> cameraIds,CameraInfoDumper & infoDumper)1271 void HCameraService::DumpCameraSummary(vector<string> cameraIds, CameraInfoDumper& infoDumper)
1272 {
1273 infoDumper.Tip("--------Dump Summary Begin-------");
1274 infoDumper.Title("Number of Cameras:[" + to_string(cameraIds.size()) + "]");
1275 infoDumper.Title("Number of Active Cameras:[" + to_string(1) + "]");
1276 infoDumper.Title("Current session summary:");
1277 HCaptureSession::DumpCameraSessionSummary(infoDumper);
1278 }
1279
DumpCameraInfo(CameraInfoDumper & infoDumper,std::vector<std::string> & cameraIds,std::vector<std::shared_ptr<OHOS::Camera::CameraMetadata>> & cameraAbilityList)1280 void HCameraService::DumpCameraInfo(CameraInfoDumper& infoDumper, std::vector<std::string>& cameraIds,
1281 std::vector<std::shared_ptr<OHOS::Camera::CameraMetadata>>& cameraAbilityList)
1282 {
1283 infoDumper.Tip("--------Dump CameraDevice Begin-------");
1284 int32_t capIdx = 0;
1285 for (auto& it : cameraIds) {
1286 auto metadata = cameraAbilityList[capIdx++];
1287 common_metadata_header_t* metadataEntry = metadata->get();
1288 infoDumper.Title("Camera ID:[" + it + "]:");
1289 infoDumper.Push();
1290 DumpCameraAbility(metadataEntry, infoDumper);
1291 DumpCameraStreamInfo(metadataEntry, infoDumper);
1292 DumpCameraZoom(metadataEntry, infoDumper);
1293 DumpCameraFlash(metadataEntry, infoDumper);
1294 DumpCameraAF(metadataEntry, infoDumper);
1295 DumpCameraAE(metadataEntry, infoDumper);
1296 DumpCameraSensorInfo(metadataEntry, infoDumper);
1297 DumpCameraVideoStabilization(metadataEntry, infoDumper);
1298 DumpCameraVideoFrameRateRange(metadataEntry, infoDumper);
1299 DumpCameraPrelaunch(metadataEntry, infoDumper);
1300 DumpCameraThumbnail(metadataEntry, infoDumper);
1301 infoDumper.Pop();
1302 }
1303 }
1304
DumpCameraAbility(common_metadata_header_t * metadataEntry,CameraInfoDumper & infoDumper)1305 void HCameraService::DumpCameraAbility(common_metadata_header_t* metadataEntry, CameraInfoDumper& infoDumper)
1306 {
1307 camera_metadata_item_t item;
1308 int ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_CAMERA_POSITION, &item);
1309 if (ret == CAM_META_SUCCESS) {
1310 map<int, string>::const_iterator iter = g_cameraPos.find(item.data.u8[0]);
1311 if (iter != g_cameraPos.end()) {
1312 infoDumper.Title("Camera Position:[" + iter->second + "]");
1313 }
1314 }
1315
1316 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_CAMERA_TYPE, &item);
1317 if (ret == CAM_META_SUCCESS) {
1318 map<int, string>::const_iterator iter = g_cameraType.find(item.data.u8[0]);
1319 if (iter != g_cameraType.end()) {
1320 infoDumper.Title("Camera Type:[" + iter->second + "]");
1321 }
1322 }
1323
1324 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_CAMERA_CONNECTION_TYPE, &item);
1325 if (ret == CAM_META_SUCCESS) {
1326 map<int, string>::const_iterator iter = g_cameraConType.find(item.data.u8[0]);
1327 if (iter != g_cameraConType.end()) {
1328 infoDumper.Title("Camera Connection Type:[" + iter->second + "]");
1329 }
1330 }
1331 }
1332
DumpCameraStreamInfo(common_metadata_header_t * metadataEntry,CameraInfoDumper & infoDumper)1333 void HCameraService::DumpCameraStreamInfo(common_metadata_header_t* metadataEntry, CameraInfoDumper& infoDumper)
1334 {
1335 camera_metadata_item_t item;
1336 int ret;
1337 constexpr uint32_t unitLen = 3;
1338 uint32_t widthOffset = 1;
1339 uint32_t heightOffset = 2;
1340 infoDumper.Title("Camera Available stream configuration List:");
1341 infoDumper.Push();
1342 ret =
1343 OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_STREAM_AVAILABLE_BASIC_CONFIGURATIONS, &item);
1344 if (ret == CAM_META_SUCCESS) {
1345 infoDumper.Title("Basic Stream Info Size: " + to_string(item.count / unitLen));
1346 for (uint32_t index = 0; index < item.count; index += unitLen) {
1347 map<int, string>::const_iterator iter = g_cameraFormat.find(item.data.i32[index]);
1348 if (iter != g_cameraFormat.end()) {
1349 infoDumper.Msg("Format:[" + iter->second + "] " +
1350 "Size:[Width:" + to_string(item.data.i32[index + widthOffset]) +
1351 " Height:" + to_string(item.data.i32[index + heightOffset]) + "]");
1352 } else {
1353 infoDumper.Msg("Format:[" + to_string(item.data.i32[index]) + "] " +
1354 "Size:[Width:" + to_string(item.data.i32[index + widthOffset]) +
1355 " Height:" + to_string(item.data.i32[index + heightOffset]) + "]");
1356 }
1357 }
1358 }
1359
1360 infoDumper.Pop();
1361 }
1362
DumpCameraZoom(common_metadata_header_t * metadataEntry,CameraInfoDumper & infoDumper)1363 void HCameraService::DumpCameraZoom(common_metadata_header_t* metadataEntry, CameraInfoDumper& infoDumper)
1364 {
1365 camera_metadata_item_t item;
1366 int ret;
1367 int32_t minIndex = 0;
1368 int32_t maxIndex = 1;
1369 uint32_t zoomRangeCount = 2;
1370 infoDumper.Title("Zoom Related Info:");
1371
1372 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_ZOOM_CAP, &item);
1373 if (ret == CAM_META_SUCCESS) {
1374 infoDumper.Msg("OHOS_ABILITY_ZOOM_CAP data size:" + to_string(item.count));
1375 if (item.count == zoomRangeCount) {
1376 infoDumper.Msg("Available Zoom Capability:[" + to_string(item.data.i32[minIndex]) + " " +
1377 to_string(item.data.i32[maxIndex]) + "]");
1378 }
1379 }
1380
1381 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_SCENE_ZOOM_CAP, &item);
1382 if (ret == CAM_META_SUCCESS) {
1383 infoDumper.Msg("OHOS_ABILITY_SCENE_ZOOM_CAP data size:" + to_string(item.count));
1384 if (item.count == zoomRangeCount) {
1385 infoDumper.Msg("Available scene Zoom Capability:[" + to_string(item.data.i32[minIndex]) + " " +
1386 to_string(item.data.i32[maxIndex]) + "]");
1387 }
1388 }
1389
1390 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_ZOOM_RATIO_RANGE, &item);
1391 if (ret == CAM_META_SUCCESS) {
1392 infoDumper.Msg("OHOS_ABILITY_ZOOM_RATIO_RANGE data size:" + to_string(item.count));
1393 if (item.count == zoomRangeCount) {
1394 infoDumper.Msg("Available Zoom Ratio Range:[" + to_string(item.data.f[minIndex]) +
1395 to_string(item.data.f[maxIndex]) + "]");
1396 }
1397 }
1398 }
1399
DumpCameraFlash(common_metadata_header_t * metadataEntry,CameraInfoDumper & infoDumper)1400 void HCameraService::DumpCameraFlash(common_metadata_header_t* metadataEntry, CameraInfoDumper& infoDumper)
1401 {
1402 camera_metadata_item_t item;
1403 int ret;
1404 infoDumper.Title("Flash Related Info:");
1405 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_FLASH_MODES, &item);
1406 if (ret == CAM_META_SUCCESS) {
1407 string flashAbilityString = "Available Flash Modes:[ ";
1408 for (uint32_t i = 0; i < item.count; i++) {
1409 map<int, string>::const_iterator iter = g_cameraFlashMode.find(item.data.u8[i]);
1410 if (iter != g_cameraFlashMode.end()) {
1411 flashAbilityString.append(iter->second + " ");
1412 }
1413 }
1414 flashAbilityString.append("]");
1415 infoDumper.Msg(flashAbilityString);
1416 }
1417 }
1418
DumpCameraAF(common_metadata_header_t * metadataEntry,CameraInfoDumper & infoDumper)1419 void HCameraService::DumpCameraAF(common_metadata_header_t* metadataEntry, CameraInfoDumper& infoDumper)
1420 {
1421 camera_metadata_item_t item;
1422 int ret;
1423 infoDumper.Title("AF Related Info:");
1424 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_FOCUS_MODES, &item);
1425 if (ret == CAM_META_SUCCESS) {
1426 string afAbilityString = "Available Focus Modes:[ ";
1427 for (uint32_t i = 0; i < item.count; i++) {
1428 map<int, string>::const_iterator iter = g_cameraFocusMode.find(item.data.u8[i]);
1429 if (iter != g_cameraFocusMode.end()) {
1430 afAbilityString.append(iter->second + " ");
1431 }
1432 }
1433 afAbilityString.append("]");
1434 infoDumper.Msg(afAbilityString);
1435 }
1436 }
1437
DumpCameraAE(common_metadata_header_t * metadataEntry,CameraInfoDumper & infoDumper)1438 void HCameraService::DumpCameraAE(common_metadata_header_t* metadataEntry, CameraInfoDumper& infoDumper)
1439 {
1440 camera_metadata_item_t item;
1441 int ret;
1442 infoDumper.Title("AE Related Info:");
1443 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_EXPOSURE_MODES, &item);
1444 if (ret == CAM_META_SUCCESS) {
1445 string aeAbilityString = "Available Exposure Modes:[ ";
1446 for (uint32_t i = 0; i < item.count; i++) {
1447 map<int, string>::const_iterator iter = g_cameraExposureMode.find(item.data.u8[i]);
1448 if (iter != g_cameraExposureMode.end()) {
1449 aeAbilityString.append(iter->second + " ");
1450 }
1451 }
1452 aeAbilityString.append("]");
1453 infoDumper.Msg(aeAbilityString);
1454 }
1455 }
1456
DumpCameraSensorInfo(common_metadata_header_t * metadataEntry,CameraInfoDumper & infoDumper)1457 void HCameraService::DumpCameraSensorInfo(common_metadata_header_t* metadataEntry, CameraInfoDumper& infoDumper)
1458 {
1459 camera_metadata_item_t item;
1460 int ret;
1461 int32_t leftIndex = 0;
1462 int32_t topIndex = 1;
1463 int32_t rightIndex = 2;
1464 int32_t bottomIndex = 3;
1465 infoDumper.Title("Sensor Related Info:");
1466 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_SENSOR_INFO_ACTIVE_ARRAY_SIZE, &item);
1467 if (ret == CAM_META_SUCCESS) {
1468 infoDumper.Msg("Array:[" +
1469 to_string(item.data.i32[leftIndex]) + " " +
1470 to_string(item.data.i32[topIndex]) + " " +
1471 to_string(item.data.i32[rightIndex]) + " " +
1472 to_string(item.data.i32[bottomIndex]) + "]:\n");
1473 }
1474 }
1475
DumpCameraVideoStabilization(common_metadata_header_t * metadataEntry,CameraInfoDumper & infoDumper)1476 void HCameraService::DumpCameraVideoStabilization(common_metadata_header_t* metadataEntry, CameraInfoDumper& infoDumper)
1477 {
1478 camera_metadata_item_t item;
1479 int ret;
1480 infoDumper.Title("Video Stabilization Related Info:");
1481 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_VIDEO_STABILIZATION_MODES, &item);
1482 if (ret == CAM_META_SUCCESS) {
1483 std::string infoString = "Available Video Stabilization Modes:[ ";
1484 for (uint32_t i = 0; i < item.count; i++) {
1485 map<int, string>::const_iterator iter = g_cameraVideoStabilizationMode.find(item.data.u8[i]);
1486 if (iter != g_cameraVideoStabilizationMode.end()) {
1487 infoString.append(iter->second + " ");
1488 }
1489 }
1490 infoString.append("]:");
1491 infoDumper.Msg(infoString);
1492 }
1493 }
1494
DumpCameraVideoFrameRateRange(common_metadata_header_t * metadataEntry,CameraInfoDumper & infoDumper)1495 void HCameraService::DumpCameraVideoFrameRateRange(
1496 common_metadata_header_t* metadataEntry, CameraInfoDumper& infoDumper)
1497 {
1498 camera_metadata_item_t item;
1499 const int32_t FRAME_RATE_RANGE_STEP = 2;
1500 int ret;
1501 infoDumper.Title("Video FrameRateRange Related Info:");
1502 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_FPS_RANGES, &item);
1503 if (ret == CAM_META_SUCCESS && item.count > 0) {
1504 infoDumper.Msg("Available FrameRateRange:");
1505 for (uint32_t i = 0; i < (item.count - 1); i += FRAME_RATE_RANGE_STEP) {
1506 infoDumper.Msg("[ " + to_string(item.data.i32[i]) + ", " + to_string(item.data.i32[i + 1]) + " ]");
1507 }
1508 }
1509 }
1510
DumpCameraPrelaunch(common_metadata_header_t * metadataEntry,CameraInfoDumper & infoDumper)1511 void HCameraService::DumpCameraPrelaunch(common_metadata_header_t* metadataEntry, CameraInfoDumper& infoDumper)
1512 {
1513 camera_metadata_item_t item;
1514 int ret;
1515 infoDumper.Title("Camera Prelaunch Related Info:");
1516 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_PRELAUNCH_AVAILABLE, &item);
1517 if (ret == CAM_META_SUCCESS) {
1518 map<int, string>::const_iterator iter = g_cameraPrelaunchAvailable.find(item.data.u8[0]);
1519 bool isSupport = false;
1520 if (iter != g_cameraPrelaunchAvailable.end()) {
1521 isSupport = true;
1522 }
1523 std::string infoString = "Available Prelaunch Info:[";
1524 infoString.append(isSupport ? "True" : "False");
1525 infoString.append("]");
1526 infoDumper.Msg(infoString);
1527 }
1528 }
1529
DumpCameraThumbnail(common_metadata_header_t * metadataEntry,CameraInfoDumper & infoDumper)1530 void HCameraService::DumpCameraThumbnail(common_metadata_header_t* metadataEntry, CameraInfoDumper& infoDumper)
1531 {
1532 camera_metadata_item_t item;
1533 int ret;
1534 infoDumper.Title("Camera Thumbnail Related Info:");
1535 ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_STREAM_QUICK_THUMBNAIL_AVAILABLE, &item);
1536 if (ret == CAM_META_SUCCESS) {
1537 map<int, string>::const_iterator iter = g_cameraQuickThumbnailAvailable.find(item.data.u8[0]);
1538 bool isSupport = false;
1539 if (iter != g_cameraQuickThumbnailAvailable.end()) {
1540 isSupport = true;
1541 }
1542 std::string infoString = "Available Thumbnail Info:[";
1543 infoString.append(isSupport ? "True" : "False");
1544 infoString.append("]");
1545 infoDumper.Msg(infoString);
1546 }
1547 }
1548
Dump(int fd,const vector<u16string> & args)1549 int32_t HCameraService::Dump(int fd, const vector<u16string>& args)
1550 {
1551 unordered_set<u16string> argSets;
1552 for (decltype(args.size()) index = 0; index < args.size(); ++index) {
1553 argSets.insert(args[index]);
1554 }
1555 std::string dumpString;
1556 std::vector<std::string> cameraIds;
1557 std::vector<std::shared_ptr<OHOS::Camera::CameraMetadata>> cameraAbilityList;
1558 int ret = GetCameras(cameraIds, cameraAbilityList);
1559 CHECK_ERROR_RETURN_RET((ret != CAMERA_OK) || cameraIds.empty() || cameraAbilityList.empty(), OHOS::UNKNOWN_ERROR);
1560 CameraInfoDumper infoDumper(fd);
1561 if (args.empty() || argSets.count(u16string(u"summary"))) {
1562 DumpCameraSummary(cameraIds, infoDumper);
1563 }
1564 if (args.empty() || argSets.count(u16string(u"ability"))) {
1565 DumpCameraInfo(infoDumper, cameraIds, cameraAbilityList);
1566 }
1567 if (args.empty() || argSets.count(u16string(u"preconfig"))) {
1568 infoDumper.Tip("--------Dump PreconfigInfo Begin-------");
1569 DumpPreconfigInfo(infoDumper, cameraHostManager_);
1570 }
1571 if (args.empty() || argSets.count(u16string(u"clientwiseinfo"))) {
1572 infoDumper.Tip("--------Dump Clientwise Info Begin-------");
1573 HCaptureSession::DumpSessions(infoDumper);
1574 }
1575 if (argSets.count(std::u16string(u"debugOn"))) {
1576 SetCameraDebugValue(true);
1577 }
1578 infoDumper.Print();
1579 return OHOS::NO_ERROR;
1580 }
1581
1582 #ifdef CAMERA_USE_SENSOR
RegisterSensorCallback()1583 void HCameraService::RegisterSensorCallback()
1584 {
1585 if (isRegisterSensorSuccess) {
1586 MEDIA_INFO_LOG("HCameraService::RegisterSensorCallback isRegisterSensorSuccess return");
1587 return;
1588 }
1589 MEDIA_INFO_LOG("HCameraService::RegisterSensorCallback start");
1590 user.callback = DropDetectionDataCallbackImpl;
1591 int32_t subscribeRet = SubscribeSensor(SENSOR_TYPE_ID_DROP_DETECTION, &user);
1592 MEDIA_INFO_LOG("RegisterSensorCallback, subscribeRet: %{public}d", subscribeRet);
1593 int32_t setBatchRet = SetBatch(SENSOR_TYPE_ID_DROP_DETECTION, &user, POSTURE_INTERVAL, POSTURE_INTERVAL);
1594 MEDIA_INFO_LOG("RegisterSensorCallback, setBatchRet: %{public}d", setBatchRet);
1595 int32_t activateRet = ActivateSensor(SENSOR_TYPE_ID_DROP_DETECTION, &user);
1596 MEDIA_INFO_LOG("RegisterSensorCallback, activateRet: %{public}d", activateRet);
1597 if (subscribeRet != SENSOR_SUCCESS || setBatchRet != SENSOR_SUCCESS || activateRet != SENSOR_SUCCESS) {
1598 isRegisterSensorSuccess = false;
1599 MEDIA_INFO_LOG("RegisterSensorCallback failed.");
1600 } else {
1601 isRegisterSensorSuccess = true;
1602 }
1603 }
1604
UnRegisterSensorCallback()1605 void HCameraService::UnRegisterSensorCallback()
1606 {
1607 int32_t deactivateRet = DeactivateSensor(SENSOR_TYPE_ID_DROP_DETECTION, &user);
1608 int32_t unsubscribeRet = UnsubscribeSensor(SENSOR_TYPE_ID_DROP_DETECTION, &user);
1609 if (deactivateRet == SENSOR_SUCCESS && unsubscribeRet == SENSOR_SUCCESS) {
1610 MEDIA_INFO_LOG("HCameraService.UnRegisterSensorCallback success.");
1611 }
1612 }
1613
DropDetectionDataCallbackImpl(SensorEvent * event)1614 void HCameraService::DropDetectionDataCallbackImpl(SensorEvent* event)
1615 {
1616 MEDIA_INFO_LOG("HCameraService::DropDetectionDataCallbackImpl prepare execute");
1617 CHECK_ERROR_RETURN_LOG(event == nullptr, "SensorEvent is nullptr.");
1618 CHECK_ERROR_RETURN_LOG(event[0].data == nullptr, "SensorEvent[0].data is nullptr.");
1619 CHECK_ERROR_RETURN_LOG(event[0].dataLen < sizeof(DropDetectionData),
1620 "less than drop detection data size, event.dataLen:%{public}u", event[0].dataLen);
1621 {
1622 std::lock_guard<std::mutex> lock(g_cameraServiceInstanceMutex);
1623 g_cameraServiceInstance->cameraHostManager_->NotifyDeviceStateChangeInfo(
1624 DeviceType::FALLING_TYPE, FallingState::FALLING_STATE);
1625 }
1626 }
1627 #endif
1628
SaveCurrentParamForRestore(std::string cameraId,RestoreParamTypeOhos restoreParamType,int activeTime,EffectParam effectParam,sptr<HCaptureSession> captureSession)1629 int32_t HCameraService::SaveCurrentParamForRestore(std::string cameraId, RestoreParamTypeOhos restoreParamType,
1630 int activeTime, EffectParam effectParam, sptr<HCaptureSession> captureSession)
1631 {
1632 MEDIA_INFO_LOG("HCameraService::SaveCurrentParamForRestore enter");
1633 int32_t rc = CAMERA_OK;
1634 preCameraClient_ = GetClientBundle(IPCSkeleton::GetCallingUid());
1635 sptr<HCameraRestoreParam> cameraRestoreParam = new HCameraRestoreParam(
1636 preCameraClient_, cameraId);
1637 cameraRestoreParam->SetRestoreParamType(restoreParamType);
1638 cameraRestoreParam->SetStartActiveTime(activeTime);
1639 int foldStatus = static_cast<int>(OHOS::Rosen::DisplayManager::GetInstance().GetFoldStatus());
1640 cameraRestoreParam->SetFoldStatus(foldStatus);
1641 if (captureSession == nullptr || restoreParamType == NO_NEED_RESTORE_PARAM_OHOS) {
1642 cameraHostManager_->SaveRestoreParam(cameraRestoreParam);
1643 return rc;
1644 }
1645
1646 sptr<HCameraDeviceManager> deviceManager = HCameraDeviceManager::GetInstance();
1647 pid_t activeClient = deviceManager->GetActiveClient();
1648 CHECK_ERROR_RETURN_RET_LOG(activeClient == -1, CAMERA_OPERATION_NOT_ALLOWED,
1649 "HCaptureSession::SaveCurrentParamForRestore() Failed to save param");
1650 sptr<HCameraDevice> activeDevice = deviceManager->GetCameraByPid(activeClient);
1651 CHECK_AND_RETURN_RET(activeDevice != nullptr, CAMERA_OK);
1652 std::vector<StreamInfo_V1_1> allStreamInfos;
1653
1654 if (activeDevice != nullptr) {
1655 std::shared_ptr<OHOS::Camera::CameraMetadata> defaultSettings = CreateDefaultSettingForRestore(activeDevice);
1656 UpdateSkinSmoothSetting(defaultSettings, effectParam.skinSmoothLevel);
1657 UpdateFaceSlenderSetting(defaultSettings, effectParam.faceSlender);
1658 UpdateSkinToneSetting(defaultSettings, effectParam.skinTone);
1659 cameraRestoreParam->SetSetting(defaultSettings);
1660 }
1661 CHECK_AND_RETURN_RET(activeDevice != nullptr, CAMERA_UNKNOWN_ERROR);
1662 MEDIA_DEBUG_LOG("HCameraService::SaveCurrentParamForRestore param %{public}d", effectParam.skinSmoothLevel);
1663 rc = captureSession->GetCurrentStreamInfos(allStreamInfos);
1664 CHECK_ERROR_RETURN_RET_LOG(rc != CAMERA_OK, rc,
1665 "HCaptureSession::SaveCurrentParamForRestore() Failed to get streams info, %{public}d", rc);
1666 for (auto& info : allStreamInfos) {
1667 MEDIA_INFO_LOG("HCameraService::SaveCurrentParamForRestore: streamId is:%{public}d", info.v1_0.streamId_);
1668 }
1669 cameraRestoreParam->SetStreamInfo(allStreamInfos);
1670 cameraRestoreParam->SetCameraOpMode(captureSession->GetopMode());
1671 cameraHostManager_->SaveRestoreParam(cameraRestoreParam);
1672 MEDIA_INFO_LOG("HCameraService::SaveCurrentParamForRestore end");
1673 return rc;
1674 }
1675
CreateDefaultSettingForRestore(sptr<HCameraDevice> activeDevice)1676 std::shared_ptr<OHOS::Camera::CameraMetadata> HCameraService::CreateDefaultSettingForRestore(
1677 sptr<HCameraDevice> activeDevice)
1678 {
1679 constexpr int32_t DEFAULT_ITEMS = 1;
1680 constexpr int32_t DEFAULT_DATA_LENGTH = 1;
1681 auto defaultSettings = std::make_shared<OHOS::Camera::CameraMetadata>(DEFAULT_ITEMS, DEFAULT_DATA_LENGTH);
1682 float zoomRatio = 1.0f;
1683 int32_t count = 1;
1684 int32_t ret = 0;
1685 camera_metadata_item_t item;
1686 defaultSettings->addEntry(OHOS_CONTROL_ZOOM_RATIO, &zoomRatio, count);
1687 defaultSettings->addEntry(OHOS_CONTROL_TIME_LAPSE_RECORD_STATE, &ret, count);
1688 std::shared_ptr<OHOS::Camera::CameraMetadata> currentSetting = activeDevice->CloneCachedSettings();
1689 CHECK_ERROR_RETURN_RET_LOG(currentSetting == nullptr, defaultSettings,
1690 "HCameraService::CreateDefaultSettingForRestore:currentSetting is null");
1691 ret = OHOS::Camera::FindCameraMetadataItem(currentSetting->get(), OHOS_CONTROL_FPS_RANGES, &item);
1692 if (ret == CAM_META_SUCCESS) {
1693 uint32_t fpscount = item.count;
1694 std::vector<int32_t> fpsRange;
1695 for (uint32_t i = 0; i < fpscount; i++) {
1696 fpsRange.push_back(*(item.data.i32 + i));
1697 }
1698 defaultSettings->addEntry(OHOS_CONTROL_FPS_RANGES, fpsRange.data(), fpscount);
1699 }
1700 ret = OHOS::Camera::FindCameraMetadataItem(currentSetting->get(), OHOS_CONTROL_VIDEO_STABILIZATION_MODE, &item);
1701 if (ret == CAM_META_SUCCESS) {
1702 uint8_t stabilizationMode_ = item.data.u8[0];
1703 defaultSettings->addEntry(OHOS_CONTROL_VIDEO_STABILIZATION_MODE, &stabilizationMode_, count);
1704 }
1705
1706 ret = OHOS::Camera::FindCameraMetadataItem(currentSetting->get(), OHOS_CONTROL_DEFERRED_IMAGE_DELIVERY, &item);
1707 if (ret == CAM_META_SUCCESS) {
1708 uint8_t deferredType = item.data.u8[0];
1709 defaultSettings->addEntry(OHOS_CONTROL_DEFERRED_IMAGE_DELIVERY, &deferredType, count);
1710 }
1711
1712 ret = OHOS::Camera::FindCameraMetadataItem(currentSetting->get(), OHOS_CONTROL_SUPPORTED_COLOR_MODES, &item);
1713 if (ret == CAM_META_SUCCESS) {
1714 uint8_t colorEffectTemp = item.data.u8[0];
1715 defaultSettings->addEntry(OHOS_CONTROL_SUPPORTED_COLOR_MODES, &colorEffectTemp, count);
1716 }
1717
1718 ret = OHOS::Camera::FindCameraMetadataItem(currentSetting->get(), OHOS_CONTROL_PORTRAIT_EFFECT_TYPE, &item);
1719 if (ret == CAM_META_SUCCESS) {
1720 uint8_t effect = item.data.u8[0];
1721 defaultSettings->addEntry(OHOS_CONTROL_PORTRAIT_EFFECT_TYPE, &effect, count);
1722 }
1723 ret = OHOS::Camera::FindCameraMetadataItem(currentSetting->get(), OHOS_CONTROL_FILTER_TYPE, &item);
1724 if (ret == CAM_META_SUCCESS) {
1725 uint8_t filterValue = item.data.u8[0];
1726 defaultSettings->addEntry(OHOS_CONTROL_FILTER_TYPE, &filterValue, count);
1727 }
1728
1729 ret = OHOS::Camera::FindCameraMetadataItem(currentSetting->get(), OHOS_CONTROL_EFFECT_SUGGESTION, &item);
1730 if (ret == CAM_META_SUCCESS) {
1731 uint8_t enableValue = item.data.u8[0];
1732 defaultSettings->addEntry(OHOS_CONTROL_EFFECT_SUGGESTION, &enableValue, count);
1733 }
1734
1735 ret = OHOS::Camera::FindCameraMetadataItem(currentSetting->get(), OHOS_CONTROL_MOTION_DETECTION, &item);
1736 if (ret == CAM_META_SUCCESS) {
1737 uint8_t enableValue = item.data.u8[0];
1738 defaultSettings->addEntry(OHOS_CONTROL_MOTION_DETECTION, &enableValue, count);
1739 }
1740
1741 ret = OHOS::Camera::FindCameraMetadataItem(currentSetting->get(), OHOS_CONTROL_HIGH_QUALITY_MODE, &item);
1742 if (ret == CAM_META_SUCCESS) {
1743 uint8_t enableValue = item.data.u8[0];
1744 defaultSettings->addEntry(OHOS_CONTROL_HIGH_QUALITY_MODE, &enableValue, count);
1745 }
1746
1747 ret = OHOS::Camera::FindCameraMetadataItem(currentSetting->get(), OHOS_CAMERA_USER_ID, &item);
1748 if (ret == CAM_META_SUCCESS) {
1749 int32_t enableValue = item.data.i32[0];
1750 defaultSettings->addEntry(OHOS_CAMERA_USER_ID, &enableValue, count);
1751 }
1752
1753 ret = OHOS::Camera::FindCameraMetadataItem(currentSetting->get(), OHOS_CONTROL_MOVING_PHOTO, &item);
1754 if (ret == CAM_META_SUCCESS) {
1755 uint8_t enableValue = item.data.u8[0];
1756 defaultSettings->addEntry(OHOS_CONTROL_MOVING_PHOTO, &enableValue, count);
1757 }
1758
1759 ret = OHOS::Camera::FindCameraMetadataItem(currentSetting->get(), OHOS_CONTROL_AUTO_CLOUD_IMAGE_ENHANCE, &item);
1760 if (ret == CAM_META_SUCCESS) {
1761 uint8_t filterValue = item.data.u8[0];
1762 defaultSettings->addEntry(OHOS_CONTROL_AUTO_CLOUD_IMAGE_ENHANCE, &filterValue, count);
1763 }
1764
1765 ret = OHOS::Camera::FindCameraMetadataItem(currentSetting->get(), OHOS_CONTROL_BEAUTY_AUTO_VALUE, &item);
1766 if (ret == CAM_META_SUCCESS) {
1767 uint8_t enableValue = item.data.u8[0];
1768 defaultSettings->addEntry(OHOS_CONTROL_BEAUTY_AUTO_VALUE, &enableValue, count);
1769 }
1770
1771 ret = OHOS::Camera::FindCameraMetadataItem(currentSetting->get(), OHOS_CONTROL_CAMERA_USED_AS_POSITION, &item);
1772 if (ret == CAM_META_SUCCESS) {
1773 uint8_t enableValue = item.data.u8[0];
1774 defaultSettings->addEntry(OHOS_CONTROL_CAMERA_USED_AS_POSITION, &enableValue, count);
1775 }
1776 uint8_t enableValue = true;
1777 defaultSettings->addEntry(OHOS_CONTROL_VIDEO_DEBUG_SWITCH, &enableValue, 1);
1778 return defaultSettings;
1779 }
1780
UpdateSkinSmoothSetting(std::shared_ptr<OHOS::Camera::CameraMetadata> changedMetadata,int skinSmoothValue)1781 int32_t HCameraService::UpdateSkinSmoothSetting(std::shared_ptr<OHOS::Camera::CameraMetadata> changedMetadata,
1782 int skinSmoothValue)
1783 {
1784 if (skinSmoothValue <= 0 || changedMetadata == nullptr) {
1785 return CAMERA_OK;
1786 }
1787 bool status = false;
1788 int32_t count = 1;
1789 int ret;
1790 camera_metadata_item_t item;
1791
1792 MEDIA_DEBUG_LOG("UpdateBeautySetting skinsmooth: %{public}d", skinSmoothValue);
1793 uint8_t beauty = OHOS_CAMERA_BEAUTY_TYPE_SKIN_SMOOTH;
1794 ret = OHOS::Camera::FindCameraMetadataItem(changedMetadata->get(), OHOS_CONTROL_BEAUTY_TYPE, &item);
1795 if (ret == CAM_META_ITEM_NOT_FOUND) {
1796 status = changedMetadata->addEntry(OHOS_CONTROL_BEAUTY_TYPE, &beauty, count);
1797 } else if (ret == CAM_META_SUCCESS) {
1798 status = changedMetadata->updateEntry(OHOS_CONTROL_BEAUTY_TYPE, &beauty, count);
1799 }
1800
1801 ret = OHOS::Camera::FindCameraMetadataItem(changedMetadata->get(), OHOS_CONTROL_BEAUTY_SKIN_SMOOTH_VALUE, &item);
1802 if (ret == CAM_META_ITEM_NOT_FOUND) {
1803 status = changedMetadata->addEntry(OHOS_CONTROL_BEAUTY_SKIN_SMOOTH_VALUE, &skinSmoothValue, count);
1804 } else if (ret == CAM_META_SUCCESS) {
1805 status = changedMetadata->updateEntry(OHOS_CONTROL_BEAUTY_SKIN_SMOOTH_VALUE, &skinSmoothValue, count);
1806 }
1807 if (status) {
1808 MEDIA_INFO_LOG("UpdateBeautySetting status: %{public}d", status);
1809 }
1810
1811 return CAMERA_OK;
1812 }
1813
UpdateFaceSlenderSetting(std::shared_ptr<OHOS::Camera::CameraMetadata> changedMetadata,int faceSlenderValue)1814 int32_t HCameraService::UpdateFaceSlenderSetting(std::shared_ptr<OHOS::Camera::CameraMetadata> changedMetadata,
1815 int faceSlenderValue)
1816 {
1817 if (faceSlenderValue <= 0 || changedMetadata == nullptr) {
1818 return CAMERA_OK;
1819 }
1820 bool status = false;
1821 int32_t count = 1;
1822 int ret;
1823 camera_metadata_item_t item;
1824
1825 MEDIA_DEBUG_LOG("UpdateBeautySetting faceSlender: %{public}d", faceSlenderValue);
1826 uint8_t beauty = OHOS_CAMERA_BEAUTY_TYPE_FACE_SLENDER;
1827 ret = OHOS::Camera::FindCameraMetadataItem(changedMetadata->get(), OHOS_CONTROL_BEAUTY_TYPE, &item);
1828 if (ret == CAM_META_ITEM_NOT_FOUND) {
1829 status = changedMetadata->addEntry(OHOS_CONTROL_BEAUTY_TYPE, &beauty, count);
1830 } else if (ret == CAM_META_SUCCESS) {
1831 status = changedMetadata->updateEntry(OHOS_CONTROL_BEAUTY_TYPE, &beauty, count);
1832 }
1833
1834 ret = OHOS::Camera::FindCameraMetadataItem(changedMetadata->get(), OHOS_CONTROL_BEAUTY_FACE_SLENDER_VALUE, &item);
1835 if (ret == CAM_META_ITEM_NOT_FOUND) {
1836 status = changedMetadata->addEntry(OHOS_CONTROL_BEAUTY_FACE_SLENDER_VALUE, &faceSlenderValue, count);
1837 } else if (ret == CAM_META_SUCCESS) {
1838 status = changedMetadata->updateEntry(OHOS_CONTROL_BEAUTY_FACE_SLENDER_VALUE, &faceSlenderValue, count);
1839 }
1840 if (status) {
1841 MEDIA_INFO_LOG("UpdateBeautySetting status: %{public}d", status);
1842 }
1843
1844 return CAMERA_OK;
1845 }
1846
UpdateSkinToneSetting(std::shared_ptr<OHOS::Camera::CameraMetadata> changedMetadata,int skinToneValue)1847 int32_t HCameraService::UpdateSkinToneSetting(std::shared_ptr<OHOS::Camera::CameraMetadata> changedMetadata,
1848 int skinToneValue)
1849 {
1850 if (skinToneValue <= 0 || changedMetadata == nullptr) {
1851 return CAMERA_OK;
1852 }
1853 bool status = false;
1854 int32_t count = 1;
1855 int ret;
1856 camera_metadata_item_t item;
1857
1858 MEDIA_DEBUG_LOG("UpdateBeautySetting skinTone: %{public}d", skinToneValue);
1859 uint8_t beauty = OHOS_CAMERA_BEAUTY_TYPE_SKIN_TONE;
1860 ret = OHOS::Camera::FindCameraMetadataItem(changedMetadata->get(), OHOS_CONTROL_BEAUTY_TYPE, &item);
1861 if (ret == CAM_META_ITEM_NOT_FOUND) {
1862 status = changedMetadata->addEntry(OHOS_CONTROL_BEAUTY_TYPE, &beauty, count);
1863 } else if (ret == CAM_META_SUCCESS) {
1864 status = changedMetadata->updateEntry(OHOS_CONTROL_BEAUTY_TYPE, &beauty, count);
1865 }
1866
1867 ret = OHOS::Camera::FindCameraMetadataItem(changedMetadata->get(), OHOS_CONTROL_BEAUTY_SKIN_TONE_VALUE, &item);
1868 if (ret == CAM_META_ITEM_NOT_FOUND) {
1869 status = changedMetadata->addEntry(OHOS_CONTROL_BEAUTY_SKIN_TONE_VALUE, &skinToneValue, count);
1870 } else if (ret == CAM_META_SUCCESS) {
1871 status = changedMetadata->updateEntry(OHOS_CONTROL_BEAUTY_SKIN_TONE_VALUE, &skinToneValue, count);
1872 }
1873 if (status) {
1874 MEDIA_INFO_LOG("UpdateBeautySetting status: %{public}d", status);
1875 }
1876
1877 return CAMERA_OK;
1878 }
1879
g_toString(std::set<int32_t> & pidList)1880 std::string g_toString(std::set<int32_t>& pidList)
1881 {
1882 std::string ret = "[";
1883 for (const auto& pid : pidList) {
1884 ret += std::to_string(pid) + ",";
1885 }
1886 ret += "]";
1887 return ret;
1888 }
1889
ProxyForFreeze(const std::set<int32_t> & pidList,bool isProxy)1890 int32_t HCameraService::ProxyForFreeze(const std::set<int32_t>& pidList, bool isProxy)
1891 {
1892 constexpr int32_t maxSaUid = 10000;
1893 CHECK_ERROR_RETURN_RET_LOG(IPCSkeleton::GetCallingUid() >= maxSaUid, CAMERA_OPERATION_NOT_ALLOWED, "not allow");
1894 MEDIA_INFO_LOG("isProxy value: %{public}d", isProxy);
1895 {
1896 std::lock_guard<std::mutex> lock(freezedPidListMutex_);
1897 if (isProxy) {
1898 freezedPidList_.insert(pidList.begin(), pidList.end());
1899 MEDIA_DEBUG_LOG("after freeze freezedPidList_:%{public}s", g_toString(freezedPidList_).c_str());
1900 return CAMERA_OK;
1901 } else {
1902 for (auto pid : pidList) {
1903 freezedPidList_.erase(pid);
1904 }
1905 MEDIA_DEBUG_LOG("after unfreeze freezedPidList_:%{public}s", g_toString(freezedPidList_).c_str());
1906 }
1907 }
1908
1909 {
1910 std::lock_guard<std::mutex> lock(cameraCbMutex_);
1911 for (auto pid : pidList) {
1912 auto it = delayCbtaskMap.find(pid);
1913 if (it != delayCbtaskMap.end()) {
1914 it->second();
1915 delayCbtaskMap.erase(it);
1916 }
1917 }
1918 }
1919 return CAMERA_OK;
1920 }
1921
ResetAllFreezeStatus()1922 int32_t HCameraService::ResetAllFreezeStatus()
1923 {
1924 if (IPCSkeleton::GetCallingUid() != 0) {
1925 return CAMERA_OPERATION_NOT_ALLOWED;
1926 }
1927 std::lock_guard<std::mutex> lock(freezedPidListMutex_);
1928 freezedPidList_.clear();
1929 MEDIA_INFO_LOG("freezedPidList_ has been clear");
1930 return CAMERA_OK;
1931 }
1932
GetDmDeviceInfo(std::vector<std::string> & deviceInfos)1933 int32_t HCameraService::GetDmDeviceInfo(std::vector<std::string> &deviceInfos)
1934 {
1935 #ifdef DEVICE_MANAGER
1936 lock_guard<mutex> lock(g_dmDeviceInfoMutex);
1937 std::vector <DistributedHardware::DmDeviceInfo> deviceInfoList;
1938 auto &deviceManager = DistributedHardware::DeviceManager::GetInstance();
1939 std::shared_ptr<DistributedHardware::DmInitCallback> initCallback = std::make_shared<DeviceInitCallBack>();
1940 std::string pkgName = std::to_string(IPCSkeleton::GetCallingTokenID());
1941 const string extraInfo = "";
1942 deviceManager.InitDeviceManager(pkgName, initCallback);
1943 deviceManager.RegisterDevStateCallback(pkgName, extraInfo, NULL);
1944 deviceManager.GetTrustedDeviceList(pkgName, extraInfo, deviceInfoList);
1945 deviceManager.UnInitDeviceManager(pkgName);
1946 int size = static_cast<int>(deviceInfoList.size());
1947 MEDIA_INFO_LOG("HCameraService::GetDmDeviceInfo size=%{public}d", size);
1948 if (size > 0) {
1949 for (int i = 0; i < size; i++) {
1950 nlohmann::json deviceInfo;
1951 deviceInfo["deviceName"] = deviceInfoList[i].deviceName;
1952 deviceInfo["deviceTypeId"] = deviceInfoList[i].deviceTypeId;
1953 deviceInfo["networkId"] = deviceInfoList[i].networkId;
1954 std::string deviceInfoStr = deviceInfo.dump();
1955 MEDIA_INFO_LOG("HCameraService::GetDmDeviceInfo deviceInfo:%{public}s", deviceInfoStr.c_str());
1956 deviceInfos.emplace_back(deviceInfoStr);
1957 }
1958 }
1959 #endif
1960 return CAMERA_OK;
1961 }
1962
GetCameraOutputStatus(int32_t pid,int32_t & status)1963 int32_t HCameraService::GetCameraOutputStatus(int32_t pid, int32_t &status)
1964 {
1965 sptr<HCaptureSession> captureSession = nullptr;
1966 captureSessionsManager_.Find(pid, captureSession);
1967 if (captureSession) {
1968 captureSession->GetOutputStatus(status);
1969 } else {
1970 status = 0;
1971 }
1972 return CAMERA_OK;
1973 }
1974
CreateCameraDataShareHelper()1975 std::shared_ptr<DataShare::DataShareHelper> HCameraService::CameraDataShareHelper::CreateCameraDataShareHelper()
1976 {
1977 auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
1978 CHECK_ERROR_RETURN_RET_LOG(samgr == nullptr, nullptr, "CameraDataShareHelper GetSystemAbilityManager failed.");
1979 sptr<IRemoteObject> remoteObj = samgr->GetSystemAbility(CAMERA_SERVICE_ID);
1980 CHECK_ERROR_RETURN_RET_LOG(remoteObj == nullptr, nullptr, "CameraDataShareHelper GetSystemAbility Service Failed.");
1981 return DataShare::DataShareHelper::Creator(remoteObj, SETTINGS_DATA_BASE_URI, SETTINGS_DATA_EXT_URI);
1982 }
1983
QueryOnce(const std::string key,std::string & value)1984 int32_t HCameraService::CameraDataShareHelper::QueryOnce(const std::string key, std::string &value)
1985 {
1986 auto dataShareHelper = CreateCameraDataShareHelper();
1987 CHECK_ERROR_RETURN_RET_LOG(dataShareHelper == nullptr, CAMERA_INVALID_ARG, "dataShareHelper_ is nullptr");
1988 Uri uri(SETTINGS_DATA_BASE_URI);
1989 DataShare::DataSharePredicates predicates;
1990 predicates.EqualTo(SETTINGS_DATA_FIELD_KEYWORD, key);
1991 std::vector<std::string> columns;
1992 columns.emplace_back(SETTINGS_DATA_FIELD_VALUE);
1993
1994 auto resultSet = dataShareHelper->Query(uri, predicates, columns);
1995 CHECK_AND_RETURN_RET_LOG(resultSet != nullptr, CAMERA_INVALID_ARG, "CameraDataShareHelper query fail");
1996
1997 int32_t numRows = 0;
1998 resultSet->GetRowCount(numRows);
1999 CHECK_AND_RETURN_RET_LOG(numRows > 0, CAMERA_INVALID_ARG, "CameraDataShareHelper query failed, row is zero.");
2000
2001 if (resultSet->GoToFirstRow() != DataShare::E_OK) {
2002 MEDIA_INFO_LOG("CameraDataShareHelper Query failed,go to first row error");
2003 resultSet->Close();
2004 return CAMERA_INVALID_ARG;
2005 }
2006
2007 int columnIndex;
2008 resultSet->GetColumnIndex(SETTINGS_DATA_FIELD_VALUE, columnIndex);
2009 resultSet->GetString(columnIndex, value);
2010 resultSet->Close();
2011 dataShareHelper->Release();
2012 MEDIA_INFO_LOG("CameraDataShareHelper query success,value=%{public}s", value.c_str());
2013 return CAMERA_OK;
2014 }
2015
UpdateOnce(const std::string key,std::string value)2016 int32_t HCameraService::CameraDataShareHelper::UpdateOnce(const std::string key, std::string value)
2017 {
2018 auto dataShareHelper = CreateCameraDataShareHelper();
2019 CHECK_ERROR_RETURN_RET_LOG(dataShareHelper == nullptr, CAMERA_INVALID_ARG, "dataShareHelper_ is nullptr");
2020 Uri uri(SETTINGS_DATA_BASE_URI);
2021 DataShare::DataSharePredicates predicates;
2022 predicates.EqualTo(SETTINGS_DATA_FIELD_KEYWORD, key);
2023
2024 DataShare::DataShareValuesBucket bucket;
2025 DataShare::DataShareValueObject keywordObj(key);
2026 DataShare::DataShareValueObject valueObj(value);
2027 bucket.Put(SETTINGS_DATA_FIELD_KEYWORD, keywordObj);
2028 bucket.Put(SETTINGS_DATA_FIELD_VALUE, valueObj);
2029
2030 if (dataShareHelper->Update(uri, predicates, bucket) <= 0) {
2031 dataShareHelper->Insert(uri, bucket);
2032 MEDIA_ERR_LOG("CameraDataShareHelper Update:%{public}s failed", key.c_str());
2033 return CAMERA_INVALID_ARG;
2034 }
2035 MEDIA_INFO_LOG("CameraDataShareHelper Update:%{public}s success", key.c_str());
2036 dataShareHelper->Release();
2037 return CAMERA_OK;
2038 }
2039 } // namespace CameraStandard
2040 } // namespace OHOS
2041