diff --git a/services/abilitymgr/src/ability_manager_service.cpp b/services/abilitymgr/src/ability_manager_service.cpp index bd1983e453307f8e1769fb24a05e11373f45293d..314fa40c2811717bac7cdfc978f8131a6edef22f 100644 --- a/services/abilitymgr/src/ability_manager_service.cpp +++ b/services/abilitymgr/src/ability_manager_service.cpp @@ -905,6 +905,36 @@ int AbilityManagerService::ConnectAbility( HILOG_INFO("%{public}s invalid Token.", __func__); return ConnectLocalAbility(want, validUserId, connect, nullptr); } + if (CheckIsFreeInstall(want)) { + HILOG_INFO("AbilityManagerService::ConnectAbility. try to FreeInstall"); + std::string bundleName = want.GetElement().GetBundleName(); + std::string abilityName = want.GetElement().GetAbilityName(); + std::string deviceId = want.GetElement().GetDeviceID(); + std::string localDeviceId; + if (!((GetLocalDeviceId(localDeviceId) && localDeviceId == deviceId) || deviceId.empty())) { + HILOG_ERROR("AbilityManagerService::ConnectAbility. DeviceId error"); + return ERR_INVALID_VALUE; + } + if (bundleName.empty() || abilityName.empty()) { + HILOG_ERROR("AbilityManagerService::ConnectAbility. bundleName or abilityName is nullptr"); + return ERR_INVALID_VALUE; + } + AppExecFwk::AbilityInfo abilityInfo; + if (!(iBundleManager_->QueryAbilityInfo( + want, AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION, userId, abilityInfo))) { + HILOG_INFO( + "AbilityManagerService::ConnectAbility. moduleName is %{public}s", abilityInfo.moduleName.c_str()); + Want &wantParam = const_cast(want); + wantParam.SetParam("moduleName", abilityInfo.moduleName); + int result = StartFreeInstall(wantParam, userId, DEFAULT_INVAL_VALUE); + if (result) { + HILOG_ERROR("AbilityManagerService::ConnectAbility. StartFreeInstall error"); + return result; + } + HILOG_INFO("AbilityManagerService::ConnectAbility. StartFreeInstall success"); + return ConnectLocalAbility(wantParam, validUserId, connect, callerToken); + } + } return ConnectLocalAbility(want, validUserId, connect, callerToken); }