【OpenHarmony/HarmonyOs 】学习类 App 如何做好隐私保护:禁止 AI 识图、精细化权限与本地数据方案
【OpenHarmony/HarmonyOs 】学习类 App 如何做好隐私保护:禁止 AI 识图、精细化权限与本地数据方案
学习类 App 很容易被忽略隐私问题,因为它不像相机、社交、支付 App 那样天然“敏感”。但实际上,学习数据同样非常重要:年级、学习目标、错题、正确率、学习时长、薄弱知识点,这些都能反映用户的学习状态。对于学生群体来说,隐私保护更应该前置设计 🔐
本文结合我的 HarmonyOS NEXT / ArkTS 项目政治视界,整理一套适合学习工具的隐私保护方案:不滥用 AI 识图、不申请无关权限、用本地 Preferences 保存学习数据、把权限边界和数据边界说清楚。
一、项目当前权限状态:能不申请就不申请
先看项目的module.json5,当前主 Ability 声明非常克制:
{"module": {"name":"entry","deviceTypes": ["phone","tablet"],"abilities": [ {"name":"EntryAbility","srcEntry":"./ets/entryability/EntryAbility.ets","exported": true } ],"extensionAbilities": [ {"name":"EntryBackupAbility","type":"backup","exported": false } ] } }可以看到,项目没有声明相机、麦克风、相册、定位、通讯录等高敏权限。对于一个政治学习 App 来说,当前核心功能包括题库练习、笔记、闪卡、学习统计、每日政治阅读,并不需要访问这些能力。
这就是隐私设计的第一原则:不需要的权限,坚决不申请。
很多 App 会把“未来可能用到”当成申请权限的理由,但用户看到权限弹窗时,感受到的是不信任。学习类 App 如果一打开就要相机、位置、相册,很容易让人疑惑:我只是刷题,为什么要这些?
二、为什么要明确“禁止 AI 识图”
AI 识图能力很强,但学习 App 不应该默认打开它。比如拍照识题、识别笔记、扫描试卷,这些功能确实有价值,但也可能涉及:
- 学生姓名、学校、班级等个人信息;
- 试卷或作业中的隐私内容;
- 图片中出现其他同学或家庭环境;
- 用户不清楚图片是否上传云端;
- AI 分析结果是否被保存。
因此,我建议在这类项目中把 AI 识图设计成“可选能力”,而不是默认能力。
更稳妥的策略是:
默认状态:不启用 AI 识图 用户主动点击:进入拍照/选图流程 权限申请前:说明用途 识别前:展示图片预览 识别后:允许删除原图与结果 数据处理:优先端侧,不默认上传如果当前版本没有做拍照识题,就应该在文章、隐私说明和产品逻辑里明确:当前学习数据来自用户本地操作和内置题库,不进行后台识图分析。
三、本地数据保存:Preferences 适合轻量学习状态
项目当前使用@kit.ArkData的 Preferences 保存学习进度、错题、学习会话、目标和个人设置。
StorageManager.ets的核心封装如下:
import{ preferences }from'@kit.ArkData';import{ common }from'@kit.AbilityKit';constPREFERENCES_NAME='zhengzhi_prefs';classStorageManager{privateprefs: preferences.Preferences|null=null;asyncinit(context: common.UIAbilityContext):Promise<void> {if(this.prefs!==null) {return; }this.prefs=awaitpreferences.getPreferences(context,PREFERENCES_NAME); }getStringSync(key:string,defaultValue:string=''):string{if(!this.prefs) {returndefaultValue; }returnthis.prefs.getSync(key, defaultValue)asstring; }putString(key:string,value:string):void{if(!this.prefs) {return; }this.prefs.putSync(key, value);this.prefs.flush(); } }这种封装有几个优点:
- 数据只保存在本地;
- 页面不直接接触底层存储;
- 读写失败可以统一兜底;
- 后续切换数据库或加密存储时影响范围更小。
对于学习 App 来说,Preferences 适合保存轻量配置和状态,例如:
daily_goal 每日目标 today_progress 今日完成进度 wrong_questions 错题记录 study_sessions 学习会话 user_profile 用户昵称/年级 app_settings App 设置这些数据不需要默认上传云端,也不需要跨应用共享。放在本地,既简单又安全。
四、初始化顺序也会影响数据可靠性
隐私保护不只是“权限少”,还包括数据不要丢、不要错乱。项目里在EntryAbility.ets中有一个很关键的处理:先初始化 Preferences,再加载页面。
voidstorageManager.init(this.context).then(()=>{ windowStage.loadContent('pages/Index', appLocalStorage,(err)=>{if(err.code) {return; }voidthis.setupImmersiveWindow(windowStage); }); });为什么这点重要?
如果页面先加载,DataManager第一次读取时 Preferences 还没准备好,就可能读到默认空数据;如果此时又把“已初始化”标记设为 true,后面真实数据就不会再加载,造成学习记录异常。
这类问题表面看是 bug,本质上也是数据保护问题:用户的学习记录应该稳定可靠,不应该因为初始化时序丢失。
五、DataManager:统一管理学习数据边界
项目中DataManager是学习数据的中心,负责统计、错题、学习会话、成就和设置。
例如答题记录:
recordAnswer(question: Question,userAnswer:string,isCorrect:boolean): void { this.ensureInitialized(); this.studyStats.completedQuestions++;if(isCorrect) { this.studyStats.correctCount++; }if(!isCorrect) { this.addWrongQuestion(question,userAnswer); } this.saveStats(); this.recordSessionCore('quiz',question.category,isCorrect? 1 : 0); }这段代码体现了一个很好的边界:页面只负责用户交互,数据怎么记录由DataManager统一处理。后续如果要加入“隐私开关”,也可以集中放在这里:
是否记录错题:由设置决定 是否保存学习时长:由设置决定 是否生成学习画像:默认关闭 是否导出学习报告:用户主动触发这样不会出现每个页面各写一套保存逻辑,导致隐私规则不一致。
六、精细化权限管控建议
如果未来要加入拍照识题、语音朗读、云同步等能力,建议按功能拆分权限:
| 功能 | 是否默认开启 | 权限策略 |
|---|---|---|
| 本地刷题 | 是 | 不申请额外权限 |
| 本地笔记 | 是 | 不访问相册/文件,除非用户导入 |
| 拍照识题 | 否 | 用户点击时再申请相机权限 |
| 图片导入 | 否 | 用户选择图片时再触发 |
| 语音朗读 | 否 | 仅在语音功能中说明用途 |
| 云同步 | 否 | 登录并确认后再同步 |
| 学习报告分享 | 否 | 用户主动导出 |
权限申请文案也要具体,比如不要写“为了提供更好的服务”,而应该写:
用于拍摄题目并识别文字,不会在未确认前保存或上传图片。一句具体说明,比一大段泛泛隐私政策更能建立信任。
七、隐私保护产品方案
结合当前项目,我建议增加一个“隐私与数据”设置页,包含:
- 本地学习记录开关;
- 错题记录开关;
- 学习报告生成开关;
- 清空本地学习数据;
- 导出学习数据;
- AI 识图默认关闭说明;
- 权限使用记录说明。
在ProfilePage里已经有设置项入口,可以继续扩展:
@BuilderSettingItem(iconSymbol: string,title: string,value: string,showArrow: boolean,iconColor: string,icon: string,itemKey: string,routeUrl: string,titleColor: string) {Row() {Text(icon)Text(title).layoutWeight(1)if(value !=='') {Text(value) } }.onClick(() => {if(routeUrl !=='') {router.pushUrl({ url: routeUrl }); } }) }这类设置不一定第一版就全部实现,但架构上应该预留位置。
八、总结
学习类 App 的隐私保护,可以从三个层面做起:
- 权限最小化:不用相机、相册、定位,就不要申请。
- 数据本地化:学习进度、错题、目标优先保存在本地。
- AI 可控化:AI 识图必须用户主动触发,默认关闭,结果可删除。
政治视界当前版本已经具备一个很好的基础:没有滥用权限,学习数据通过StorageManager和DataManager本地管理,页面与数据逻辑边界清晰。后续如果加入 AI 识题、云同步或跨设备能力,也应该继续坚持“用户知道、用户同意、用户可控”的原则。
对开发者来说,隐私保护不是最后补一份协议,而是从第一行功能代码开始的架构选择 🛡️