【HarmonyOS】应用屏蔽截屏和录屏

在 HarmonyOS 应用中屏蔽截屏和录屏,标准做法是利用系统提供的窗口隐私模式。这个功能主要服务于金融支付、账户登录、输入密码等对信息安全有严格要求的场景。

核心操作是通过setWindowPrivacyMode接口将应用窗口设置为“隐私模式”。开启后,系统会阻止所有截屏和录屏行为,当用户尝试操作时,通常会看到“当前界面涉及隐私内容,不允许截屏”的提示或得到黑屏/空白截图。

以下是几种不同场景的实现方案:

场景与方案核心实现关键权限适用特点
ArkTS页面级控制在页面的onPageShow开启,onPageHide关闭隐私模式ohos.permission.PRIVACY_WINDOW最常用、最基础的方案,适用于绝大多数ArkTS开发的页面。
单Ability应用控制在Ability中保存windowStage对象,再在需要保护的页面组件(aboutToAppear)中通过该对象获取窗口进行设置ohos.permission.PRIVACY_WINDOW适用于整个应用只有一个Ability的架构。
跨平台框架(如RN/Flutter/uni-app)通过插件桥接,调用鸿蒙原生setWindowPrivacyModeAPI,或使用社区封装好的插件,如react-native-screenshot-prevently028-NScreenshotohos.permission.PRIVACY_WINDOW使用React Native、Flutter、uni-app等框架开发的应用。

核心实现步骤(ArkTS示例)

1. 权限声明
在模块的module.json5文件中,添加PRIVACY_WINDOW权限:

json

{ "requestPermissions": [ { "name": "ohos.permission.PRIVACY_WINDOW" } ] }

2. 页面级控制代码
在需要保护的页面中,通过生命周期钩子控制隐私模式的开关。这是一个标准写法,可以确保页面切入后台或跳转时,隐私保护被解除,不影响其他页面。

typescript

import { window } from '@kit.ArkUI'; @Entry @Component struct PrivacyPage { onPageShow(): void { // 页面显示时,开启隐私模式,禁止截屏录屏 window.getLastWindow(this.getUIContext().getHostContext()) .then((win: window.Window) => { win.setWindowPrivacyMode(true); }); } onPageHide(): void { // 页面隐藏时,关闭隐私模式,释放限制 window.getLastWindow(this.getUIContext().getHostContext()) .then((win: window.Window) => { win.setWindowPrivacyMode(false); }); } build() { // 你的敏感页面内容 Column() { Text('此页面内容受到保护,无法截屏或录屏') } } }

进阶安全方案:安全沙箱SDK

除了基础的API调用,如果应用有更复杂的企业级安全需求,可以考虑集成安全沙箱SDK。这是一个商业级组件,提供策略化控制引擎,其能力不仅限于禁截屏/录屏,还包括:

  • 水印:在页面添加可溯源的水印,进一步防止信息通过拍照泄露。

  • 环境检测:检测运行环境是否被注入、调试或在模拟器中运行。

重要注意事项

  1. 页面生命周期管理:务必在页面隐藏(如onPageHide)时关闭隐私模式,否则会影响应用内其他页面的正常截屏功能。

  2. 并非组件级控制:此功能是基于窗口(Window)的,无法针对页面内的某一个单独组件(如Web组件里的某个登录框)设置。需要通过业务逻辑(如URL判断)来动态控制整个窗口的模式。

  3. 避免全局滥用:不建议在应用启动时就全局开启,这会给用户带来不便。最合理的做法是仅在涉及密码、支付、个人信息等关键页面动态启用。