文档管理中心
我的
您当前正在浏览新版开发者文档中心,目录分类和层级有所调整。点击左侧当前文档分类名称前的“☰”图标,可切换文档分类。 了解新版目录
指南与API参考指南系统硬件AOD Navigation Kit(熄屏导航服务)接入熄屏导航

接入熄屏导航

概述

从API版本26.0.0开始,AOD Navigation Kit提供应用接入熄屏导航的能力,支持低功耗导航业务代理能力。该服务专为户外徒步、骑行、跑步等场景打造,用户无需频繁解锁亮屏即可掌握导航关键信息,在确保导航实时性的同时有效降低设备功耗,助力户外探索类应用快速集成熄屏导航能力。

场景介绍

接入熄屏导航能力的应用可在设备熄屏后,在设备熄屏界面实时展示行进路线、运动轨迹、里程及耗时等核心信息。应用可自定义显示的数据项,当前支持12种数据选项供灵活配置。

开发流程

流程说明:

  1. 用户使用应用导航功能:

    1.1. 设备能力差异化判断,调用isAodNaviSupported接口判断当前设备是否支持熄屏导航功能及getAodNaviExtendCapabilities接口获取当前设备上支持的扩展能力集,在不支持的设备上进行业务隔离

    1.2. 熄屏导航初始化配置:调用setupAodNaviConfig接口进行熄屏导航功能初始化配置。

    1.3. 设置规划轨迹路线,调用setPlanRouteToAod将规划轨迹路线下发给AOD Navigation Kit。

  2. 设备熄屏进入熄屏导航:

    2.1. 应用接收到对应熄屏导航事件AodNaviEventInfo回调后,下发设备亮屏期间应用产生的轨迹和导航数据给AOD Navigation Kit。

    2.2. 应用根据自身初始化配置进行响应,若应用休眠策略为休眠时,则释放长时任务,否则调用updateAodViewData定时刷新熄屏导航界面数据。

    2.3. 若应用休眠策略为休眠时,熄屏导航期间满足条件时会回调对应导航事件AodNaviEventInfo(熄屏导航数据缓存或语音播报事件)给应用,应用接收后需进行数据合并或者语音播报。

  3. 设备亮屏退出熄屏导航:应用接收到对应熄屏导航事件AodNaviEventInfo回调后,根据初始化配置进行事件响应,若应用休眠策略为休眠时,则进行数据合并并恢复长时任务,否则停止调用updateAodViewData数据刷新接口。

  4. 暂停或者恢复应用导航时,应用需要调用updateAppRecordStatus接口将状态更新至AOD Navigation Kit,若应用导航处于暂停状态时,设备熄屏将不会进入熄屏导航状态。

  5. 退出应用导航时,应用需要调用offAodNaviEvent解注册熄屏导航事件监听。

