系列:鸿蒙开发从入门到专家 · 第 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 分屏职责
不同屏幕的 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()
}
六、实战:导航信息上报链路
一个典型导航应用的车机链路:
用户语音输入目的地,Intents Kit 拉起导航应用。
应用计算路线,通过
navigationInfoMgr把初始路线信息写入系统。行驶过程中,定时更新
NavigationMetadata,仪表盘和 HUD 同步显示。到达前 500 米,系统触发事件推荐,小艺建议提示"附近停车场"。
导航结束,应用释放音频焦点并清理导航状态。
这条链路的难点不是单个 API,而是状态和权限的管理:谁在哪个时机更新什么数据,出错如何降级。
七、小结
车机开发的安全约束远高于手机。CarKit 提供的是车机与系统、车机与多屏之间的连接能力,不是替代应用自己的业务逻辑。落地时建议先跑通"语音发起导航 + 系统导航信息上报 + 音频焦点管理"这条主线,再扩展娱乐、车辆状态、副驾屏等能力。
下一篇我们进入 IoT 设备开发,看看更轻量的设备端如何接入鸿蒙生态。
参考阅读
华为开发者联盟:CarKit 开发指南
华为开发者联盟:Intents Kit 开发指南
华为开发者联盟:AVSession Kit 开发指南