上一期我们聊了 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
- 真机测试(模拟器同样支持
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 插件的介绍?欢迎留言告诉我