{"version":"0.1.0","code":"0000","result":true,"message":"处理成功","errdetail":"","timestamp":1671508847336,"data":{"id":71711976,"title":"5.2 TBT服务初始化","slug":"zhbsmx","format":"lake","bookId":26046811,"body":null,"body_draft":null,"body_html":"
TBT服务包含算路服务(RouteService)、引导服务(GuideService),客户端通过服务管理获取对应服务,并通过图层业务服务完成巡航、导航过程中相关图层的绘制。
int com.autonavi.gbl.route.RouteService.init()
void com.autonavi.gbl.route.RouteService.addRouteResultObserver(IRouteResultObserver ob)
int com.autonavi.gbl.guide.GuideService.init()
void com.autonavi.gbl.guide.GuideService.addCruiseObserver (ICruiseObserver ob)
void com.autonavi.gbl.guide.GuideService.addNaviObserver (INaviObserver ob)
void com.autonavi.gbl.guide.GuideService.addSoundPlayObserver (ISoundPlayObserver ob)
说明:函数详情,请复制函数名称到在线API搜索
定位服务初始化详细步骤,请参考【定位服务对接指南】
实现路线结果观察者的抽象接口IRouteResultObserver类,调用addRouteResultObserver注册,用于接收算路的结果。
private RouteService mRouteService;\n\nprivate void initRouteService() {\n mRouteService = (RouteService) ServiceMgr.getServiceMgrInstance().getBLService(SingleServiceID.RouteSingleServiceID);\n mRouteService.init();\n mRouteService.addRouteResultObserver(routeResultObserver); //注册观察者\n}\n\n// 算路结果观察者\nIRouteResultObserver routeResultObserver = new IRouteResultObserver() {\n @Override\n public void onNewRoute(PathResultData pathResultData, ArrayList<PathInfo> pathInfoList, java.lang.Object externData) {\n \n /* 转线程前,这边需要特殊处理。对SDK回调回来的PathInfo对象需重新构造创建一遍 */\n ArrayList<PathInfo> paths = new ArrayList<>();\n for(int i=0;i<pathInfoList.size();i++){\n PathInfo paths =new PathInfo(pathInfoList.get(i));\n paths.add(pathInfo);\n }\n // 根据情况决定是否将后续处理流程转为其他线程处理,如果转线程,只需将下面示例中的HandleNewRoute函数放在指定线程执行即可\n HandleNewRoute(pathResultData, paths);\n }\n\n @Override\n public void onNewRouteError(PathResultData pathResultData, java.lang.Object externData) {\n // TODO: 算路失败,errorCode=\n // ...\n }\n};\n\n/* UI 线程逻辑 */\nvoid HandleNewRoute(PathResultData pathResultData, ArrayList<PathInfo> paths)\n{\n PathsMgr.getInstance().setPathsCache(paths);\n \n // 路线业务处理……\n \n // 若之后业务还需使用路线 通过getPathsCache获取\n // 若不在需当前路线时回收路线 destoryPathsCache() \n}\n\npublic class PathsMgr {\n public static final String TAG = "PathsMgr";\n private ArrayList<PathInfo> mPathsCache;\n \n private static class SinglonHolder {\n private static PathsMgr instance = new PathsMgr();\n }\n\n public static PathsMgr getInstance() {\n return SinglonHolder.instance;\n }\n\n // 在UI线程缓存路线结果\n public void setPathsCache(ArrayList<PathInfo> paths) {\n // 清除上一次老路线缓存\n destoryPathsCache()\n //无效的结果不需要cache\n if (paths == null || paths.size() <= 0) {\n return;\n }\n mPathsCache = paths;\n Logger.d(TAG,"setPathsCache:paths = {?}",paths.toString());\n }\n \n // 在UI线程获取路线缓存结果\n public ArrayList<PathInfo> getPathsCache() {\n Logger.d(TAG,"getPathsCache:paths = {?}",mPathsCache.toString());\n return mPathsCache;\n }\n\n // 不再使用当前路线时在UI线程调用,如退出路线规划页,结束真实导航\n public void destoryPathsCache() {\n if (mPathsCache == null || mPathsCache.size() <= 0) {\n return;\n }\n Iterator<PathInfo> it = mPathsCache.iterator();\n while(it.hasNext()){\n PathInfo pathInfo = it.next();\n pathInfo.delete();\n it.remove();\n }\n }\n}
GuideService mGuideService = (GuideService) ServiceMgr.getServiceMgrInstance().getBLService(SingleServiceID\n .GuideSingleServiceID);\nmGuideService.init();
实现巡航观察者的抽象接口ICruiseObserver类,调用addCruiseObserver注册,用于接收巡航的回调信息;
实现导航观察者的抽象接口INaviObserver类,调用addNaviObserver注册,用于接收导航的回调信息;
实现语音观察者的抽象接口ISoundPlayObserver类,调用setSoundPlayObserver注册,用于接收TTS语音回调信息。
private GuideService mGuideService;\n\n private void initGuideService() {\n mGuideService = (GuideService) ServiceMgr.getServiceMgrInstance().getBLService(SingleServiceID.GuideSingleServiceID);\n mGuideService.init();\n mGuideService.addCruiseObserver(cruiseObserver);\n mGuideService.addNaviObserver(naviObserver);\n mGuideService.addSoundPlayObserver(soundPlayObserver);\n }\n\n ICruiseObserver cruiseObserver = new ICruiseObserver() {\n @Override\n \t// TODO: 抽象接口类实现,略\n };\n\n INaviObserver naviObserver = new INaviObserver() {\n @Override\n \t// TODO: 抽象接口类实现,略\n };\n\n ISoundPlayObserver soundPlayObserver = new ISoundPlayObserver() {\n\n @Override\n public void onPlayTTS(SoundInfo soundInfo) {\n\t\t\t// TODO: 客户端实现播放文本\n }\n\n @Override\n public void onPlayRing(int i) {\n\t\t\t// TODO: 客户端实现播放音频文件\n }\n\n @Override\n public boolean isPlaying() {\n // TODO: 客户端实现播放状态查询\n return false;\n }\n };\n
必须按定位服务(PosService)->算路服务(RouteService)->引导服务(GuideService)的顺序初始化。
>=610版本,管理服务的bindPos2Guide接口被下架,SDK内聚处理,HMI无需再调用。
import com.autonavi.gbl.util.errorcode.common.Service; \n\n // 初始化TBT\n private void initTBT(){\n initPosService();\n initRouteService();\n initGuideService();\n }
获取图层服务并进行初始化,需要准备好BL的内聚和图层优先级配置文件(由AutoSDK解析),图层的样式文件(由客户端解析)详情见【图层样式配置】部分。获取图层服务并调用init进行初始化。图层业务服务初始化详细步骤,请参考【图层服务初始化】
public class TBTResReaderImpl implements ITBTResReader {\n\n public static byte[] readAllBytes(String filePath) {\n if (TextUtils.isEmpty(filePath)) {\n return new byte[0];\n }\n return readAllBytes(new File(filePath));\n }\n\n public static byte[] readAllBytes(@Nullable File file) {\n byte[] result = new byte[0];\n if (file == null || !file.exists()) {\n return result;\n }\n\n FileChannel channel = null;\n FileInputStream fs = null;\n try {\n fs = new FileInputStream(file);\n channel = fs.getChannel();\n ByteBuffer byteBuffer = ByteBuffer.allocate((int) channel.size());\n while ((channel.read(byteBuffer)) > 0) {\n // do nothing\n }\n result = byteBuffer.array();\n return result;\n } catch (IOException e) {\n e.printStackTrace();\n return result;\n } finally {\n safetyClose(channel);\n safetyClose(fs);\n }\n }\n /**\n * @return 数据长度\n * @brief 读取资源文件流\n * @details 此接口用于引擎读取资源文件。HMI提供宿主平台的文件io能力。\n * @param[in] strFile 文件名:用户底层已经拼接好完整路径,HMI不需要再拼接修改。\n * @remark 外界提供读取res资源文件的能力。\n * 引擎首先会从初始化设置的rootPath目录读取,如果读取不到在通过该接口读取。\n * 如果没有设置该类,则只从rootPaht目录读取。\n */\n @Override\n public byte[] readFile(String s) {\n return FileUtils.readAllBytes(s);\n }\n}\n\nWorkPath workPath = new WorkPath();\nworkPath.cache = cache;\nworkPath.navi = navi;\nworkPath.res = res;\nworkPath.continueNavi = continueNavi;\nUserConfig userConfig = new UserConfig();\nuserConfig.deviceID = CommonUtil.getDeviceID(mContext);\nTbtCommonControl tbtCommonControl = TbtCommonControl.getInstance();\ntbtCommonControl.setTbtResReader(new TBTResReaderImpl);\ntbtCommonControl.init(workPath, userConfig);