Administrator
发布于 2026-09-03 / 8,674 阅读
0
0

鸿蒙百篇系列(84/100):车机深度开发——座舱场景下的导航、多媒体与分布式协同

系列:鸿蒙开发从入门到专家 · 第 84 篇

车机屏幕越来越大,但驾驶员的注意力是最稀缺的资源。HarmonyOS NEXT 在车机场景下的设计原则是"减少凝视时间、降低操作步骤、优先语音和系统入口"。CarKit 提供了导航信息交互、智慧出行状态监听、系统级能力对接等接口。本篇把车机开发中几个高频能力串起来讲。

一、车机应用的安全前提

车机和手机最大的不同,是用户边开车边用。任何交互设计都要先问一句:驾驶员需要看屏幕多久?需要几次点击?

建议遵循三条红线:

  • 驾驶中禁止播放视频、复杂图文、长文本输入。

  • 核心功能(导航、音乐、电话)要在 3 秒内完成入口到达。

  • 语音是首选交互,触摸是备选,文字输入应尽量避免。

场景

推荐交互

不推荐交互

导航设置

语音输入目的地

手动输入地址

音乐切换

方向盘按键/语音

列表翻找

来电处理

语音接听/挂断

点击小按钮

车辆状态

语音播报/仪表盘提示

弹出全屏弹窗

二、CarKit 的核心能力

HarmonyOS NEXT 的 CarKit 主要面向智慧出行和导航信息两大场景:

  • smartMobilityCommon:监听 HiCar、超级桌面、车机流转等分布式业务状态。

  • navigationInfoMgr:向系统提供或获取导航信息,实现导航应用与车机桌面的信息互通。

2.1 监听智慧出行业务状态

import { smartMobilityCommon } from '@kit.CarKit';

function listenMobility() {
  smartMobilityCommon.on('mobilityStatusChange', (info: smartMobilityCommon.SmartMobilityInfo) => {
    console.info(`type: ${info.type}, status: ${info.status}`);
    if (info.status === smartMobilityCommon.SmartMobilityStatus.RUNNING) {
      // 业务已连接,可以启用相关功能
    }
  });
}

业务类型包括 HiCar、超级桌面、车机流转等。应用可以根据当前连接状态动态调整 UI,比如进入超级桌面模式时隐藏部分手机端控件。

2.2 设置系统导航数据

导航应用可以把当前转向、距离、下一路名等信息写入系统,车机桌面或 HUD 就能统一展示,不需要其他应用自己解析导航画面。

import { navigationInfoMgr } from '@kit.CarKit';

const navController = navigationInfoMgr.getNavigationController();

function updateNavInfo() {
  const data: navigationInfoMgr.NavigationMetadata = {
    naviTurnMode: 0x0001,
    segmentLeftDis: 150,
    currentRoadName: '深南大道',
    nextRoadName: '沙河西路',
    cameraSpeedLimit: 120,
    naviSpeedLimit: 80,
    currentSpeed: 65,
    totalLeftDis: 8200,
    remainingTime: 18
  };
  navController.updateNavigationMetadata(data);
}

2.3 监听系统导航指令

如果应用是车机桌面的服务方,可以注册系统导航监听器,响应查询请求:

class NavListener implements navigationInfoMgr.SystemNavigationListener {
  onQueryNavigationInfo(query: navigationInfoMgr.QueryType, args: Record<string, Object>)
    : Promise<navigationInfoMgr.ResultData> {
    return new Promise(resolve => {
      resolve({
        code: 1001,
        message: 'success',
        data: args
      });
    });
  }
}

navController.registerSystemNavigationListener(new NavListener());

三、多屏协同的架构设计

现代座舱常见多块屏幕:中控屏、仪表盘、副驾屏、后排屏。HarmonyOS NEXT 支持同一应用在不同屏幕上展示不同 Ability 或页面。

3.1 多 Display 启动

import { display } from '@kit.ArkUI';
import { common } from '@kit.AbilityKit';

async function startOnSecondScreen(context: common.UIAbilityContext) {
  const displays = display.getAllDisplaysSync();
  const second = displays.find(d => d.id !== 0);
  if (!second) return;

  context.startAbility({
    bundleName: 'com.example.carnavi',
    abilityName: 'HudAbility',
    parameters: { displayId: second.id }
  });
}

3.2 分屏职责

屏幕

职责

内容

中控屏

主交互

地图、音乐、设置

仪表盘

安全信息

转向箭头、车速、限速

副驾屏

娱乐

视频、音乐控制

HUD

关键提示

转向、车道、告警

不同屏幕的 Ability 通过 Want 或服务化通信同步状态,避免各自维护一份导航数据。

四、语音优先设计

车机上语音交互不是锦上添花,而是安全刚需。HarmonyOS NEXT 提供了系统级语音能力,应用可以通过 Intents Kit 把高频功能暴露给小艺对话。

例如导航应用可以注册以下意图:

  • StartNavigation:语音说"导航到深圳北站"。

  • QueryETA:语音问"还有多久到"。

  • CancelNavigation:语音说"取消导航"。

意图执行器内部不要直接打开复杂页面,而是把参数传给导航服务,由服务统一调度。

五、生命周期与后台约束

车机应用的生命周期和手机不同:

  • 车辆在行驶中,应用不应被系统随意回收。

  • 但熄火后应尽快释放资源,避免耗电。

  • 音频焦点必须正确申请和释放,避免导航语音和音乐互相打断。

import { avSession } from '@kit.AVSessionKit';

async function requestAudioFocus(ctx: Context) {
  const session = await avSession.createAVSession(ctx, 'nav_audio', 'audio');
  await session.activate();
  // 使用完成后调用 session.deactivate()
}

六、实战:导航信息上报链路

一个典型导航应用的车机链路:

  1. 用户语音输入目的地,Intents Kit 拉起导航应用。

  2. 应用计算路线,通过 navigationInfoMgr 把初始路线信息写入系统。

  3. 行驶过程中,定时更新 NavigationMetadata,仪表盘和 HUD 同步显示。

  4. 到达前 500 米,系统触发事件推荐,小艺建议提示"附近停车场"。

  5. 导航结束,应用释放音频焦点并清理导航状态。

这条链路的难点不是单个 API,而是状态和权限的管理:谁在哪个时机更新什么数据,出错如何降级。

七、小结

车机开发的安全约束远高于手机。CarKit 提供的是车机与系统、车机与多屏之间的连接能力,不是替代应用自己的业务逻辑。落地时建议先跑通"语音发起导航 + 系统导航信息上报 + 音频焦点管理"这条主线,再扩展娱乐、车辆状态、副驾屏等能力。

下一篇我们进入 IoT 设备开发,看看更轻量的设备端如何接入鸿蒙生态。

参考阅读

  • 华为开发者联盟:CarKit 开发指南

  • 华为开发者联盟:Intents Kit 开发指南

  • 华为开发者联盟:AVSession Kit 开发指南


评论