【OpenHarmony/HarmonyOs 】CheckMe 隐私保护实践:禁止 AI 识图、精细化权限管控与本地数据边界

发布时间:2026/7/6 1:14:20

【OpenHarmony/HarmonyOs 】CheckMe 隐私保护实践:禁止 AI 识图、精细化权限管控与本地数据边界 【OpenHarmony/HarmonyOs 】CheckMe 隐私保护实践禁止 AI 识图、精细化权限管控与本地数据边界本文基于CheckMe项目展开主题聚焦安全与隐私并进一步结合“禁止 AI 识图”“精细化权限管控”“隐私保护方案”三个方向讲一个设备监控类 App 如何建立清晰的数据边界。设备信息类 App 很容易踩一个坑为了功能完整申请一堆权限为了体验智能接入一堆识别能力为了分析方便把数据传到服务端。但CheckMe这种应用的核心卖点恰恰应该是可信用户愿意让你读取设备状态用户愿意让你做硬件检测用户愿意让你临时获取位置用户不希望你偷偷识别图片、上传隐私、长期跟踪所以这篇文章的关键词不是“能拿多少数据”而是少拿、明示、本地、可拒绝。一、先看项目权限清单CheckMe在module.json5中声明了权限requestPermissions: [ {name:ohos.permission.GET_NETWORK_INFO,reason:$string:permission_network_reason,usedScene: {abilities: [EntryAbility],when:always} }, {name:ohos.permission.GET_WIFI_INFO,reason:$string:permission_network_reason,usedScene: {abilities: [EntryAbility],when:always} }, {name:ohos.permission.APPROXIMATELY_LOCATION,reason:$string:permission_location_reason,usedScene: {abilities: [EntryAbility],when:inuse} }, {name:ohos.permission.LOCATION,reason:$string:permission_location_reason,usedScene: {abilities: [EntryAbility],when:inuse} }, {name:ohos.permission.CAMERA,reason:$string:permission_camera_reason,usedScene: {abilities: [EntryAbility],when:inuse} } ]从这个配置能看出几个安全设计点网络状态权限用于展示网络信息定位权限仅在使用时申请相机权限用于手电筒、相机测试等明确功能没有声明相册读取权限没有声明人脸识别或生物认证权限没有声明后台定位这对“禁止 AI 识图”主题非常重要项目的媒体页只展示编解码和格式能力不读取用户图库不上传图片也不做云端识图。二、禁止 AI 识图从产品边界开始设计“禁止 AI 识图”不只是一个开关而是一套产品边界。在CheckMe中媒体能力页关注的是设备支持什么格式JPEGPNGWebPGIFBMPHEIF / HEICH.264 / H.265AV1HLS / DASH / RTSP对应服务代码如下public getSupportedImageFormats(): MediaCapability[] { return [ { capabilityId: image_jpeg, capabilityName: JPEG, supportedFormats: [jpg, jpeg], maxResolution: 16384x16384, isSupported: true, codecInfo: EXIF 支持 }, { capabilityId: image_png, capabilityName: PNG, supportedFormats: [png], maxResolution: 16384x16384, isSupported: true, codecInfo: 透明通道支持 }, { capabilityId: image_heif, capabilityName: HEIF / HEIC, supportedFormats: [heif, heic], maxResolution: 16384x16384, isSupported: true, codecInfo: 高效压缩 } ]; }注意这里只做“能力展示”没有读取用户图片也没有调用视觉识别模型。如果后续项目真的要接入 AI 识图我建议至少加三层保护默认关闭 AI 识图。每次识别前由用户主动选择图片。明确提示识别位置端侧识别还是云端识别。更严格一点可以增加一个配置项interfacePrivacySettings{ allowImageRecognition:boolean; allowCloudRecognition:boolean; allowSaveRecognitionHistory:boolean; }默认值应该是const defaultPrivacySettings:PrivacySettings{allowImageRecognition:false,allowCloudRecognition:false,allowSaveRecognitionHistory:false};这样写文章时就可以把“禁止 AI 识图”从口号落到工程方案上。三、精细化权限管控手电筒是一个好例子很多应用会在启动时一次性申请相机权限但CheckMe没有这么做。手电筒能力放在QuickToolsService中先查询能力和权限再在用户实际使用时申请。privateasyncisCameraPermissionGranted(context: common.UIAbilityContext):Promiseboolean {try{constatManager: abilityAccessCtrl.AtManager abilityAccessCtrl.createAtManager();consttokenId:number context.applicationInfo.accessTokenId;conststatus: abilityAccessCtrl.GrantStatusawaitatManager.checkAccessToken(tokenId,ohos.permission.CAMERA);returnstatus abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED; }catch(_e) {returnfalse; } }工具页展示能力时不触发权限弹窗publicasyncgetTorchCapabilityHint(context: common.UIAbilityContext):Promisestring {constcamManager: camera.CameraManager camera.getCameraManager(context);if(!camManager.isTorchSupported()) {return设备不支持; }constgranted:booleanawaitthis.isCameraPermissionGranted(context);if(!granted) {return需相机权限; }return可用; }这段很值得写进文章因为它体现了一个隐私友好的交互页面展示“需相机权限”不在用户没点击时弹窗用户点击手电筒时再申请用户拒绝后给出明确提示真正执行时才申请权限publicasyncensureCameraPermission(context: common.UIAbilityContext):Promiseboolean {constatManager: abilityAccessCtrl.AtManager abilityAccessCtrl.createAtManager();constrequest awaitatManager.requestPermissionsFromUser( context, [ohos.permission.CAMERA] );returnrequest.authResults!undefined request.authResults.length0 request.authResults[0] 0; }这种模式可以总结为先解释再申请先判断再执行。四、定位权限只在使用中申请并给出失败原因定位是隐私敏感能力项目中使用了近似位置和精确位置privateasyncrequestLocationPermissionsIfNeeded(context: common.UIAbilityContext):Promiseboolean {constwantPermissions:Permissions[] [ohos.permission.APPROXIMATELY_LOCATIONasPermissions,ohos.permission.LOCATIONasPermissions];constatManager: abilityAccessCtrl.AtManager abilityAccessCtrl.createAtManager();constresult awaitatManager.requestPermissionsFromUser( context, wantPermissions );returnresult.authResults!undefined result.authResults.every((v:number) v 0); }如果用户拒绝项目不会继续“硬拿数据”而是返回明确失败原因if(!permissionOk) { AppStorage.setOrCreate(locationAuthorized,false);return{ location:null, failureReason: LocationFailureReason.PERMISSION_DENIED, failureHint:定位权限被拒绝。请在系统设置中允许精确位置。}; }这类失败态非常重要。权限保护不是只写配置用户拒绝后页面仍然应该可理解为什么没有数据需要打开哪个权限不授权是否还能使用其他功能隐私友好的 App 不应该把“拒绝授权”当作异常而应该把它当作正常路径。五、隐私保护方案给数据分级对于CheckMe这样的应用可以把数据分为三类数据类型示例风险等级处理方式普通设备状态CPU、内存、电池百分比低本地展示环境与网络状态WiFi、IP、定位精度中按需展示不默认导出高敏感数据精确位置、图片、人脸高默认关闭用户主动触发项目已有的数据模型中包含 CPU、内存、网络、位置、相机、媒体等能力。如果要继续强化隐私可以增加一个统一的数据导出策略interfaceExportPolicy{ includeLocation:boolean; includeNetworkAddress:boolean; includeDeviceIdentifier:boolean; includeMediaFileMetadata:boolean; }默认导出时建议不导出精确经纬度不导出完整 IP 或设备唯一标识不导出图片 EXIF不保存用户图片内容不上传检测报告这样即使后续做近场分享、报告导出、AI 分析也有明确边界。六、本地优先设备监控数据不必上云CheckMe的大多数能力都可以本地完成CPU 信息本地读取内存信息本地读取存储信息本地读取电池信息本地读取媒体支持能力本地枚举硬件检测本地完成这给隐私保护提供了天然优势。文章里可以明确写出本地优先原则能在端侧计算的不上传。能展示摘要的不展示原始敏感数据。能让用户手动触发的不自动后台触发。能用一次性权限的不长期持有。如果后续接入端侧 AI也应该优先选择端侧推理而不是默认云端识别。端侧 AI 的优势不只是速度也包括数据不离开设备。七、禁止 AI 识图的 UI 表达建议如果要把这个主题继续做成产品能力可以在设置页增加一个“隐私保护”分组隐私保护[关闭]AI 图片识别[关闭]云端识别[关闭]保存识别历史[开启]报告导出前脱敏当用户进入媒体页时只展示图片格式支持视频编解码支持音频编解码支持流媒体协议支持如果用户点击“识别图片”再弹出说明该功能需要你主动选择图片。 默认仅在本机处理不上传原图。 你可以随时在隐私设置中关闭。这种表达比简单写一句“我们重视隐私”更有说服力。八、文章小结CheckMe这个项目适合用来写隐私保护主题因为它天然涉及多个敏感边界相机权限定位权限网络状态媒体能力设备状态桌面卡片数据但它的实现思路比较克制不启动时乱弹权限不读取用户图库不默认做 AI 识图不把位置失败当崩溃不把所有数据都上传能本地处理就本地处理最后总结成一句话一个好的 HarmonyOS 工具类应用不是能拿多少权限而是能把权限用得多克制。️参考资料华为开发者文档Requesting User Authorization华为开发者文档Application Permission Request Best Practices华为开发者文档Core Vision Kit

相关新闻