鸿蒙 ArkTS 隐私模式防护:系统级截屏/录屏拦截方案
文章目录前言️ 核心机制窗口级隐私保护防护链路 状态驱动的双页面切换普通页面currentTab 0敏感页面currentTab 1切换逻辑⏱️ 生命周期自动防护️ 手动控制与状态监控手动开关状态展示 防护日志完整代码 设计亮点与最佳实践总结前言这段代码实现了一个完整的隐私模式防护方案核心利用 HarmonyOS 的setWindowPrivacyModeAPI在敏感页面自动开启系统级截屏/录屏拦截防止用户敏感数据被泄露。️ 核心机制窗口级隐私保护与权限管理不同隐私模式不需要用户授权而是由应用主动告知系统窗口管理器WM“这个窗口的内容不允许被截屏或录屏捕获”。开启后截屏/录屏只会得到黑屏或系统拦截提示。防护链路代码中的FlowSection清晰展示了四个关键步骤步骤操作说明1声明权限ohos.permission.PRIVACY_WINDOW2getLastWindow获取当前 UIAbility 的主窗口实例3setWindowPrivacyMode(true)通知 WM 禁止截屏/录屏4生命周期绑定敏感页onPageShow开启 /onPageHide关闭 状态驱动的双页面切换代码通过 Tab 切换模拟了两个页面场景直观展示隐私模式的按需开关策略。普通页面currentTab 0BuilderNormalPageSection(){// 未启用隐私模式截屏/录屏可正常捕获Text(此页面未启用隐私模式系统截屏和录屏可正常捕获窗口内容。)}适用于首页、商品列表等非敏感场景用户可正常截屏分享。敏感页面currentTab 1BuilderSensitivePageSection(){// 隐私模式保护中截屏/录屏将被拦截this.SensitiveRow(银行卡号,SENSITIVE_CARD_NO)this.SensitiveRow(身份证号,SENSITIVE_ID_MASKED)this.SensitiveRow(账户余额,SENSITIVE_BALANCE)}展示银行卡号、身份证号、账户余额等敏感信息进入此页时自动开启防护。切换逻辑privateswitchTab(index:number):void{this.currentTabindexif(index1){PrivacyModeService.enable(切换至敏感页)// 进入敏感页 → 开启防护}else{PrivacyModeService.disable(切换至普通页)// 回到普通页 → 关闭防护}}⏱️ 生命周期自动防护除了手动切换代码还通过页面生命周期实现自动化的隐私防护这是生产环境中最推荐的做法。onPageShow():void{if(this.currentTab1){PrivacyModeService.enable(敏感页 onPageShow)// 页面可见时开启}}onPageHide():void{PrivacyModeService.disable(页面 onPageHide)// 页面隐藏时关闭}这确保了即使用户通过其他方式如系统多任务切换进入敏感页面防护也能自动生效。️ 手动控制与状态监控手动开关ControlSection提供了一个 Toggle 开关允许开发者在调试时手动控制隐私模式Toggle({type:ToggleType.Switch,isOn:this.privacyEnabled}).onChange((on:boolean){if(on){PrivacyModeService.enable(手动 Toggle)}else{PrivacyModeService.disable(手动 Toggle)}})状态展示HeaderSection实时展示防护状态防护中绿色标签#4ADE80表示隐私模式已启用状态文字根据privacyEnabled显示绿色已启用或黄色未启用窗口信息显示窗口 ID 和当前触发场景方便调试定位 防护日志LogSection记录每一次隐私模式的开关操作包括时间戳、触发层级和详细信息ForEach(this.logs,(item:PrivacyLogItem){Column({space:2}){Text([${item.time}]${item.layer})// 如 [19:25:00] SERVICEText(item.message)// 如 隐私模式已开启: 切换至敏感页}})这些日志对于排查为什么某个页面没有被保护或隐私模式是否被意外关闭等问题非常关键。完整代码import{common}fromkit.AbilityKitimport{PrivacyBridge,PrivacyModeService}from../privacy/PrivacyModeServiceimport{PrivacyLogItem,SENSITIVE_BALANCE,SENSITIVE_CARD_NO,SENSITIVE_ID_MASKED}from../privacy/PrivacyModeTypesEntryComponentstructPrivacyModeDemo{StorageLink(privacyEnabled)privacyEnabled:booleanfalseStorageLink(privacyStatus)privacyStatus:stringStorageLink(privacyWindowId)privacyWindowId:number0StorageLink(activeScene)activeScene:stringStorageLink(privacyLogs)logs:PrivacyLogItem[][]StorageLink(demoMode)demoMode:booleanfalseStatecurrentTab:number0private context:common.UIAbilityContextthis.getUIContext().getHostContext()ascommon.UIAbilityContextaboutToAppear():void{PrivacyModeService.bindContext(this.context)PrivacyModeService.disable(应用启动)}onPageShow():void{if(this.currentTab1){PrivacyModeService.enable(敏感页 onPageShow)}}onPageHide():void{PrivacyModeService.disable(页面 onPageHide)}build(){Scroll(){Column({space:12}){this.HeaderSection()this.TabSection()if(this.currentTab0){this.NormalPageSection()}else{this.SensitivePageSection()}this.ControlSection()this.FlowSection()this.LogSection()}.width(100%).padding(16)}.width(100%).height(100%).backgroundColor(#0F172A)}BuilderHeaderSection(){Column({space:6}){Row({space:8}){Text(隐私模式防护).fontSize(20).fontWeight(FontWeight.Bold).fontColor(#F8FAFC)if(this.privacyEnabled){Text(防护中).fontSize(11).fontColor(#4ADE80).padding({left:6,right:6,top:2,bottom:2}).backgroundColor(#14532D).borderRadius(4)}}Text(setWindowPrivacyMode · 系统级截屏/录屏拦截).fontSize(12).fontColor(#94A3B8)Text(this.privacyStatus).fontSize(11).fontColor(this.privacyEnabled?#4ADE80:#FBBF24)Text(窗口 ID:${this.privacyWindowId}· 场景:${this.activeScene}).fontSize(10).fontColor(#64748B)}.width(100%).alignItems(HorizontalAlign.Start)}BuilderTabSection(){Row({space:8}){Button(普通页面).fontSize(12).layoutWeight(1).backgroundColor(this.currentTab0?#1D4ED8:#334155).onClick((){this.switchTab(0)})Button(敏感页面).fontSize(12).layoutWeight(1).backgroundColor(this.currentTab1?#7F1D1D:#334155).onClick((){this.switchTab(1)})}.width(100%)}BuilderNormalPageSection(){Column({space:8}){Text(公开内容区).fontSize(14).fontColor(#E2E8F0)Text(此页面未启用隐私模式系统截屏和录屏可正常捕获窗口内容。).fontSize(12).fontColor(#94A3B8)Text(适合首页、商品列表等非敏感场景。).fontSize(11).fontColor(#64748B)}.width(100%).padding(12).backgroundColor(#1E293B).borderRadius(10)}BuilderSensitivePageSection(){Column({space:10}){Row({space:6}){Text().fontSize(16)Text(敏感信息区隐私模式保护).fontSize(14).fontWeight(FontWeight.Medium).fontColor(#FCA5A5)}this.SensitiveRow(银行卡号,SENSITIVE_CARD_NO)this.SensitiveRow(身份证号,SENSITIVE_ID_MASKED)this.SensitiveRow(账户余额,SENSITIVE_BALANCE)Text(真机测试进入此页后尝试截屏/录屏应得到黑屏或系统拦截提示。).fontSize(11).fontColor(#FDE68A)}.width(100%).padding(12).backgroundColor(#450A0A).borderRadius(10).border({width:1,color:#7F1D1D})}BuilderSensitiveRow(label:string,value:string){Row(){Text(label).fontSize(12).fontColor(#FECACA).width(72)Text(value).fontSize(14).fontWeight(FontWeight.Medium).fontColor(#F8FAFC).layoutWeight(1)}.width(100%)}BuilderControlSection(){Column({space:8}){Row(){Text(手动开关).fontSize(13).fontColor(#E2E8F0)Blank()Toggle({type:ToggleType.Switch,isOn:this.privacyEnabled}).onChange((on:boolean){if(on){PrivacyModeService.enable(手动 Toggle)}else{PrivacyModeService.disable(手动 Toggle)}})}.width(100%)Button(刷新窗口状态).width(100%).fontSize(12).onClick((){PrivacyModeService.refreshStatus()})}.width(100%).padding(12).backgroundColor(#172554).borderRadius(10)}BuilderFlowSection(){Column({space:6}){Text(防护链路).fontSize(13).fontColor(#E2E8F0)this.FlowRow(1,声明权限,ohos.permission.PRIVACY_WINDOW)this.FlowRow(2,getLastWindow,获取当前 UIAbility 主窗口)this.FlowRow(3,setWindowPrivacyMode(true),通知 WM 禁止截屏/录屏)this.FlowRow(4,生命周期,敏感页 onPageShow 开 / onPageHide 关)}.width(100%).padding(12).backgroundColor(#1E293B).borderRadius(10)}BuilderLogSection(){Column({space:6}){Row(){Text(防护日志).fontSize(13).fontColor(#E2E8F0)Blank()Text(${this.logs.length}条).fontSize(12).fontColor(#38BDF8)}.width(100%)if(this.logs.length0){Text(切换至敏感页面或打开开关…).fontSize(12).fontColor(#64748B)}else{ForEach(this.logs,(item:PrivacyLogItem){Column({space:2}){Text([${item.time}]${item.layer}).fontSize(11).fontColor(#F472B6)Text(item.message).fontSize(11).fontColor(#CBD5E1)}.width(100%).alignItems(HorizontalAlign.Start)},(item:PrivacyLogItem)item.id)}}.width(100%).padding(12).backgroundColor(#1E293B).borderRadius(10)}BuilderFlowRow(index:string,title:string,detail:string){Row({space:10}){Text(index).fontSize(12).fontColor(#38BDF8).width(20)Column({space:2}){Text(title).fontSize(12).fontColor(#E2E8F0)Text(detail).fontSize(11).fontColor(#64748B)}.alignItems(HorizontalAlign.Start).layoutWeight(1)}.width(100%)}privateswitchTab(index:number):void{this.currentTabindexif(index1){PrivacyModeService.enable(切换至敏感页)}else{PrivacyModeService.disable(切换至普通页)}}} 设计亮点与最佳实践最小权限原则隐私模式仅在展示敏感信息时开启普通页面保持正常避免过度防护影响用户体验如用户想截屏分享商品。双重保障既有 Tab 切换时的主动开关又有onPageShow/onPageHide的生命周期兜底防止遗漏。服务层封装所有操作通过PrivacyModeService统一调度UI 层只负责展示和触发逻辑清晰、易于维护。全局状态同步使用StorageLink将privacyEnabled等状态提升到AppStorage确保任何页面都能感知当前防护状态。总结这段代码是 HarmonyOS 应用中敏感信息保护的标准实现模板。通过setWindowPrivacyMode这一系统级 API配合页面生命周期的自动管理构建了一个可靠、可控的隐私防护方案。对于金融、医疗、政务等涉及敏感数据的应用来说这是合规和安全的基本要求。

相关新闻

免费开源浏览器资源嗅探神器:猫抓插件完全指南与实战技巧

免费开源浏览器资源嗅探神器:猫抓插件完全指南与实战技巧

免费开源浏览器资源嗅探神器:猫抓插件完全指南与实战技巧 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 还在为网页视频无法下载而烦恼…

2026/7/10 3:20:57阅读更多 →
Claude Tag技术解析:从AI编程助手到团队记忆层的演进与实践

Claude Tag技术解析:从AI编程助手到团队记忆层的演进与实践

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 如果你正在使用 Claude Code 进行团队协作开发,可能会遇到这样的困境:每个成员都在各自的会话中工作&#xff…

2026/7/10 3:20:57阅读更多 →
sdma-dk终极指南:如何利用鲲鹏SDMA引擎实现无CPU高速数据传输

sdma-dk终极指南:如何利用鲲鹏SDMA引擎实现无CPU高速数据传输

sdma-dk终极指南:如何利用鲲鹏SDMA引擎实现无CPU高速数据传输 【免费下载链接】sdma-dk sdma-dk is a userspace driver that can make advantages of SDMA engine for moving data without CPU on Kunpeng chips. it has features like high bandwidth and low lat…

2026/7/10 3:20:57阅读更多 →
【单片机毕业设计】基于 STM32/51 单片机的 TOF400C 激光测距报警装置设计与实现,基于单片机的 4 米 TOF 激光测距声光预警系统开发(023401)

【单片机毕业设计】基于 STM32/51 单片机的 TOF400C 激光测距报警装置设计与实现,基于单片机的 4 米 TOF 激光测距声光预警系统开发(023401)

文章目录 20 个相关毕业设计备选题目项目研究背景摘要总体方案核心功能一、核心测量功能二、人机交互辅助功能三、超限预警核心功能 技术路线项目演示关于我们项目案例源码获取 博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业&#x1f6a…

2026/7/10 5:36:06阅读更多 →
GitHub项目pgrust:获280星、7次分叉,含代码、问题等多板块

GitHub项目pgrust:获280星、7次分叉,含代码、问题等多板块

【导语:在GitHub平台上,malisper的pgrust项目备受关注,拥有280颗星和7次分叉,涵盖代码、问题、拉取请求等多个板块,为开发者提供了丰富的功能与操作选项。】pgrust项目受关注:280星与7次分叉在GitHub上的ma…

2026/7/10 5:36:06阅读更多 →
【Bug已解决】Claude git conflict / Merge conflict in auto-edited files — Claude 自动编辑导致 Git 冲突解决方案

【Bug已解决】Claude git conflict / Merge conflict in auto-edited files — Claude 自动编辑导致 Git 冲突解决方案

【Bug已解决】Claude: "git conflict" / Merge conflict in auto-edited files — Claude 自动编辑导致 Git 冲突解决方案 1. 问题描述 Claude Code 自动编辑文件后产生 Git 合并冲突: # Git 冲突 $ claude --auto-approve "修复 src/index.js"…

2026/7/10 5:36:06阅读更多 →
域名选择与注册全攻略:打破建站公司的价格神话

域名选择与注册全攻略:打破建站公司的价格神话

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 1. 为什么域名价格被过度神话了 很多人第一次接触建站,最容易被建站公司引导去关注“好域名”的价值。他们会告诉你&…

2026/7/10 5:36:06阅读更多 →
区间修改,单点查询(模板)(差分构建)

区间修改,单点查询(模板)(差分构建)

区间修改,单点查询(模板) 问题描述 给定一个长度为 nn 的序列 aa,你需要进行 mm 次操作,每次操作为以下两种之一: 1 l r x:将 al∼ral∼r​ 的所有数字增加 xx。2 idx:输出当前 a…

2026/7/10 5:36:06阅读更多 →
PDF-XSS漏洞解析:从JavaScript注入到沙箱逃逸的攻防实战

PDF-XSS漏洞解析:从JavaScript注入到沙箱逃逸的攻防实战

1. 项目概述:当PDF不再是“安全文档”在大多数人的印象里,PDF文件就像一个数字化的“打印件”,格式固定、内容稳定,是传递合同、报告、电子书等正式文档的理想载体。这种“所见即所得”的特性,加上Adobe Reader等阅读器…

2026/7/10 5:31:06阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/9 5:56:19阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/9 9:45:20阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/10 4:59:05阅读更多 →
浏览器缓存行为深度解析:Chrome/Firefox/Safari 对 304 响应的 5 种触发场景对比

浏览器缓存行为深度解析:Chrome/Firefox/Safari 对 304 响应的 5 种触发场景对比

浏览器缓存行为深度解析:Chrome/Firefox/Safari 对 304 响应的 5 种触发场景对比当你在浏览器地址栏敲入一个网址时,背后可能隐藏着一场关于"要不要重新下载资源"的精密博弈。这场博弈的裁判是HTTP缓存机制,而304状态码则是这场博弈…

2026/7/10 0:00:01阅读更多 →
RoboWits:面向创造性问题求解的双臂机器人认知推理基准

RoboWits:面向创造性问题求解的双臂机器人认知推理基准

1. 项目概述:这不是又一个机器人抓取数据集,而是一次对“思考力”的压力测试 RoboWits——这个名字里藏着两个关键信号:“Robo”直指物理世界中的具身智能体,“Wits”则毫不掩饰地指向人类最核心的认知能力:机敏、判断…

2026/7/10 0:00:01阅读更多 →
5分钟完全指南:如何使用TegraRcmGUI图形化工具解锁Switch无限可能

5分钟完全指南:如何使用TegraRcmGUI图形化工具解锁Switch无限可能

5分钟完全指南:如何使用TegraRcmGUI图形化工具解锁Switch无限可能 【免费下载链接】TegraRcmGUI C GUI for TegraRcmSmash (Fuse Gele exploit for Nintendo Switch) 项目地址: https://gitcode.com/gh_mirrors/te/TegraRcmGUI TegraRcmGUI是一款专为Windows…

2026/7/10 0:00:01阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/9 9:45:20阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/9 15:50:44阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/9 14:14:17阅读更多 →