HarmonyOS鸿蒙Next应用如何屏蔽截屏和录屏,源码和步骤讲解

HarmonyOS鸿蒙Next应用如何屏蔽截屏和录屏,源码和步骤讲解 鸿蒙应用如何屏蔽截屏和录屏,源码和步骤讲解。

金融类或者高密性质的应用APP,对于截屏和录屏场景,某些业务下是禁止不允许。

目前这种场景的需求也是非常有必要的,很多电诈都是通过远程录屏软件,获取到账户密码或者验证码。如此掌控受害人的帐号所有权。

那禁止截屏和录屏在鸿蒙中如何实现呢?

4 回复

一、结论

鸿蒙系统中通过设置窗口为隐私窗口。来实现禁止用户的录屏和截图。

window窗口对象的setWindowPrivacyMode(boolean)接口。

启用隐私模式(true):禁止对该窗口内容截屏或录屏。

关闭隐私模式(false):恢复窗口正常截屏/录屏能力。

cke_82958.jpeg

隐私窗口还是很强大的效果,多设备协同,IDE log截图,都无法截图。更别说手机直接截图了,会在底部弹气泡,提示:“当前界面设计隐私内容,不允许截图”

二、代码实现和详细解释

1、首先配置权限,未声明权限将导致隐私模式失效:

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

2、设置窗口的隐私模式:

此时就会有个问题,获取窗口。不推荐使用getLastWindow的方式获取窗口,首先该接口是异步,其次该方式是获取最上面的窗口,有很多老应用的弹窗或者全局loading是子窗口实现,会导致getLastWindow获取的是这些东西,不是当前的界面窗口。

当然有的项目组是新项目,或者考虑内存占用问题,也会采用getLastWindow。我这里只是建议,下面也以为缓存窗口来举例。

推荐缓存的窗口的方式,当需要设置目标窗口为隐私模式时直接调用即可:

import { window } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';
import { WindowMgr } from '../mgr/WIndowMgr';

export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
  }


  onWindowStageCreate(windowStage: window.WindowStage): void {
    WindowMgr.Ins().setMainWindow(windowStage.getMainWindowSync());
    globalThis.mWindowStage = windowStage;
    windowStage.loadContent('pages/PrivacyTestPage', (err) => {
      if (err.code) {
        return;
      }
      console.log("debugGeorgeGcs", "onWindowStageCreate temp: " + temp);

    });
  }

}

封装的窗口工具单例类:

import { window } from "@kit.ArkUI";

export class WindowMgr {
  private TAG: string = 'WindowMgr';

  // 单例对象
  private static mIns: WindowMgr | null = null;

  // 创建单例
  public static Ins(): WindowMgr{
    if(!WindowMgr.mIns){
      WindowMgr.mIns = new WindowMgr();
    }
    return WindowMgr.mIns;
  }

  private mainWin: window.Window | null = null;

  public setMainWindow(window: window.Window){
    this.mainWin = window;
  }

  /**
   * 设置主窗口的隐私模式状态
   * @param isPrivacy true为隐私模式
   */
  public setMainWindowPrivacyMode(isPrivacy: boolean){
    this.mainWin?.setWindowPrivacyMode(isPrivacy).catch((e: Error) => {
      console.error(this.TAG, "setWindowPrivacyMode error: " + JSON.stringify(e));
    });
  }
}

截图调用举例:

import { WindowMgr } from '../mgr/WIndowMgr';

/**
 * 隐私窗口验证测试界面
 */
@Entry
@Component
struct PrivacyTestPage {

  /**
   * 推荐在页面生命周期中动态开启/关闭隐私模式:避免频繁调用接口导致异常。
   */
  onPageShow(): void {
    WindowMgr.Ins().setMainWindowPrivacyMode(true);
  }

  onPageHide(): void {
    WindowMgr.Ins().setMainWindowPrivacyMode(false);
  }

  build() {
    RelativeContainer() {
      Text("隐私窗口验证界面")
        .id('PrivacyTestPageHelloWorld')
        .fontSize($r('app.float.page_text_font_size'))
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
    }
    .height('100%')
    .width('100%')
  }
}

更多关于HarmonyOS鸿蒙Next应用如何屏蔽截屏和录屏,源码和步骤讲解的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


学习了,加油,

在HarmonyOS Next中,屏蔽截屏和录屏可通过设置窗口的隐私标志实现。使用Window类的setPrivacyMode方法,传入true即可启用隐私模式。关键代码示例:window.setPrivacyMode(true)。此设置作用于当前窗口,阻止系统截屏和录屏功能捕获该窗口内容。需在UIAbility或窗口初始化时调用。

在HarmonyOS Next中,可以通过设置窗口的隐私标志来禁止对应用窗口进行截屏和录屏。这是保障金融等高密级应用安全性的关键功能。

核心实现原理: 通过Window对象的setWindowPrivacyMode()方法,为窗口添加WindowPrivacyMode.PRIVACY_MODE_PROHIBIT_SCREEN_CAPTURE标志。该标志会通知系统,当前窗口内容受保护,系统层会主动阻止截屏和录屏操作。

关键源码与步骤:

  1. 导入必要模块

    import { window } from '@kit.ArkUI';
    import { BusinessError } from '@kit.BasicServicesKit';
    
  2. 获取当前窗口并设置隐私模式: 在UIAbility的onWindowStageCreate()生命周期回调中,或在你需要触发保护的页面初始化时,执行以下代码:

    // 1. 获取当前应用窗口
    let windowClass: window.Window | null = null;
    try {
        windowClass = window.getLastWindow(this.context);
    } catch (error) {
        let err: BusinessError = error as BusinessError;
        console.error('Failed to obtain the window. Cause: ' + JSON.stringify(err));
        return;
    }
    
    // 2. 设置窗口隐私模式,禁止截屏和录屏
    if (windowClass) {
        try {
            // PRIVACY_MODE_PROHIBIT_SCREEN_CAPTURE 是核心标志
            windowClass.setWindowPrivacyMode(window.WindowPrivacyMode.PRIVACY_MODE_PROHIBIT_SCREEN_CAPTURE);
            console.info('Succeeded in setting the window privacy mode.');
        } catch (error) {
            let err: BusinessError = error as BusinessError;
            console.error('Failed to set the window privacy mode. Cause: ' + JSON.stringify(err));
        }
    }
    
  3. 取消保护(可选): 在业务场景允许后(如退出密码输入页面),可以调用以下方法取消禁止:

    if (windowClass) {
        windowClass.setWindowPrivacyMode(window.WindowPrivacyMode.PRIVACY_MODE_DEFAULT);
    }
    

效果与说明:

  • 设置成功后,当该窗口处于前台时,系统快捷键、实体按键(如音量下+电源)以及任何第三方录屏软件均无法截取或录制该窗口内容。尝试操作会收到失败提示或仅能获取到黑屏/纯色画面。
  • 此限制作用于窗口级别。如果应用有多个窗口,需要对需要保护的窗口分别进行设置。
  • 该能力由HarmonyOS系统框架层提供并强制执行,具有很高的可靠性。

注意事项:

  • API版本:请确保开发环境与目标设备支持HarmonyOS Next及相应的API版本。
  • 用户体验:应在必要的业务场景(如输入密码、显示验证码、查看敏感合同)下才启用此功能,并在明显位置提示用户当前处于安全保护模式,避免因无法截屏导致用户困惑。

以上是实现禁止截屏和录屏的核心代码。将此逻辑集成到你的UIAbility或页面生命周期管理中即可。

回到顶部