底图屏幕输出
仪表盘展示地图#
对于 MapAuto,仪表盘只是一个可实时绘制图形画面的显示屏,其在系统中 应该是以一个 Display 设备存在。对于系统,应当使其可被第三方应用通过 DisplayManager 的 getDisplays(DisplayManager.DISPLAY_CATEGORY_PRESENTATION) 接口获取到,其命名应该设置为 DashboardMapDisplay。
系统应当确保 MapAuto 开机启动,MapAuto 会通过 DisplayManager 注册一 个 DisplayManager.DisplayListener 监听 Display 设备的状态变化。当仪表盘 Display 被添加到系统时,MapAuto 会收到通知并会新建一个 Presentation 将其显示到名 为 DashboardMapDisplay 的 Display 设备上。
至此,MapAuto 将会持续在仪表盘上的地图窗口绘制产品设计的地图内容。 可参考的文档有:
https://developer.android.com/reference/android/app/Presentation.html https://developer.android.com/reference/android/media/MediaRouter.html
车机首页展示地图#
对于 MapAuto,3rdApp 中的地图窗口应当可被抽象成一个 Display 设备, MapAuto 会在该 Display 设备上实时绘制地图内容。Display 设备的抽象方案分为 3rdApp 提供 Display 和 MapAuto 抽象 Display 两种方案。但无论如何,窗口应当 为 SurfaceView。
3rdApp 应当确保 MapAuto 在运行中。
3rdApp 提供 Display 方案#
对于 3rdApp,其应当将预设给 MapAuto 显示地图的窗口虚拟成一个系统中 其他应用可监测到的 Display 设备,并命名为 MapAutoExtendMapDisplay,该 Display 设备应当可被用于 Presentation 显示使用,同时根据应用是否在前台将该 Display 设备添加到系统和从系统中移除。
MapAuto 会通过 DisplayManager 注册一个 DisplayManager.DisplayListener 监 听 Display 设备的状态变化。当 MapAutoExtendMapDisplay 被添加到系统时, MapAuto 会收到通知并会新建一个 Presentation 将其显示到该 Display 设备上。 当该 Display 被移除时,MapAuto 会立即停止在该 Display 上绘制内容,直到检测 到该 Display 再次被添加到系统。
可参考的文档有:
https://developer.android.com/reference/android/hardware/display/VirtualDisplay.html https://developer.android.com/guide/topics/media/mediarouteprovider.html#provider-service https://developer.android.com/guide/topics/media/mediarouteprovider.html https://github.com/googlesamples/android-MediaRouter/
MapAuto 抽象 Display 方案#
对于 MapAuto,MapAuto 内部需要得到一个 Surface 来进行 Display 的抽象, 地图内容将被绘制到这个 Display 上,MapAuto 会根据 3rdApp 的不同请求来决定 是否开始和结束绘制内容。
对于 3rdApp,预设给 MapAuto 显示地图的窗口应当是一个 SurfaceView,当 地图窗口可见时取得 SurfaceView 的 Surface 作为参数调用创建的接口请求 MapAuto 开始绘制地图内容,窗口不可见时调用销毁的接口让 MapAuto 停止绘 制地图容。
3rdApp 与 MapAuto 间使用 AIDl 跨进程通信,MapAuto 定义一个跨进程服务 (com.baidu.naviauto.extendmap.ExtendMapService
),3rdApp 可通过 bindService 绑定该服务来进行通信,MapAuto 包名为 com.baidu.naviauto
。
具体接口定义如下图
绑定服务示例如下图
AIDl 接口文件
AIDl 文件:IExtendMapAidlInterface.aidl
MapAuto 抽象 Display 方案 3rdApp 示例代码:MainActivity.java