当前位置:首页>鸿蒙APP>鸿蒙Flutter插件精选:screen_protector_ohos

鸿蒙Flutter插件精选:screen_protector_ohos

  • 2026-10-20 05:59:57
鸿蒙Flutter插件精选:screen_protector_ohos

上一期我们聊了 share_bridge_wechat_ohos 微信分享的鸿蒙化方案。今天要介绍的是一个关乎应用安全的插件——screen_protector_ohos。

在金融、支付、医疗、企业办公这类 App 中,防截屏和防后台泄露是硬需求。用户切到后台时,App 内容会不会在最近任务列表里「裸奔」?用户能不能随手截屏把敏感信息分享出去?这些都不是小问题。

在 Android 上,我们通常用 FLAG_SECURE 来搞定。在 iOS 上,可以用 UIApplication 的截图通知和模糊处理。那在 HarmonyOS 上呢?

答案就是——screen_protector_ohos,它把鸿蒙系统级的隐私窗口能力封装成了 Flutter 插件,一行代码就能开启防截屏和数据泄露保护。


痛点

  • 金融/支付类 App 的合规要求:监管明确要求交易界面、密码输入界面必须防截屏
  • 后台任务切换泄漏隐私:用户切到多任务界面时,App 内容一览无余,这在敏感场景下极其危险
  • Android/iOS 都有成熟方案,鸿蒙没有:FLAG_SECURE 在鸿蒙上不适用,需要另寻他路
  • 自己实现门槛不低:鸿蒙 window.setWindowPrivacyMode API 需要权限申请、异常处理,还得考虑生命周期管理
  • 多平台统一管理困难:Android 一套、iOS 一套、鸿蒙再一套,代码分散难维护

核心特性

  • ✅ 防截屏:阻止用户对当前页面进行截图操作
  • ✅ 防后台数据泄露:App 切到后台时,最近任务列表显示为隐私模式(全黑或模糊)
  • ✅ 一键开关:preventScreenshotOn() / preventScreenshotOff() 极简 API
  • ✅ 生命周期完备:在 initState 开启,在 dispose 关闭,不留安全漏洞
  • ✅ 系统级能力:基于鸿蒙 window.setWindowPrivacyMode,非模拟方案
  • ✅ 权限自动处理:插件自动申请 ohos.permission.PRIVACY_WINDOW 权限
  • ✅ 轻量无依赖:纯 Dart + ArkTS,无第三方依赖
  • ✅ v1.0.0 稳定版:已发布正式版,可在生产环境使用

快速上手

1. 添加依赖

dependencies:
  screen_protector_ohos: ^1.0.0
flutter pub get

无需额外依赖其他平台包,该插件仅面向 HarmonyOS,Android 和 iOS 仍用主项目 screen_protector。

2. 防截屏 —— 在敏感页面启用

import 'package:screen_protector_ohos/screen_protector_ohos.dart';

class SecurePaymentPage extends StatefulWidget {
  @override
  _SecurePaymentPageState createState() => _SecurePaymentPageState();
}

class _SecurePaymentPageState extends State<SecurePaymentPage> {
  @override
  void initState() {
    _preventScreenshotOn();
    super.initState();
  }

  @override
  void dispose() {
    _preventScreenshotOff();
    super.dispose();
  }

  void _preventScreenshotOn() async {
    await ScreenProtector.preventScreenshotOn();
  }

  void _preventScreenshotOff() async {
    await ScreenProtector.preventScreenshotOff();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('安全支付')),
      body: Center(
        child: Text('此页面已开启防截屏保护'),
      ),
    );
  }
}

3. 防后台数据泄露 —— 保护应用隐私

import 'package:screen_protector_ohos/screen_protector_ohos.dart';

class ProtectDataLeakagePage extends StatefulWidget {
  @override
  _ProtectDataLeakagePageState createState() => _ProtectDataLeakagePageState();
}

class _ProtectDataLeakagePageState extends State<ProtectDataLeakagePage> {
  @override
  void initState() {
    _protectDataLeakageOn();
    super.initState();
  }

  @override
  void dispose() {
    _protectDataLeakageOff();
    super.dispose();
  }

  void _protectDataLeakageOn() async {
    await ScreenProtector.protectDataLeakageOn();
  }

  void _protectDataLeakageOff() async {
    await ScreenProtector.protectDataLeakageOff();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('隐私保护')),
      body: Center(
        child: Text('切换到后台试试,最近任务列表不会显示此页面内容'),
      ),
    );
  }
}

4. 全局启用(推荐做法)

