这几天产品说我们的项目要做一下语音导航的功能,听到这个消息首先是高兴的,因为之前自己确实没有做过语音导航功能(就做过一些简单的定位,路线规划,路径选择等),这也是自己的第一篇帖子,激动!下面总结一下这几天做下来后我自己的个人经验:
先看一下完成后的效果图,和从百度下载的Demo是一样的(强调一点:下载好的工程导入到studio后还是不能直接用的,还需要自己去申请AK然后配置到自己的manifest文件中,Demo中自带的不能用):
一. 然后我们开始配置自己的工程主要分为一下几步:
1. 解压自己下载的zip后又得到三个zip,解压lib那个里边有三个文件夹(assets,libs,一个txt说明文件),然后开始导入。
2.打开自己的工程并切换到Project,然后将解压后得到的libs中的jar全部导入到自己工程的libs下(粘贴复制并加依赖)。
3.还是在Project结构下,在app->src->main下建立jniLibs目录,然后添加解压后得到的libs下的二进制文件armeabi进去(下载的Demo中没有其他的格式,可以自己找一下)。
4.还是Project结构下,在app->src->main下直接复制解压后得到的assets文件夹。
以上四步已经是工程的全部配置,然后接下来需要去开通一下语音播报服务(也就上网上说的tts白名单注册,点击打开链接)。
二. 接下来我们来看一下工程代码(这里我们就不讲的太详细了,主要将两个方法,后边会看到):
看过Demo以及百度官方api我们可以了解到实现导航功能主要需要一下几步:
1.首先准备一个文件夹用来存储导航过程中可能需要的缓存数据,后边要用到。(注意安卓6.0后的动态权限问题)。
2.文件夹建立好后,我们开始初始化导航,调启
BaiduNaviManager.getInstance().init();
这里我们说一下这个方法,先贴上手册中的介绍:
我们看到有两个init方法,其中一个已经过时不在介绍,直接说第二个:参数共有7个,
activity:当前上下文;
sdcardRootpath:刚才我们创建的文件路径;
appFolderName:文件名称;
naviInitListener:看一下名字就大概能理解是导航初始化监听,里边应该是生命周期方法:
嗯,差不多,前三个我们可以理解是初始化开始及结果方法,我们可以在里边做一些自己的操作,第四个方法onAuthResult是授权校验结果?什么玩意? 当然,就是校验百度Key,我们申请的那个AK。
ttsCallback:看英文意思像是tts播报回调,然后看一下api:
嗯~ o(* ̄▽ ̄*)o,方法真多,看样子应该是语音播报过程中断操作生命周期中允许我们做的一些个性化操作,看了一眼Demo,直接放的null,啊,好吧!我暂时也没有用到,也是直接传的null,大家有兴趣可以自己研究一下。
ttHandler:Handler,这大家应该就很熟悉了,看来是用来通知用户去完成某个操作的,Demo中是这样的:
很明显,是导航sdk内部在语音播报特定阶段通知用户的。
ttsStateListener:在意译一下,感觉是播报状态监听,看一下api:
啊,又是播报开始结束周期方法,怎么这么多,好吧,不过自己想想他们还是有区别的。
以上就是导航初始化的第一个init方法,其中有几个接口需要我们实现,上边已经一一说明,大家如果还有不明白的地方可以去看一下手册:点击打开链接
初始化完成后,此外我们要注意一点,官网上说的我们在发起导航前要设置一下appId,否则会静音,记不记得我们在前边说过要去注册一下语音播报服务功能,注册完成后的结果是这样的:
看到没上边有一个AppId,然后在初始化完成后设置一下
完成之后我们开始下一个重要方法,
BaiduNaviManager.getInstance().launchNavigator();
看一下手册中的解释:
同样是又两个方法,区别后者是多了一个BaiduNaviManager.NavEventListener参数,我们直接看一下后者:共有6个参数:
activity:当前上下文;
nodes:节点?对,就是导航路线中的节点,按照之前的经验,应该是最少两个,多了不限。我们看到list中对象是BNRoutePlanNode,这里我们就不详细介绍了手册中说的很清楚,Demo中也有例子;
preference:参数,直接意译。直接上图大家就明白了:
isGPSNav:意译:是否使用GPS导航;
listener:路线规划监听,看一下手册:
可以看到,接口中有两个方法,一个规划成功,一个规划失败,我们可以在其中做一些个性化操作;
msgListener:导航信息回掉接口,接口中只有一个方法,这里我就不贴了;
以上就是导航功能最重要的两个方法了,然后我们看一下Demo会发现,点击选择某种坐标导航按钮是跳转到了另外一个页面,我在这分析一下自己的浅解:
在刚才的两个方法中,我们分别做了播报监听,初始化状态监听,以及路线规划监听等,但是,我们还是需要在导航过程中在做操作的,因此我们就有必要对导航过程做一个监听,而导航监听接口是:BNRouteGuideManager.OnNavigationListener
那么接下来我们看一下这个接口:
其中有两个方法,一个动作回调,一个导航结束,是要我们在其中做个性化操作的。首先要实现这个接口,然后就是要设置这个监听,从Demo中可以看出,设置监听这个动作是在
BNRouteGuideManager.getInstance().onCreate();
中完成的,就是说我们得得到BNRouteGuideManager这个实例,那么我们看一下这个类:
可以看到这个管理类有自己的生命周期,而且从官网api中我们看到这些生命周期要在activity对应的生命周期中使用,因此 他的onCreate要放在activity的onCreate中执行,而我们在导航发起前要做一些准备工作,因此Demo中将准备工作放在了第一个activity中,而导航管理放在了导航activity,此外,因为我们导航往往是要在一个activity中完成的(包含准备工作),因此我自己试着将这些都放在了同一个activity中,结果发现必须自己设置标记等待准备工作完成后才能开始导航。比较麻烦! 我想这就是为什么Demo中要分为两个activity了。以上是我的理解。
申请AK--->开通tts语音播报服务--->配置studio环境--->BaiduNaviManager.getInstener.init()--->BaiduNaviManager.getInstener.launchNavigator()--->BNRouteGuideManager.getInstence.onCreate()--->BNRouteGuideManager各个生命周期方法
以及此过程中我们要设置的各种监听并在最后将BNRouteGuideManager.getInstence.onCreate()返回的View设置到activity中。
第一次写东西,可能某些地方理解不到位或是不对的地方还望斧正!谢谢!