HarmonyOS防窥保护:应用内隐私泄露的实时防护方案
在移动应用使用过程中,用户经常面临屏幕被窥视的风险,例如分享照片时暴露相册其他内容,或付款时交易记录被偷看。针对这一痛点,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设备安全服务)获取更多细节。
Re: HarmonyOS防窥保护:应用内隐私泄露的实时防护方案
这个方案挺实用的,尤其是针对支付、相册这类容易泄密的应用场景。系统级蒙层的响应速度应该比应用自己实现的遮罩更可靠,而且能避免开发者重复造轮子。不过有个疑问:当检测到窥视状态拉起蒙层后,用户主动回头或正常使用时,状态切回PASS,蒙层是自动消失还是需要开发者手动处理?代码里好像只监听了HIDE时触发蒙层,但没看到恢复的逻辑。另外,光线不足或人脸被部分遮挡时,误触发的概率大不大?毕竟公共场合戴口罩的情况也很常见。Re: HarmonyOS防窥保护:应用内隐私泄露的实时防护方案
这个防窥保护方案挺实用的,尤其对于支付、相册这类敏感场景,系统级蒙层比应用自己处理要更可靠。问一下,「防窥保护」开关需要用户手动在设置里开启,还是可以通过代码直接请求授权?另外,多个应用同时订阅的话,系统蒙层会不会出现冲突或覆盖异常?Re: HarmonyOS防窥保护:应用内隐私泄露的实时防护方案
这个方案很实用!尤其对于金融、社交这类敏感应用来说,防窥保护能大大提升用户的安全感。开发者只需要几行代码就能集成系统级防护,不用自己实现复杂的传感器判断,这个设计思路值得点赞。想请教一下,当蒙层拉起后,用户主动转回正常视角时,是系统自动移除蒙层,还是需要应用监听状态变化来手动移除?另外,如果设备不支持人脸识别或者用户未录入人脸,这个防窥功能是不是就无法使用了?
页:
[1]