对于全 App 都需要保护的应用,可以在 MaterialApp 的 navigatorObservers 中结合路由钩子统一管理:

class AppLifecycleObserver extends NavigatorObserver {
  @override
  void didPush(Route route, Route? previousRoute) {
    if (route.settings.name == '/payment') {
      ScreenProtector.preventScreenshotOn();
    }
  }

  @override
  void didPop(Route route, Route? previousRoute) {
    if (route.settings.name == '/payment') {
      ScreenProtector.preventScreenshotOff();
    }
  }
}

鸿蒙侧实现原理

如果你好奇它背后是怎么工作的,底层其实调用了鸿蒙的 window.setWindowPrivacyMode() API:

import { window } from '@kit.ArkUI';
import abilityAccessCtrl from '@ohos.abilityAccessCtrl';

// 获取当前窗口
const windowClass = await window.getLastWindow(context);

// 开启隐私模式(防截屏 + 防后台泄露)
windowClass.setWindowPrivacyMode(true, (err) => {
  if (err) {
    console.error('Failed to set privacy mode');
  }
});

setWindowPrivacyMode(true) 是一个系统级开关,开启后:

  • 截图操作会被拦截,截屏结果为空白或黑屏
  • App 切到后台时,最近任务列表中的预览图显示为隐私模式
  • 屏幕录制也无法捕获该窗口内容

这个 API 需要 ohos.permission.PRIVACY_WINDOW 权限,插件在 onMethodCall 中通过 abilityAccessCtrl.createAtManager().requestPermissionsFromUser() 自动申请,开发者无需手动处理。


与 Android / iOS 方案对比

对比项 Android (FLAG_SECURE) iOS (UIApplication) HarmonyOS (screen_protector_ohos)
防截屏 ✅ 支持 ✅ 支持 ✅ 支持
防后台泄露 ✅ 支持 ✅ 模糊/图片遮盖 ✅ 隐私模式
API 风格 window.setFlags(...) UIApplication 通知 window.setWindowPrivacyMode()
权限要求 无需额外权限 无需额外权限 PRIVACY_WINDOW(自动申请)
生命周期管理 手动处理 手动处理 手动处理
Flutter 封装 已有 已有 ✅ screen_protector_ohos

注意:screen_protector_ohos 目前只提供 HarmonyOS 实现。如果你的项目同时支持 Android 和 iOS,建议搭配原版 screen_protector 主包(screen_protector: ^1.2.0)一起使用,保持 API 统一。


环境要求

  • Flutter SDK >= 2.5.0(兼容性极好,老项目也能用)
  • Dart SDK >= 2.19.6 < 4.0.0
  • 鸿蒙系统 API 9+
  • 真机测试(模拟器同样支持 PRIVACY_WINDOW 权限)

实际应用场景

场景 说明
💳 支付页面 防止支付密码界面被截屏或录屏
🔑 登录/注册 保护密码输入框不被截屏记录
📄 合同/协议 敏感商业文档查看时禁止截屏
🏦 银行/理财 App 账户余额、交易记录等敏感信息保护
🏥 医疗健康 病历、处方等隐私数据保护
💼 企业办公 内部 OA、审批流程中的敏感信息

写在最后

screen_protector_ohos 是一个非常「小而美」的插件——它的 API 只有 4 个静态方法,但解决的是安全合规场景下的刚需问题。

说实话,这个插件的功能本身并不复杂。鸿蒙系统提供了 window.setWindowPrivacyMode 这个底层 API,插件只是把它从 ArkTS 桥接到了 Flutter。但正是这种「一插即用」的封装,让 Flutter 开发者不用去翻鸿蒙文档、不用理解 abilityAccessCtrl 和 BusinessError,就能在 Flutter 侧一行代码搞定安全保护。

目前 v1.0.0 已经是正式版,由 OpenHarmony SIG 社区维护,可以直接在生产环境使用。如果你正在开发金融、支付、企业办公类 App,这个插件值得加入你的安全工具箱。

至此,「鸿蒙Flutter插件精选」系列已经介绍了 27 个插件!从应用标识、包名修改,到地图、AI、分享、安全……覆盖了鸿蒙 Flutter 开发的方方面面。如果你有想了解的插件,欢迎留言告诉我!🦊


仓库:https://pub.dev/packages/screen_protector_ohos

项目源码:https://gitee.com/openharmony-sig/fluttertpc_screen_protector

觉得好用给个 ⭐ Star 支持一下作者呀~

下期预告:你还希望看到哪个鸿蒙 Flutter 插件的介绍?欢迎留言告诉我

最新文章

随机文章