作为一名鸿蒙开发者,有时候开发任务来得非常突然。这次就是这样,老板直接找到我,说公司需要开发一个车载导航功能,要用鸿蒙的NavigationInfoMgr模块。他要求我尽快研究一下,然后把车载导航系统的基础功能先搞出来。说实话,当时接到这个任务的时候,我的心里还是有点忐忑的,因为之前对鸿蒙的车载系统接触得并不多。不过,这也正是一个学习的好机会,于是我一边应下任务,一边开启了我的新挑战。

image.png

初探NavigationInfoMgr:从文档入手

我首先打开了鸿蒙开发者官网,找到NavigationInfoMgr模块的文档,仔细阅读了它的功能和使用方法。NavigationInfoMgr是用来管理和获取车载导航信息的,它能提供像导航路线、到达目的地的预计时间等信息,这些正是车载导航系统必备的核心功能。

在文档中,我了解到NavigationInfoMgr可以通过事件监听的方式获取实时的导航状态更新,这对车载系统来说非常重要,因为用户需要随时掌握导航的最新信息。我决定先实现一个简单的功能:获取当前的导航路线信息并展示出来。

代码初体验:实现基础导航信息获取

看完文档后,我决定先编写一个简单的代码,测试一下能不能成功获取到导航信息。我写了以下代码来初始化NavigationInfoMgr,并尝试获取当前的导航路线信息:

import navigationinfomgr from '@ohos.navigationinfomgr';

function getNavigationInfo() {
    navigationinfomgr.getNavigationInfo()
        .then((navInfo) => {
            console.log('导航信息获取成功:', navInfo);
        })
        .catch((err) => {
            console.error('导航信息获取失败:', err);
        });
}

getNavigationInfo();

这段代码的目标很简单,就是调用getNavigationInfo方法,然后将导航信息打印到控制台上。第一次运行的时候,结果并没有成功,这让我有点头疼。于是我决定进一步查看文档,并尝试排查可能存在的问题。

image.png

探索中的问题:权限与设备模拟

在查阅文档后,我意识到,导航信息的获取需要设备具备车载环境的支持,而且需要请求相应的权限。显然,我之前的实现缺少了这些关键的步骤。于是,我做了以下两点改进:

1. 添加权限声明

首先,我在应用的config.json文件中添加了对导航信息的权限声明,这样系统才能允许我们访问相关的导航数据。代码如下:

"reqPermissions": [
    {
        "name": "ohos.permission.ACCESS_NAVIGATION_INFO"
    }
]

2. 使用模拟器测试车载环境

接下来,我需要在开发环境中模拟车载场景来测试导航功能。鸿蒙提供了一个车载环境模拟工具,可以用来模拟车载场景的数据输入,这对开发和调试特别有帮助。配置好这些后,我再次运行了代码,这次成功获取到了模拟的导航信息!看到控制台打印出的导航数据,我的心情顿时轻松了不少,毕竟迈出了第一步。

添加实时导航信息监听

实现了基础的导航信息获取后,老板又提出了一个新需求:希望能够在界面上实时展示导航信息,比如剩余的距离、预计到达时间等。这意味着我需要使用NavigationInfoMgr的监听功能来实现导航信息的实时更新。

于是,我开始研究如何添加导航信息的监听器。通过文档,我了解到可以使用on('navigationInfoChange', callback)方法来监听导航信息的变化。于是,我写下了如下代码:

function listenToNavigationInfo() {
    navigationinfomgr.on('navigationInfoChange', (navInfo) => {
        console.log('导航信息更新:', navInfo);
        // 这里可以将最新的导航信息更新到界面上
    });
}

listenToNavigationInfo();

这段代码的核心是监听导航信息的变化,每当有新的导航数据时,回调函数就会被触发,这样我们就可以在界面上实时更新显示信息。运行后,我在模拟器中调整了导航数据,果然看到控制台中实时打印出了新的导航信息,这让我感到非常有成就感。

界面集成:把导航信息展示给用户

光有后台的逻辑还不够,还需要把这些信息展示给用户看。于是,我开始用鸿蒙的UI框架来设计一个简单的界面,让用户能够看到导航路线、剩余距离以及预计到达时间。

