1. 为什么权限设计要提前做

鸿蒙应用访问相机、定位、麦克风、通讯录、文件等能力时,需要遵守权限模型。权限不是上线前补一个申请弹窗就行,而是产品、交互、开发共同设计的安全边界。什么时候申请、为什么申请、申请失败怎么降级,都应该在功能设计阶段想清楚。

2. 权限分为配置和运行时申请

部分权限需要在 module.json5 中声明,部分敏感权限还需要运行时向用户申请。声明只表示应用可能使用该能力,真正访问时还要看用户是否授权。开发者要区分“配置了权限”和“已经拿到权限”,不要在未授权时直接调用敏感 API。

图 1  权限分为配置和运行时申请

3. 最小化原则

只申请当前功能必须的权限,不要为了省事一次性申请一堆。用户进入拍照上传病历页面时申请相机比较合理;刚打开首页就申请相机、麦克风、定位,会让用户不信任。权限越敏感,申请时机越要贴近真实操作。

4. 申请前先说明用途

系统权限弹窗通常很短,用户不一定理解为什么需要权限。应用可以在弹窗前用自己的说明页告诉用户用途,例如“用于拍摄护理记录照片,不会访问相册其他内容”。说明要具体,不要写空泛的“为了提供更好服务”。

图 2  申请前先说明用途

5. 授权结果要分支处理

用户可能同意、拒绝,也可能永久拒绝。代码不能只写授权成功路径。拒绝后应允许用户继续使用不依赖该权限的功能;如果功能必须依赖权限,要给出明确原因和重新授权入口。对于永久拒绝,通常需要引导用户到系统设置中修改。

6. 医护场景的数据合规

医护相关应用可能处理患者姓名、诊断、检查结果、护理记录、影像资料等敏感信息。即使权限申请通过,也不代表可以随意采集和保存。要坚持目的限定、最小必要、用户可知、数据安全的原则,日志、缓存、截图、导出文件都要纳入合规范围。

图 3  医护场景的数据合规

7. 权限状态要集中管理

权限判断不要散落在各个页面。可以封装 PermissionManager,提供 checkCamera、requestLocation、ensureMicrophone 等方法。页面只调用业务化方法,权限名称、请求码、失败提示集中维护。这样后续调整文案或策略更容易。

8. 功能降级设计

没有权限不等于功能完全不可用。没有相机权限可以允许从文件选择;没有定位权限可以手动填写位置;没有麦克风权限可以改用文字输入。降级方案能减少用户挫败感,也体现应用对用户选择的尊重。

图 4  功能降级设计

9. 测试权限要覆盖多路径

权限测试要覆盖首次授权、拒绝后再次申请、永久拒绝、系统设置打开后返回、卸载重装、升级后权限变化等路径。很多 bug 都发生在“用户不是第一次进来”的场景,比如按钮状态没更新、拒绝后仍然调用 API、设置返回后页面不刷新。

10. 权限文案要具体

权限说明文案越具体,用户越容易理解。不要只写“需要相机权限”,而要写“用于拍摄护理记录照片,照片仅用于本次记录上传”。不要只写“需要定位权限”,而要写“用于记录上门护理服务位置,可手动填写替代”。具体文案既能减少用户抵触,也能帮助团队检查申请权限是否真的必要。

11. 角色权限和系统权限不同

系统权限解决的是应用能不能访问设备能力,角色权限解决的是用户能不能访问某个业务数据。护士能打开相机,不代表护士可以查看所有患者病历;医生能读取报告,也不代表可以导出所有科室数据。医护应用要同时处理系统权限、账号角色、数据范围和操作审计。

12. 敏感操作要二次确认

删除护理记录、导出患者资料、上传病历图片、修改医嘱状态等操作,即使权限满足,也应考虑二次确认。二次确认不是为了打扰用户,而是降低误操作风险。确认文案要说明后果,例如“删除后将无法在本地恢复”,或者“导出文件可能包含患者隐私信息”。

13. 数据留痕和审计

医护场景经常需要追溯谁在什么时间查看、修改或导出了数据。前端可以配合后端记录操作来源、功能入口、时间和业务对象,但不要在本地长期保存敏感审计内容。审计日志要可追溯,也要避免泄露患者隐私。

14. 退出登录后的清理

用户退出登录时,不应只清空 token。缓存的患者列表、最近查看记录、临时图片、搜索历史、表单草稿都可能包含敏感信息。可以按账号维度隔离缓存,退出时清理账号相关数据;再次登录后重新拉取必要信息。

15. 安全设计要能被用户理解

安全合规不能只藏在代码里,也要体现在用户能理解的交互中。比如上传检查报告前提示用途,导出患者资料时提醒保存风险,拍摄护理记录时说明图片会关联到哪条记录。用户知道数据为什么被采集、会被用到哪里、如何撤销或清理,才更容易信任应用。

16. 权限变化后要刷新页面状态

用户可能在系统设置里修改权限,然后回到应用继续操作。页面不能只在首次进入时检查权限,而要在返回前台、点击功能按钮或重新进入页面时再次确认。比如用户刚在设置里打开相机权限,上传按钮应该从不可用变为可用;如果用户关闭定位权限,上门护理页面也要及时切换到手动填写模式。

17. 本文小结

权限和安全不是单独的技术点,而是用户信任的一部分。鸿蒙应用要把权限声明、运行时申请、用途说明、失败降级、敏感数据保护、角色控制、退出清理和用户可理解的安全提示统一考虑。尤其是医护相关应用,更要避免过度采集和随意记录敏感信息。

16. 权限处理对比表

环节

不推荐做法

推荐做法

申请时机

应用启动立刻申请所有权限

用户触发具体功能时再申请

失败处理

拒绝后直接不可用

提供解释、重试或降级方案

敏感数据

日志完整打印患者信息

脱敏、最小化、必要时加密

17. 案例代码:申请相机权限

import { abilityAccessCtrl, Permissions } from '@kit.AbilityKit';

const CAMERA_PERMISSION: Permissions = 'ohos.permission.CAMERA';

async function requestCameraPermission(context: Context): Promise<boolean> {

  const atManager = abilityAccessCtrl.createAtManager();

  const result = await atManager.requestPermissionsFromUser(context, [CAMERA_PERMISSION]);

  return result.authResults.length > 0 && result.authResults[0] === 0;

}

权限申请函数返回布尔结果,页面根据结果决定打开相机还是展示降级入口。不要在未授权时直接调用相机能力。

18. 案例代码:权限失败后的降级

async function handleUploadPhoto(context: Context): Promise<void> {

  const granted = await requestCameraPermission(context);

  if (granted) {

    openCameraForNursingRecord();

  } else {

    showToast('未授权相机,可改为从文件中选择护理记录图片');

    openFilePickerFallback();

  }

}

医护场景中,拒绝权限后也应尽量保留替代路径。例如不能拍照时允许选择已有报告,不能定位时允许手动填写地址。

参考资料

  • HarmonyOS 权限开发相关文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/
  • AbilityKit 权限 API 参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/
  • 华为开发者文档中心:https://developer.huawei.com/consumer/cn/doc/
Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