From 48723dbdc1d29556789e7b8369ba56db5ce2c4cf Mon Sep 17 00:00:00 2001 From: fanchenxuan Date: Sat, 16 Nov 2024 10:26:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=A8=E5=B1=80=E5=BC=B9=E7=AA=97=E6=8B=A6?= =?UTF-8?q?=E6=88=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: fanchenxuan --- .../ets/GlobalExtAbility/GlobalExtAbility.ts | 91 ++++++++++++++++++- .../src/main/ets/MainAbility/MainAbility.ts | 37 +++++++- 2 files changed, 126 insertions(+), 2 deletions(-) diff --git a/permissionmanager/src/main/ets/GlobalExtAbility/GlobalExtAbility.ts b/permissionmanager/src/main/ets/GlobalExtAbility/GlobalExtAbility.ts index 40555a7..739c631 100644 --- a/permissionmanager/src/main/ets/GlobalExtAbility/GlobalExtAbility.ts +++ b/permissionmanager/src/main/ets/GlobalExtAbility/GlobalExtAbility.ts @@ -17,6 +17,9 @@ import extension from '@ohos.app.ability.ServiceExtensionAbility'; import window from '@ohos.window'; import display from '@ohos.display'; import { GlobalContext } from '../common/utils/globalContext'; +import { abilityAccessCtrl, bundleManager } from '@kit.AbilityKit'; +import { camera } from '@kit.CameraKit'; +import { audio } from '@kit.AudioKit'; const TAG = 'PermissionManager_Log:'; const BG_COLOR = '#00000000'; @@ -32,6 +35,16 @@ export default class GlobalExtensionAbility extends extension { GlobalContext.store('globalState', want.parameters['ohos.sensitive.resource']); GlobalContext.store('context', this.context); + if (!this.permissionCheck()) { + this.context.terminateSelf(); + return; + } + + if (!this.statusCheck(want.parameters['ohos.sensitive.resource'])) { + this.context.terminateSelf(); + return; + } + try { let dis = display.getDefaultDisplaySync(); let navigationBarRect = { @@ -59,7 +72,83 @@ export default class GlobalExtensionAbility extends extension { onDestroy(): void { console.info(TAG + 'ServiceExtensionAbility onDestroy.'); let win = GlobalContext.load('globalWin'); - win.destroyWindow(); + win?.destroyWindow(); + } + + private permissionCheck(): boolean { + try { + let flag = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION; + let bundleInfo = bundleManager.getBundleInfoForSelfSync(flag); + let atManager =abilityAccessCtrl.createAtManager(); + let status = + atManager.verifyAccessTokenSync(bundleInfo.appInfo.accessTokenId, 'ohos.permission.MICROPHONE_CONTROL'); + if (status === abilityAccessCtrl.GrantStatus.PERMISSION_DENIED) { + console.log(TAG + 'permission status is denied.'); + return false; + } + return true; + } catch (err) { + console.error(TAG + 'verifyAccessTokenSync failed.'); + return false; + } + } + + private statusCheck(resource: string): boolean { + switch (resource) { + case 'microphone': + if (this.microphoneStatus()) { + return true; + } else { + console.log(TAG + 'The microphone is not disabled on this device.'); + return false; + } + case 'camera': + if (this.cameraStatus()) { + return true; + } else { + console.log(TAG + 'The camera is not disabled on this device.'); + return false; + } + default: + if (this.microphoneStatus() && this.cameraStatus()) { + return true; + } else { + console.log(TAG + 'The microphone and camera is not disabled on this device.'); + return false; + } + } + } + + private microphoneStatus(): boolean { + try { + let audioManager = audio.getAudioManager(); + let audioVolumeManager = audioManager.getVolumeManager(); + let groupId = audio.DEFAULT_VOLUME_GROUP_ID; + let audioVolumeGroupManager = audioVolumeManager.getVolumeGroupManagerSync(groupId); + let muteState = audioVolumeGroupManager.isPersistentMicMute(); + console.log(TAG + 'microphoneStatus: ' + muteState); + return muteState; + } catch (err) { + console.error(TAG + 'Failed to obtain the microphone disabled status.'); + return false; + } + } + + private cameraStatus(): boolean { + try { + let cameraManager = camera.getCameraManager(this.context); + let isMuteSupported = cameraManager.isCameraMuteSupported(); + if (!isMuteSupported) { + console.log(TAG + 'The current device does not support disabling the camera.'); + return false; + } + let muteState = cameraManager.isCameraMuted(); + console.log(TAG + 'cameraStatus: ' + muteState); + return muteState; + } catch (err) { + console.error(TAG + 'Failed to obtain the camera disabled status.'); + return false; + } } private async createWindow(name: string, windowType: number, rect): Promise { diff --git a/permissionmanager/src/main/ets/MainAbility/MainAbility.ts b/permissionmanager/src/main/ets/MainAbility/MainAbility.ts index bb94650..381413d 100644 --- a/permissionmanager/src/main/ets/MainAbility/MainAbility.ts +++ b/permissionmanager/src/main/ets/MainAbility/MainAbility.ts @@ -14,10 +14,10 @@ */ import UIAbility from '@ohos.app.ability.UIAbility'; -import bundleManager from '@ohos.bundle.bundleManager'; import bundleMonitor from '@ohos.bundle.bundleMonitor'; import account_osAccount from '@ohos.account.osAccount'; import { GlobalContext } from '../common/utils/globalContext'; +import { abilityAccessCtrl, bundleManager } from '@kit.AbilityKit'; const TAG = 'PermissionManager_Log:'; const USER_ID = 100; @@ -26,6 +26,11 @@ export default class MainAbility extends UIAbility { onCreate(want, launchParam): void { console.log(TAG + 'MainAbility onCreate, ability name is ' + want.abilityName + '.'); + if (!this.permissionCheck()) { + this.context.terminateSelf(); + return; + } + globalThis.bundleName = want.parameters.bundleName; GlobalContext.store('bundleName', want.parameters.bundleName); GlobalContext.store('context', this.context); @@ -77,6 +82,14 @@ export default class MainAbility extends UIAbility { console.log(TAG + 'MainAbility onNewWant. want: ' + JSON.stringify(want)); console.log(TAG + 'MainAbility onNewWant. bundleName: ' + JSON.stringify(want.parameters.bundleName)); + if (!this.permissionCheck()) { + this.context.terminateSelf(); + return; + } + + if (globalThis.currentApp === undefined) { + this.context.terminateSelf(); + } let bundleName = want.parameters.bundleName ? want.parameters.bundleName : 'all'; if (globalThis.currentApp === 'all') { if (globalThis.currentApp !== bundleName) { @@ -134,6 +147,24 @@ export default class MainAbility extends UIAbility { console.log(TAG + ' onForeground.'); } + private permissionCheck(): boolean { + try { + let flag = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION; + let bundleInfo = bundleManager.getBundleInfoForSelfSync(flag); + let atManager =abilityAccessCtrl.createAtManager(); + let status = + atManager.verifyAccessTokenSync(bundleInfo.appInfo.accessTokenId, 'ohos.permission.GET_INSTALLED_BUNDLE_LIST'); + if (status === abilityAccessCtrl.GrantStatus.PERMISSION_DENIED) { + console.log(TAG + 'permission status is denied.'); + return false; + } + return true; + } catch (err) { + console.error(TAG + 'verifyAccessTokenSync failed.'); + return false; + } + } + getAllApplications(): void { const flag = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION | @@ -147,6 +178,7 @@ export default class MainAbility extends UIAbility { bundleManager.getAllBundleInfo(flag, userId || USER_ID).then(async(bundleInfos) => { if (bundleInfos.length <= 0) { console.info(TAG + 'bundle.getAllBundleInfo result.length less than or equal to zero'); + this.context.terminateSelf(); return; } let initialGroups = []; @@ -172,10 +204,12 @@ export default class MainAbility extends UIAbility { globalThis.windowStage?.loadContent('pages/authority-management', storage); }).catch((error) => { console.error(TAG + 'bundle.getAllBundleInfo failed. Cause: ' + JSON.stringify(error)); + this.context.terminateSelf(); }); }); } catch (e) { console.error(TAG + 'getActivatedOsAccountLocalIds exception: ' + JSON.stringify(e)); + this.context.terminateSelf(); } } @@ -214,6 +248,7 @@ export default class MainAbility extends UIAbility { }); } catch (error) { console.error(TAG + 'Special branch failed: ' + JSON.stringify(error)); + this.context.terminateSelf(); } } }; -- Gitee