{"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搜索

调用示例

1、初始化定位服务

定位服务初始化详细步骤,请参考定位服务对接指南】

2、初始化算路服务

    实现路线结果观察者的抽象接口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}

3、初始化引导服务

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

4、初始化TBT服务

必须按定位服务(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    }

5、初始化图层业务服务

     获取图层服务并进行初始化,需要准备好BL的内聚和图层优先级配置文件(由AutoSDK解析),图层的样式文件(由客户端解析)详情见【图层样式配置】部分。获取图层服务并调用init进行初始化。图层业务服务初始化详细步骤,请参考图层服务初始化

6、初始化TBT公共控制参数配置

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);
","body_lake":null,"pub_level":null,"status":"0","updated_at":"2022-08-01 07:25:28","deleted_at":null,"nameSpace":"mnlcaa/v610","browseCount":277,"collectCount":0,"estimateDate":15,"docStatus":0,"permissions":true,"overView":false}}