我用了一个基础的Text组件来展示导航信息,代码如下:

import router from '@system.router';
import navigationinfomgr from '@ohos.navigationinfomgr';

export default {
    data: {
        distance: '',
        estimatedTime: ''
    },
    onInit() {
        this.listenToNavigationInfo();
    },
    listenToNavigationInfo() {
        navigationinfomgr.on('navigationInfoChange', (navInfo) => {
            this.distance = navInfo.remainingDistance;
            this.estimatedTime = navInfo.estimatedArrivalTime;
        });
    }
};

在这个代码中,我将导航信息的变化绑定到了页面的数据上,这样每当导航信息更新,页面也会自动刷新显示最新的数据。经过一番调试之后,整个界面终于可以正常工作,用户现在可以看到实时更新的导航信息了。

image.png

进阶功能开发:路线重新规划与语音播报

在实现了基础的导航信息展示后,我开始考虑如何进一步提升应用的实用性。老板建议我增加一些进阶功能,比如路线重新规划和语音播报。这些功能可以让用户在遇到意外情况(如交通堵塞或偏离路线)时,自动重新计算路线,并通过语音提示用户调整行驶方向。

1. 路线重新规划

为了实现路线重新规划,我首先需要监听导航状态的变化。如果用户偏离了原有路线,系统会自动触发重新规划的逻辑。我在原有的监听器基础上,增加了对导航状态的判断,代码如下:

navigationinfomgr.on('navigationInfoChange', (navInfo) => {
    if (navInfo.status === 'OFF_ROUTE') {
        navigationinfomgr.recalculateRoute()
            .then((newRoute) => {
                console.log('路线重新规划成功:', newRoute);
                // 更新界面显示的新路线信息
            })
            .catch((err) => {
                console.error('路线重新规划失败:', err);
            });
    }
});

这段代码的核心在于,当检测到用户偏离路线时,调用recalculateRoute方法来重新规划新的行驶路线,并将新的路线信息展示给用户。经过测试,路线重新规划功能运行得非常顺畅,这让我对鸿蒙的导航系统有了更深的理解。

2. 集成语音播报

语音播报是车载导航应用中非常重要的一部分,因为驾驶过程中,驾驶员需要尽量减少视线从路面转移到屏幕上的次数。鸿蒙提供了文本转语音(TTS)的支持,通过集成TTS功能,我可以在导航信息发生变化时,自动将指令通过语音播报给用户。

以下是集成语音播报的代码示例:

import tts from '@ohos.tts';

function speakNavigationInfo(text) {
    tts.speak(text)
        .then(() => {
            console.log('语音播报成功');
        })
        .catch((err) => {
            console.error('语音播报失败:', err);
        });
}

navigationinfomgr.on('navigationInfoChange', (navInfo) => {
    const instruction = `剩余${navInfo.remainingDistance}公里,预计到达时间为${navInfo.estimatedArrivalTime}`;
    speakNavigationInfo(instruction);
});

通过这段代码,每当导航信息更新时,系统会自动生成播报文本,并调用TTS模块进行语音播报。经过几次测试,语音播报功能的效果也非常不错,播报清晰且及时,为用户提供了很大的便利。

结束语:开发过程中的收获与思考

整个开发过程充满了挑战,从最初对鸿蒙车载模块的陌生,到逐步理解如何使用NavigationInfoMgr获取、展示导航信息,再到实现路线重新规划和语音播报等进阶功能,这段经历让我成长了很多。尤其是在面对各种权限、设备模拟和复杂功能开发的问题时,我学会了如何去查阅文档、解决问题,这些都是非常宝贵的经验。

通过这次开发,我不仅对鸿蒙系统的车载模块有了更深入的了解,还积累了不少关于车载环境开发的经验。我更加意识到,作为开发者,不仅要掌握技术,还需要有解决问题的能力和持续学习的态度。

接下来,我希望能够继续优化这个导航系统,比如增加更多的人性化功能,支持用户自定义路线选择,或者与其他车载系统集成,让导航体验更加智能化和便捷化。希望这篇文章能对其他正在或准备进行鸿蒙开发的朋友们有所帮助,也期待与大家一起交流,探索鸿蒙开发的更多可能性!

image.png


郝敬学
416 声望94 粉丝