开发步骤

  1. 导入aodNaviManager模块。

    收起
    自动换行
    深色代码主题
    复制
    1. import { abilityAccessCtrl, common } from '@kit.AbilityKit';
    2. import { aodNaviManager } from '@kit.AODNavigationKit';
    3. import { hilog } from '@kit.PerformanceAnalysisKit';
    4. import { BusinessError } from '@kit.BasicServicesKit';
  2. 设备能力差异化判断。

    1. 熄屏循迹导航能力强依赖设备能力,非所有设备支持,应用可以通过isAodNaviSupported接口获取当前设备是否支持AOD熄屏循迹导航。

      收起
      自动换行
      深色代码主题
      复制
      1. // 首次进入申请定位权限
      2. let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
      3. await atManager.requestPermissionsFromUser(this.getUIContext().getHostContext() as common.UIAbilityContext,
      4. ['ohos.permission.LOCATION', 'ohos.permission.APPROXIMATELY_LOCATION'])
      5. // 检查设备是否支持熄屏导航
      6. const isSupported: boolean = aodNaviManager.isAodNaviSupported();
      7. hilog.info(0x0000, 'aodNavigationSample', 'Succeeded in checking whether AOD navigation is supported, supported: %{public}s', isSupported);
    2. 部分能力子项依赖产品特定器件,非所有设备支持,应用可以通过getAodNaviExtendCapabilities获取当前设备支持能力子项列表。

      收起
      自动换行
      深色代码主题
      复制
      1. // 获取设备扩展能力列表
      2. const capabilities: Array<aodNaviManager.AodNaviExtendDataType> =
      3. aodNaviManager.getAodNaviExtendCapabilities();
      4. hilog.info(0x0000, 'aodNavigationSample', 'Succeeded in getting AOD navigation extend capabilities, capabilities: %{public}s', JSON.stringify(capabilities));
  3. 调用isAodNaviSwitchEnabled接口判断熄屏导航功能开关(操作路径:“设置 > 桌面和个性化 > 熄屏显示设置 > 熄屏导航”)是否开启。

    收起
    自动换行
    深色代码主题
    复制
    1. // 检查熄屏导航开关是否已启用
    2. try {
    3. const enabled: boolean = await aodNaviManager.isAodNaviSwitchEnabled();
    4. hilog.info(0x0000, 'aodNavigationSample', 'Succeeded in checking whether AOD navigation switch is enabled, enabled: %{public}s', enabled);
    5. } catch (error) {
    6. hilog.error(0x0000, 'aodNavigationSample', 'Failed to check whether AOD navigation switch is enabled: %{public}d %{public}s', error.code, error.message);
    7. }
  4. 调用setupAodNaviConfig接口进行熄屏导航功能初始化配置。

    收起
    自动换行
    深色代码主题
    复制
    1. try {
    2. const config: aodNaviManager.AodNaviConfig = {
    3. // 设备熄屏应用休眠策略:配置设备熄屏后应用休眠策略为休眠
    4. aliveStrategy: aodNaviManager.AodNaviAliveStrategy.HIBERNATE,
    5. // 设备熄屏界面显示参数项
    6. aodViewDataConfig: {
    7. aodViewDataCount: 4,
    8. aodViewDataTypes: [
    9. aodNaviManager.AodNaviBasicDataType.DISTANCE,
    10. aodNaviManager.AodNaviBasicDataType.STEPS,
    11. aodNaviManager.AodNaviBasicDataType.CURRENT_SPEED,
    12. aodNaviManager.AodNaviBasicDataType.OVERALL_ELAPSED_TIME
    13. ]
    14. },
    15. // 语音播报参数项
    16. aodVoiceBroadcastConfig: {
    17. distance: 1000,
    18. timeInterval: 60,
    19. enableGpsBroadcast: true
    20. },
    21. // 业务代理数据项
    22. aodProxyDataTypes: [
    23. aodNaviManager.AodNaviBasicDataType.DISTANCE,
    24. aodNaviManager.AodNaviBasicDataType.STEPS,
    25. aodNaviManager.AodNaviBasicDataType.CURRENT_SPEED,
    26. aodNaviManager.AodNaviBasicDataType.OVERALL_ELAPSED_TIME
    27. ]
    28. };
    29. // 初始化接入配置
    30. await aodNaviManager.setupAodNaviConfig(config);
    31. hilog.info(0x0000, 'aodNavigationSample', 'Succeeded in setting up AOD navigation config.');
    32. } catch (error) {
    33. hilog.error(0x0000, 'aodNavigationSample', 'Failed to set up AOD navigation config: %{public}d %{public}s', error.code, error.message);
    34. }
  5. 调用onAodNaviEvent接口注册熄屏导航事件监听,系统会将具体事件信息AodNaviEventInfo回调给应用,应用根据系统回调事件信息进行对应任务处理。回调事件类型详见AodNaviEventType。

    收起
    自动换行
    深色代码主题
    复制
    1. try {
    2. aodNaviManager.onAodNaviEvent((eventInfo: aodNaviManager.AodNaviEventInfo) => {
    3. hilog.info(0x0000, 'aodNavigationSample', 'Received AOD navigation event: eventType: %{public}d, eventId: %{public}s', eventInfo.eventType, eventInfo.eventId);
    4. switch (eventInfo.eventType) {
    5. // 进入熄屏导航事件回调
    6. case aodNaviManager.AodNaviEventType.AOD_NAVI_ENTER:
    7. this.handleNaviEnter(eventInfo);
    8. break;
    9. // 退出熄屏导航事件回调
    10. case aodNaviManager.AodNaviEventType.AOD_NAVI_EXIT:
    11. this.handleNaviExit(eventInfo);
    12. break;
    13. // 语音播报事件回调
    14. case aodNaviManager.AodNaviEventType.AOD_NAVI_VOICE_BROADCAST:
    15. this.handleVoiceBroadcast(eventInfo);
    16. break;
    17. // 数据缓存事件回调
    18. case aodNaviManager.AodNaviEventType.AOD_NAVI_DATA_CACHE:
    19. this.handleDataCache(eventInfo);
    20. break;
    21. }
    22. });
    23. hilog.info(0x0000, 'aodNavigationSample', 'onAodNaviEvent success.');
    24. } catch (error) {
    25. hilog.error(0x0000, 'aodNavigationSample', 'onAodNaviEvent error: %{public}d %{public}s', error.code, error.message);
    26. }
    27. // 处理进入熄屏导航事件
    28. async handleNaviEnter(eventInfo: aodNaviManager.AodNaviEventInfo) {
    29. let historyRoutes: aodNaviManager.HistoryRoute[] = [
    30. { timestamp: 1234567890, longitude: 116.404, latitude: 39.915 },
    31. { timestamp: 1234567891, longitude: 116.405, latitude: 39.916 }
    32. ];
    33. let aodNaviData: aodNaviManager.AodNaviData = {
    34. timestamp: Date.now() / 1000,
    35. distance: 1000,
    36. steps: 1500,
    37. currentSpeed: 5.5
    38. };
    39. let aodNaviInteractData: aodNaviManager.AodNaviInteractData = {
    40. historyRoutes: historyRoutes,
    41. aodNaviData: aodNaviData
    42. };
    43. try {
    44. await aodNaviManager.setNaviDataToAod(eventInfo.eventId, aodNaviInteractData);
    45. hilog.info(0x0000, 'aodNavigationSample', 'Succeeded in setting navigation data to AOD.');
    46. } catch (error) {
    47. hilog.error(0x0000, 'aodNavigationSample', 'Failed to set navigation data to AOD: %{public}d %{public}s', error.code, error.message);
    48. }
    49. // 如果应用休眠策略选择保活,则需要定时刷新熄屏导航视图数据,否则不需要以下代码
    50. const aodViewData: aodNaviManager.AodViewData = {
    51. "distance": 5.5,
    52. "steps": 5500,
    53. "currentSpeed": 11.0,
    54. "overallAvgSpeed": 12
    55. };
    56. try {
    57. await aodNaviManager.updateAodViewData(aodViewData);
    58. hilog.info(0x0000, 'aodNavigationSample', 'Succeeded in updating AOD view data.');
    59. } catch (error) {
    60. hilog.error(0x0000, 'aodNavigationSample', 'Failed to update AOD view data: %{public}d %{public}s', error.code, error.message);
    61. }
    62. }
    63. // 处理熄屏导航退出事件
    64. async handleNaviExit(eventInfo: aodNaviManager.AodNaviEventInfo) {
    65. hilog.info(0x0000, 'aodNavigationSample', 'handleNaviExit');
    66. }
    67. // 处理语音播报事件
    68. async handleVoiceBroadcast(eventInfo: aodNaviManager.AodNaviEventInfo) {
    69. hilog.info(0x0000, 'aodNavigationSample', 'handleVoiceBroadcast');
    70. }
    71. // 处理数据缓存事件
    72. async handleDataCache(eventInfo: aodNaviManager.AodNaviEventInfo) {
    73. hilog.info(0x0000, 'aodNavigationSample', 'handleDataCache');
    74. }
  6. 调用setPlanRouteToAod接口下发规划轨迹路线至AOD Navigation Kit用于熄屏界面显示。

    收起
    自动换行
    深色代码主题
    复制
    1. try {
    2. // 规划轨迹路线点
    3. const planRoutes: Array<aodNaviManager.PlanRoute> = [
    4. { longitude: 116.404, latitude: 39.915 },
    5. { longitude: 116.414, latitude: 39.925 },
    6. { longitude: 116.424, latitude: 39.935 }
    7. ];
    8. // 标记点
    9. const markPoints: Array<aodNaviManager.MarkPoint> = [
    10. { name: '起点', longitude: 116.404, latitude: 39.915 },
    11. { name: '终点', longitude: 116.424, latitude: 39.935 }
    12. ];
    13. await aodNaviManager.setPlanRouteToAod(planRoutes, markPoints);
    14. hilog.info(0x0000, 'aodNavigationSample', 'Succeeded in setting plan route to AOD.');
    15. } catch (error) {
    16. hilog.error(0x0000, 'aodNavigationSample', 'Failed to set plan route to AOD: %{public}d %{public}s', error.code, error.message);
    17. }
  7. 当设备从亮屏切换至熄屏时,应用会收到AOD_NAVI_ENTER回调事件,此时应调用setNaviDataToAod接口,将设备亮屏阶段应用产生的轨迹及导航数据同步至AOD Navigation Kit,以支持熄屏时循迹导航功能的正常显示。

    收起
    自动换行
    深色代码主题
    复制
    1. try {
    2. await aodNaviManager.setNaviDataToAod(eventInfo.eventId, aodNaviInteractData);
    3. hilog.info(0x0000, 'aodNavigationSample', 'Succeeded in setting navigation data to AOD.');
    4. } catch (error) {
    5. hilog.error(0x0000, 'aodNavigationSample', 'Failed to set navigation data to AOD: %{public}d %{public}s', error.code, error.message);
    6. }
  8. 调用updateAodViewData更新熄屏导航界面视图数据。

    当应用休眠策略为保活时,在设备从亮屏切换至熄屏且应用收到AOD_NAVI_ENTER回调后,应用需定时调用此方法以更新熄屏导航视图数据。请注意,定时刷新的频率不得高于1秒/次。

    收起
    自动换行
    深色代码主题
    复制
    1. const aodViewData: aodNaviManager.AodViewData = {
    2. "distance": 5000,
    3. "steps": 2000,
    4. "currentSpeed": 5.5
    5. };
    6. try {
    7. await aodNaviManager.updateAodViewData(aodViewData);
    8. hilog.info(0x0000, 'aodNavigationSample', 'Succeeded in updating AOD view data.');
    9. } catch (error) {
    10. hilog.error(0x0000, 'aodNavigationSample', 'Failed to update AOD view data: %{public}d %{public}s', error.code, error.message);
    11. }
  9. 调用updateAppRecordStatus更新应用导航记录状态。

    在应用暂停状态下,AOD Navigation Kit需同步暂停业务代理的计算,且熄屏界面不展示内容。因此,应用处于暂停或恢复状态时,必须将当前状态同步至AOD Navigation Kit,以确保显示与计算状态的一致性。

    收起
    自动换行
    深色代码主题
    复制
    1. try {
    2. const recordStatus: aodNaviManager.AppRecordStatus = aodNaviManager.AppRecordStatus.RECORDING;
    3. await aodNaviManager.updateAppRecordStatus(recordStatus);
    4. hilog.info(0x0000, 'aodNavigationSample', 'Succeeded in updating app record status');
    5. } catch (error) {
    6. hilog.error(0x0000, 'aodNavigationSample', 'Failed to update app record status: %{public}d %{public}s', error.code, error.message);
    7. }
  10. 应用退出或结束导航时,需调用offAodNaviEvent解注册熄屏导航事件监听,以避免无效的资源占用。

    收起
    自动换行
    深色代码主题
    复制
    1. try {
    2. aodNaviManager.offAodNaviEvent();
    3. hilog.info(0x0000, 'aodNavigationSample', 'Succeeded in stopping AOD navigation event listener.');
    4. } catch (error) {
    5. hilog.error(0x0000, 'aodNavigationSample', 'Failed to stop AOD navigation event listener: %{public}d %{public}s', error.code, error.message);
    6. }