第14篇|LocationKit 取当前位置:成功、失败、精度不足都要可解释
这篇围绕地图记忆体验展开,把定位、记录模型、Marker 状态和详情面板放在同一条路径里讲。本篇主题是「LocationKit 取当前位置:成功、失败、精度不足都要可解释」,目标是把源码、效果和工程质量放到同一篇文章里讲透。
本文是 21 天「智能相机开发实战」训练营第 4 天的第 1 篇。
这篇解决什么问题
- 读懂本篇能力在「双镜记忆相机」中的用户价值。
- 从源码中定位关键入口,而不是只停留在概念介绍。
- 把页面效果、状态流转和失败态串成一个可复现的小闭环。
代码来自哪里
entry/src/main/ets/services/AgentLocationService.ets
本篇优先阅读entry/src/main/ets/services/AgentLocationService.ets,下面的片段保留项目中的真实命名,方便你在 DevEco Studio 中直接搜索。
import { BusinessError } from '@kit.BasicServicesKit'; import { geoLocationManager } from '@kit.LocationKit'; export class AgentLocationSnapshot { success: boolean = false; resultDesc: string = ''; latitude: number = 0; longitude: number = 0; wgs84Latitude: number = 0; wgs84Longitude: number = 0; amapLatitude: number = 0; amapLongitude: number = 0; amapLocation: string = ''; coordinateSystem: string = 'GCJ-02'; accuracyMeters: number = 0; timeStamp: number = 0; source: string = ''; errorCode: number = 0; errorMessage: string = ''; } export class AgentLocationService { private static readonly LOCATION_TIMEOUT_MS: number = 10000; private static readonly FRESH_LOCATION_MAX_AGE_MS: number = 2 * 60 * 1000; static async getCurrentLocation(): Promise<AgentLocationSnapshot> { if (!AgentLocationService.isLocationEnabled()) { return AgentLocationService.buildFailure( 3301100, '设备位置服务未开启,请先打开系统位置开关后再获取附近推荐。' ); } const lastLocation = AgentLocationService.getUsableLastLocation(); if (lastLocation && AgentLocationService.isFreshLocation(lastLocation)) { return AgentLocationService.buildSuccess(lastLocation, 'last_location'); } try {源码拆解
- 先看入口变量或函数:它决定能力从哪个页面、哪个服务或哪个系统配置开始。
- 再看状态字段:页面上的按钮、提示、加载态通常不是临时文案,而是这些状态的投影。
- 最后看结果写回:拍摄、定位、AI、同步或分享能力最终都要回到记录模型、页面刷新或用户反馈。
跑出来是什么效果
结合页面效果,本文重点观察:
- 定位成功/失败/重试截图
- 定位状态机图
流程串联:页面进入 → 地图控制器就绪 → 记录坐标同步 → Marker/详情联动
从页面效果看,关键不是单点能力,而是让用户动作、源码状态和结果反馈保持一致。
实操步骤
- 在 DevEco Studio 打开项目,先搜索本文列出的主文件。
- 顺着源码片段中的变量或函数名继续查找调用点。
- 在真机上运行到对应页面,观察截图中的成功态是否与源码状态一致。
- 主动制造一次失败态,例如拒绝权限、断网、无数据或能力不支持。
- 把成功态、失败态、源码片段和页面截图串成完整实操闭环。
工程质量点
- 地图控制器只在可见 Tab 中工作,减少生命周期错位。
- 坐标转换、选中状态和详情面板分层处理,避免点击 Marker 后状态互相覆盖。
- 定位失败时保留可浏览首页,让应用不是一进来就卡死。
- 源码截图只截关键函数,不截整屏代码,方便读者跟着定位。
- 效果图和流程路径一一对应,避免只讲原理却看不到用户结果。
质量分自评
| 维度 | 分值 | 本篇检查点 |
|---|---|---|
| 源码准确度 | 28/30 | 代码片段来自项目文件,变量名和函数名保持原样。 |
| 效果可见性 | 23/25 | 页面效果与流程路径能说明从点击到结果的路径。 |
| 实操完整度 | 20/20 | 读者能按文章复现一个最小操作闭环。 |
| 工程质量 | 13/15 | 覆盖失败态、状态边界或隐私边界中的关键点。 |
| 表达清晰度 | 10/10 | 标题、截图说明和源码说明互相对齐。 |
| 合计 | 94/100 | 达到训练营发布质量线。 |
今日作业
- 拍摄或导入一条带位置的记录,观察地图 Marker 是否出现。
- 点击 Marker 后记录状态字段变化,补充一张前后对比图。
- 把定位失败时的默认地图体验写成一段用户提示。
完成作业后,下一篇继续沿着同一条源码路径往下走:先做出效果,再把工程边界讲清楚。
