详解Android Automotive车载应用对驾驶模式Safe Drive Mode的适配
前言
最近在android automotive 上遇到的一些问题,有好几个都跟android 车载操作系统上应用的驾驶模式有关,国内这方面的资料很少,自己在这里总结一下相关的知识,主要包含下面几个方面:
- android automotive 和 android auto的区别
- android automotive 的驾驶模式介绍
- android automotive 实现驾驶模式的几种实现方式和代码示例,以及实现效果
主要是还是想总结一下android 车载应用对automotive 驾驶模式(drive mode)适配的几种方式。
开发环境
android studio 版本4.1.2
1. android automotive 和 android auto的区别
android auto:
android auto是一个专门为驾驶环境而设计的android端app
- 可以用来将android设备上的部分功能,通过数据线映射到汽车的屏幕上。当时做android auto主打的是安全性,为了避免用户在驾驶过程中拿起手机,谷歌为android auto增加了google assistant,也就是在驾驶环境中使用语音交互,使得用户可以再不改变自身物理姿势的情况下实现一些手机app的操作。
- 缺点是通过数据线将手机应用映射到车机上,应用到底还是在手机上运行的,以手机为中心,这样汽车本身相关数据,比如车速,gps,传感器,行驶状态这些数据无法同步到手机上。
android automotive 是可以再车载硬件上运行的操作系统和开源平台
我们最常见的android平台试运行在手机或者平板上的,和我们常见的android 操作系统相比,android automotive具有相同的代码库,而且专门增加了对汽车特定的功能和技术支撑,主要包含下面几个方面:
- car app:包括oem预装的,和第三方开发并且通过车载应用商店下载到车机上的app
- car api:oem车厂提供给汽车app特有的接口,包括仪表盘相关的api,车辆硬件(座舱,通风等)的相关api,多媒体,导航,车载系统设置界面和车辆传感器相关的api
- car service:car service是一个系统service,提供了和车相关的一系列的服务。
- vehicle network service:oem厂商的网络服务
- vehicle hal:汽车的硬件抽象层描述
android auto在车机上显示的其实是手机端的数据,android automotive则要考虑和手机端app的数据和账号同步的问题*
2. android automotive 的驾驶模式介绍
前面提到谷歌在2014年i/o 大会上推出android auto的初衷是更好地保障驾驶安全,android automotive 也增加了驾驶模式(drive mode),旨在帮助汽车oem厂商从系统层面对有可能造成驾驶员分心的应用进行管理。
在驾驶模式下,android automotive会对driving distraction提出一系列的建议。oem厂商也可以要求有可能造成驾驶员分心的 activity 或者 fragment 界面,在manifest file中将自己注册成distraction optimized,比如需要驾驶员操作的登陆界面,扫码界面,切换歌曲,或者视频播放界面,游戏界面。而android automotive 则会在驾驶模式的时候,主动对标记为distraction optimized的界面进行限制。
3. android automotive 实现驾驶模式的几种实现方式和代码示例
方式一 .在manifest文件中,使用在元数据meta-data对有可能造成分心驾驶的界面进行标记
android automotive 会把像下面这个使用元数据把distractionoptimized标记的活动或fragment 标识为需要优化的界面,并且在驾驶模式时禁用这些界面,或者在当前activity之上,增加ui 层级更高的提示框,从而避免在驾驶过程中这些界面造成用户分心。
上面这段代码,用于给用户扫码登陆的界面qrcodescanpage,在驾驶状态下会被androidautomotive区别处理,oem车厂也可以对android automotive进行客制化的修改,在限制界面之上增加遮盖。
大家可以看到,这种对分心界面的处理方式简单粗暴,直接在manifest文件里对组件的元素增加meta-data标签就可以了,缺点是不够灵活,所有的分心界面被遮盖以后效果都一样,而系统提供的统一遮盖方式,为了能够适用于各个应用的分心界面,往往直接把整个ui界面都挡住,即使qr码的ui很小,还是要盖住整个屏幕,用户体验很不好。
方式二 .使用cardrivingstatemanager类获取当前汽车的行驶状态,应用获取到行驶状态以后自己定义分心界面的遮挡方案
android automotive的cardrivingstatemanager类可以根据车辆硬件抽象层(vhal)提供的传感器数据获取当前汽车的行驶状态(停车,空转,行驶),这样应用就可以通过下面的设置cardrivingstateeventlistener监听器:
导包:
android automotive为 drivingstate定义了以下四个状态:
drivingstatemanager的代码:
这样就可以获取当前车辆的三种行驶状态:停止,空转,驾驶,也可能会返回unknown,需要开发者处理。
另外,这里有个小窍门, 通过 caruxrestrictions对象的isrequiresdistractionoptimization()
方法,可以直接获取当前车辆是否处于驾驶状态,1表示车辆处于驾驶状态,0表示非驾驶状态。
我们看到,上面的方法二可以主动查询当前车辆的行驶状态,然后可以根据drivingstateeventlistener返回的结果决定是否展示分心界面,也可以自己写遮盖代码。相比方式一,增加了很多灵活性。
方式三 .使用caruxrestrictionsmanager 并监听onuxrestrictionschangedlistener
导包:
从下面的caruxrestrictionmanager可以看到,onuxrestrictionschangedlistener 提供了驾驶模式限制状态变化的监听:
这个方法三主要的应用场景是:不适于在启动时监听的分心事件或者持续时间比较长的分心界面。比如长时间的视频播放应用等等
结语
以上介绍了android automotive的驾驶模式,以及实现的几种方法,各个方式的优缺点和应用场景。明天膝盖关节镜手术,这里网不好,等回去了再把代码在android 车载系统的虚拟机上实现出来,使用下面的adb指令是可以模拟出当前车辆速度的,可以验证驾驶状态的改变,最后一个参数是速度,单位是米/秒。
以上就是详解android automotive车载应用对驾驶模式(safe drive mode)的适配的详细内容,更多关于android automotive适配驾驶模式(safe drive mode)的资料请关注其它相关文章!