在移动应用使用过程中,用户经常面临屏幕被窥视的风险,例如分享照片时暴露相册其他内容,或付款时交易记录被偷看。针对这一痛点,HarmonyOS SDK设备安全服务(Device Security Kit)提供了防窥保护能力,通过系统智能判断和传感器监测,自动识别窥视状态并触发防护措施,如拉起系统蒙层遮盖敏感信息。
要使用该能力,设备需满足以下条件:用户需在设备上开启人脸识别并录入人脸信息,同时确认系统设置中是否存在“防窥保护”选项(路径:设置 > 隐私与安全 > 防窥保护)。系统版本要求HarmonyOS 6.0.0 Beta1及以上,DevEco Studio版本6.0.0 Beta1及以上,HarmonyOS SDK版本6.0.0 Beta1 SDK及以上。此外,由于依赖传感器环境判断,人脸距离设备需在合理范围内,且无遮挡、光线充足。
开发流程如下:
1. 导入防窥保护模块及相关公共模块。- import { dlpAntiPeep } from '@kit.DeviceSecurityKit';
- import { window } from '@kit.ArkUI';
- import { common } from '@kit.AbilityKit';
复制代码
2. 检查当前应用是否已开启防窥保护,若未开启则引导用户设置,然后订阅窥视状态变化通知。- @Entry
- @Component
- struct Index {
- @State message: string = 'DlpAntiPeep';
- private hasShownMask: boolean = false;
- private onStatusChange = async (status: dlpAntiPeep.DlpAntiPeepStatus): Promise<void> => {
- if (status === dlpAntiPeep.DlpAntiPeepStatus.PASS) {
- console.info('DlpAntiPeepStatus is PASS.');
- } else if (status === dlpAntiPeep.DlpAntiPeepStatus.HIDE) {
- console.info('DlpAntiPeepStatus is HIDE.');
- if (!this.hasShownMask) {
- await this.setMaskLayer();
- }
- }
- }
- async aboutToAppear() {
- try {
- const isOpen = await dlpAntiPeep.isDlpAntiPeepSwitchOn();
- if (isOpen) {
- dlpAntiPeep.on('dlpAntiPeep', this.onStatusChange);
- } else {
- const context = this.getUIContext().getHostContext() as common.UIAbilityContext;
- const result = await dlpAntiPeep.requestAntiPeepOptions(context);
- if (result === dlpAntiPeep.AntiPeepOptionsResult.SUCCESS ||
- result === dlpAntiPeep.AntiPeepOptionsResult.ALREADY_ON) {
- dlpAntiPeep.on('dlpAntiPeep', this.onStatusChange);
- }
- }
- } catch (error) {
- console.error(`Failed to init DlpAntiPeep. Code: ${error.code}, message: ${error.message}`);
- }
- }
- aboutToDisappear() {
- try {
- dlpAntiPeep.off('dlpAntiPeep', this.onStatusChange);
- } catch (error) {
- console.error(`Failed to off DlpAntiPeep. Code: ${error.code}, message: ${error.message}`);
- }
- }
- onPageShow() {
- this.hasShownMask = false;
- }
- private async setMaskLayer(): Promise<void> {
- try {
- const context = this.getUIContext().getHostContext() as common.UIAbilityContext;
- const windowClass = await window.getLastWindow(context);
- const windowId = windowClass.getWindowProperties().id;
- await dlpAntiPeep.setAntiPeepMaskLayer(windowId);
- this.hasShownMask = true;
- } catch (error) {
- console.error(`Failed to set AntiPeep MaskLayer. Code: ${error.code}, message: ${error.message}`);
- }
- }
- build() {
- Column() {
- Text(this.message).fontSize(20).margin(20)
- }
- .width('100%').height('100%')
- .justifyContent(FlexAlign.Center)
- }
- }
复制代码
关键逻辑说明:
- 状态回调中,当状态为PASS时表示无人窥视;状态为HIDE时表示有人在窥屏,此时应用应执行隐私保护操作。
- 防护开关未开启时,可以通过调用requestAntiPeepOptions引导用户开启,成功后继续订阅。
- setMaskLayer方法用于拉起系统蒙层,通过获取窗口ID并调用dlpAntiPeep.setAntiPeepMaskLayer实现,同时使用hasShownMask标志避免频繁拉起。
- 页面显示时重置蒙层标志,以便每次进入页面都能再次响应窥视。
防窥保护能力通过毫秒级响应技术,结合传感器与系统蒙层,有效防止非机主偷看屏幕敏感信息。开发者可参考官方开发指导文档(HarmonyOS SDK设备安全服务)获取更多细节。 |