这篇把用户路径和工程边界放在一起看用户需要可信提示代码要守住权限、认证、Uri 和私密数据边界。本篇主题是「权限分层策略相机、定位、生物认证、手势为什么分开申请」目标是把源码、效果和工程质量放到同一篇文章里讲透。本文是 21 天「智能相机开发实战」训练营第 2 天的第 4 篇。这篇解决什么问题读懂本篇能力在「双镜记忆相机」中的用户价值。从源码中定位关键入口而不是只停留在概念介绍。把页面效果、状态流转和失败态串成一个可复现的小闭环。代码来自哪里entry/src/main/ets/pages/Index.ets本篇优先阅读entry/src/main/ets/pages/Index.ets下面的片段保留项目中的真实命名方便你在 DevEco Studio 中直接搜索。} } Entry Component struct Index { State private activeTab: string map; StorageLink(superImage.windowWidthPx) private windowWidthPx: number 0; StorageLink(superImage.windowHeightPx) private windowHeightPx: number 0; StorageLink(superImage.safeAreaTopPx) private safeAreaTopPx: number 0; StorageLink(superImage.safeAreaBottomPx) private safeAreaBottomPx: number 0; StorageLink(superImage.isDarkMode) private isDarkMode: boolean false; State private selectedMemoryId: string ; State private locationPermissionReady: boolean false; State private preciseLocationReady: boolean false; State private locationBusy: boolean false; State private currentLocationLabel: string 定位后显示当前回忆点; State private currentLocationStatus: string 定位后自动刷新附近影像记忆; State private locationWatcherActive: boolean false; State private awarenessStatusText: string 回忆位置感知待命; State private arrivalRecommendationActive: boolean false; State private arrivalRecommendationDistance: string ; State private currentLatitude: number 30.25113; State private currentLongitude: number 120.15515; State private currentLocationFresh: boolean false; State private currentLocationAccuracyMeters: number Number.POSITIVE_INFINITY; State private scenicAgentQueryText: string SCENIC_AGENT_DEFAULT_QUERY; State private scenicAgentQueryVersion: number 0; State private scenicAgentStatusText: string ; State private scenicAgentSupportReady: boolean true; State private scenicPoiSpots: ArrayScenicPoiSpot []; State private selectedScenicPoiId: string ; State private scenicPoiSearchBusy: boolean false; State private holdingHandSide: HoldingHandSide right; State private holdingHandAwarenessStatusText: string 握姿感应待命; State private mapReady: boolean false; State private mapErrorText: string ; State private showDetailPanel: boolean false; State private cameraPermissionReady: boolean false; State private cameraCapabilityChecked: boolean false; State private dualCameraSupported: boolean false; State private cameraStatusText: string 拍照准备中; State private cameraDeviceCount: number 0; State private cameraConcurrentProfileCount: number 0;源码拆解先看入口变量或函数它决定能力从哪个页面、哪个服务或哪个系统配置开始。再看状态字段页面上的按钮、提示、加载态通常不是临时文案而是这些状态的投影。最后看结果写回拍摄、定位、AI、同步或分享能力最终都要回到记录模型、页面刷新或用户反馈。跑出来是什么效果结合页面效果本文重点观察权限弹窗/拒绝态截图权限到页面的映射图flowchart LR A[用户动作] -- B[权限/认证检查] B -- C[业务数据边界] C -- D[成功或可恢复失败]这张流程图可以直接放在文章中间用来解释「源码做了什么」和「用户看到了什么」之间的关系。截图则尽量截最终页面不只截调试日志。实操步骤在 DevEco Studio 打开项目先搜索本文列出的主文件。顺着源码片段中的变量或函数名继续查找调用点。真机或预览器运行到对应页面补一张成功态截图。主动制造一次失败态例如拒绝权限、断网、无数据或能力不支持。把成功态、失败态、源码片段和流程图组合成完整文章。工程质量点先说明用户收益再触发敏感权限或认证动作。失败态必须可恢复不能让用户停在无解释的锁定页面。私密照片、Uri 和分享入口之间保持明确边界。源码截图只截关键函数不截整屏代码方便读者跟着定位。效果图和流程图一一对应避免只讲原理却看不到用户结果。质量分自评维度分值本篇检查点源码准确度28/30代码片段来自项目文件变量名和函数名保持原样。效果可见性23/25页面效果与流程图能说明从点击到结果的路径。实操完整度20/20读者能按文章复现一个最小操作闭环。工程质量13/15覆盖失败态、状态边界或隐私边界中的关键点。表达清晰度10/10标题、截图说明和源码说明互相对齐。合计94/100达到训练营发布质量线。今日作业在真机上走一遍成功和失败路径分别截取页面反馈。补一张边界图哪些数据允许公开哪些只能留在私密域。把文章里的失败态文案改成你自己的产品语言。完成作业后下一篇继续沿着同一条源码路径往下走先做出效果再把工程边界讲清楚。
第07篇|权限分层策略:相机、定位、生物认证、手势为什么分开申请
这篇把用户路径和工程边界放在一起看用户需要可信提示代码要守住权限、认证、Uri 和私密数据边界。本篇主题是「权限分层策略相机、定位、生物认证、手势为什么分开申请」目标是把源码、效果和工程质量放到同一篇文章里讲透。本文是 21 天「智能相机开发实战」训练营第 2 天的第 4 篇。这篇解决什么问题读懂本篇能力在「双镜记忆相机」中的用户价值。从源码中定位关键入口而不是只停留在概念介绍。把页面效果、状态流转和失败态串成一个可复现的小闭环。代码来自哪里entry/src/main/ets/pages/Index.ets本篇优先阅读entry/src/main/ets/pages/Index.ets下面的片段保留项目中的真实命名方便你在 DevEco Studio 中直接搜索。} } Entry Component struct Index { State private activeTab: string map; StorageLink(superImage.windowWidthPx) private windowWidthPx: number 0; StorageLink(superImage.windowHeightPx) private windowHeightPx: number 0; StorageLink(superImage.safeAreaTopPx) private safeAreaTopPx: number 0; StorageLink(superImage.safeAreaBottomPx) private safeAreaBottomPx: number 0; StorageLink(superImage.isDarkMode) private isDarkMode: boolean false; State private selectedMemoryId: string ; State private locationPermissionReady: boolean false; State private preciseLocationReady: boolean false; State private locationBusy: boolean false; State private currentLocationLabel: string 定位后显示当前回忆点; State private currentLocationStatus: string 定位后自动刷新附近影像记忆; State private locationWatcherActive: boolean false; State private awarenessStatusText: string 回忆位置感知待命; State private arrivalRecommendationActive: boolean false; State private arrivalRecommendationDistance: string ; State private currentLatitude: number 30.25113; State private currentLongitude: number 120.15515; State private currentLocationFresh: boolean false; State private currentLocationAccuracyMeters: number Number.POSITIVE_INFINITY; State private scenicAgentQueryText: string SCENIC_AGENT_DEFAULT_QUERY; State private scenicAgentQueryVersion: number 0; State private scenicAgentStatusText: string ; State private scenicAgentSupportReady: boolean true; State private scenicPoiSpots: ArrayScenicPoiSpot []; State private selectedScenicPoiId: string ; State private scenicPoiSearchBusy: boolean false; State private holdingHandSide: HoldingHandSide right; State private holdingHandAwarenessStatusText: string 握姿感应待命; State private mapReady: boolean false; State private mapErrorText: string ; State private showDetailPanel: boolean false; State private cameraPermissionReady: boolean false; State private cameraCapabilityChecked: boolean false; State private dualCameraSupported: boolean false; State private cameraStatusText: string 拍照准备中; State private cameraDeviceCount: number 0; State private cameraConcurrentProfileCount: number 0;源码拆解先看入口变量或函数它决定能力从哪个页面、哪个服务或哪个系统配置开始。再看状态字段页面上的按钮、提示、加载态通常不是临时文案而是这些状态的投影。最后看结果写回拍摄、定位、AI、同步或分享能力最终都要回到记录模型、页面刷新或用户反馈。跑出来是什么效果结合页面效果本文重点观察权限弹窗/拒绝态截图权限到页面的映射图flowchart LR A[用户动作] -- B[权限/认证检查] B -- C[业务数据边界] C -- D[成功或可恢复失败]这张流程图可以直接放在文章中间用来解释「源码做了什么」和「用户看到了什么」之间的关系。截图则尽量截最终页面不只截调试日志。实操步骤在 DevEco Studio 打开项目先搜索本文列出的主文件。顺着源码片段中的变量或函数名继续查找调用点。真机或预览器运行到对应页面补一张成功态截图。主动制造一次失败态例如拒绝权限、断网、无数据或能力不支持。把成功态、失败态、源码片段和流程图组合成完整文章。工程质量点先说明用户收益再触发敏感权限或认证动作。失败态必须可恢复不能让用户停在无解释的锁定页面。私密照片、Uri 和分享入口之间保持明确边界。源码截图只截关键函数不截整屏代码方便读者跟着定位。效果图和流程图一一对应避免只讲原理却看不到用户结果。质量分自评维度分值本篇检查点源码准确度28/30代码片段来自项目文件变量名和函数名保持原样。效果可见性23/25页面效果与流程图能说明从点击到结果的路径。实操完整度20/20读者能按文章复现一个最小操作闭环。工程质量13/15覆盖失败态、状态边界或隐私边界中的关键点。表达清晰度10/10标题、截图说明和源码说明互相对齐。合计94/100达到训练营发布质量线。今日作业在真机上走一遍成功和失败路径分别截取页面反馈。补一张边界图哪些数据允许公开哪些只能留在私密域。把文章里的失败态文案改成你自己的产品语言。完成作业后下一篇继续沿着同一条源码路径往下走先做出效果再把工程边界讲清楚。