详解Android Automotive车载应用对驾驶模式Safe Drive Mode的适配

前言

最近在Android Automotive 上遇到的一些问题,有好几个都跟Android 车载操作系统上应用的驾驶模式有关,国内这方面的资料很少,自己在这里总结一下相关的知识,主要包含下面几个方面:

  1. Android Automotive 和 Android Auto的区别
  2. Android Automotive 的驾驶模式介绍
  3. 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 层级更高的提示框,从而避免在驾驶过程中这些界面造成用户分心。

<activity android:name=".QRCodeScanPage">
	<meta-data android:name="distractionOptimized" android:value="true"/>
</activity>

上面这段代码,用于给用户扫码登陆的界面QRCodeScanPage,在驾驶状态下会被AndroidAutomotive区别处理,OEM车厂也可以对Android Automotive进行客制化的修改,在限制界面之上增加遮盖。

大家可以看到,这种对分心界面的处理方式简单粗暴,直接在Manifest文件里对组件的元素增加Meta-data标签就可以了,缺点是不够灵活,所有的分心界面被遮盖以后效果都一样,而系统提供的统一遮盖方式,为了能够适用于各个应用的分心界面,往往直接把整个UI界面都挡住,即使QR码的UI很小,还是要盖住整个屏幕,用户体验很不好。

方式二 .使用CarDrivingStateManager类获取当前汽车的行驶状态,应用获取到行驶状态以后自己定义分心界面的遮挡方案

Android Automotive的CarDrivingStateManager类可以根据车辆硬件抽象层(VHAL)提供的传感器数据获取当前汽车的行驶状态(停车,空转,行驶),这样应用就可以通过下面的设置CarDrivingStateEventListener监听器:

导包:

import android.car.Car;
/* For CarDrivingState */
import android.car.drivingstate.CarDrivingStateEvent;
import android.car.drivingstate.CarDrivingStateManager;
private final CarDrivingStateManager.CarDrivingStateEventListener
mDrivingStateEventListener =
       new CarDrivingStateManager.CarDrivingStateEventListener() {
   @Override
   public void onDrivingStateChanged(CarDrivingStateEvent event) {
       mDrivingStateEvent = event;
       handleDrivingStateChange();
   }
};

Android Automotive为 DrivingState定义了以下四个状态:

/**
 * This is when we don't have enough information to infer the car's driving state.
 */
public static final int DRIVING_STATE_UNKNOWN = -1;
/**
 * Car is parked - Gear is in Parked mode.
 */
public static final int DRIVING_STATE_PARKED = 0;
/**
 * Car is idling.  Gear is not in Parked mode and Speed of the vehicle is zero.
 */
public static final int DRIVING_STATE_IDLING = 1;
/**
 * Car is moving.  Gear is not in parked mode and speed of the vehicle is non zero.
 */
public static final int DRIVING_STATE_MOVING = 2;

DrivingStateManager的代码:

mDrivingStateManager = (CarDrivingStateManager) mCar.getCarManager(
       Car.CAR_DRIVING_STATE_SERVICE);
/* Register the listener (implemented below) */
mDrivingStateManager.registerListener(mDrivingStateEventListener);
/* While we wait for a change to be notified, query the current state */
mDrivingStateEvent = mDrivingStateManager.getCurrentCarDrivingState();

这样就可以获取当前车辆的三种行驶状态:停止,空转,驾驶,也可能会返回UNKNOWN,需要开发者处理。

另外,这里有个小窍门, 通过 CarUxRestrictions对象的isRequiresDistractionOptimization() 方法,可以直接获取当前车辆是否处于驾驶状态,1表示车辆处于驾驶状态,0表示非驾驶状态。

我们看到,上面的方法二可以主动查询当前车辆的行驶状态,然后可以根据DrivingStateEventListener返回的结果决定是否展示分心界面,也可以自己写遮盖代码。相比方式一,增加了很多灵活性。

方式三 .使用CarUxRestrictionsManager 并监听OnUxRestrictionsChangedListener

导包:

import android.car.Car;
/* For CarUxRestrictions */
import android.car.drivingstate.CarUxRestrictions;
import android.car.drivingstate.CarUxRestrictionsManager;

从下面的CarUxRestrictionManager可以看到,OnUxRestrictionsChangedListener 提供了驾驶模式限制状态变化的监听:

@Nullable private CarUxRestrictionsManager mCarUxRestrictionsManager;
private CarUxRestrictions mCurrentUxRestrictions;

/* Implement the onUxRestrictionsChangedListener interface */
private CarUxRestrictionsManager.OnUxRestrictionsChangedListener mUxrChangeListener =
            new CarUxRestrictionsManager.OnUxRestrictionsChangedListener()
    {
        @Override
        public void onUxRestrictionsChanged(CarUxRestrictions carUxRestrictions) {
        mCurrentUxRestrictions = carUxRestrictions;
        /* Handle the new restrictions */
        handleUxRestrictionsChanged(carUxRestrictions);
        }
    };

这个方法三主要的应用场景是:不适于在启动时监听的分心事件或者持续时间比较长的分心界面。比如长时间的视频播放应用等等

结语

以上介绍了Android Automotive的驾驶模式,以及实现的几种方法,各个方式的优缺点和应用场景。明天膝盖关节镜手术,这里网不好,等回去了再把代码在Android 车载系统的虚拟机上实现出来,使用下面的ADB指令是可以模拟出当前车辆速度的,可以验证驾驶状态的改变,最后一个参数是速度,单位是米/秒。

adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 40

以上就是详解Android Automotive车载应用对驾驶模式(Safe Drive Mode)的适配的详细内容,更多关于Android Automotive适配驾驶模式(Safe Drive Mode)的资料请关注我们其它相关文章!

(0)

相关推荐

  • python抓取某汽车网数据解析html存入excel示例

    1.某汽车网站地址 2.使用firefox查看后发现,此网站的信息未使用json数据,而是简单那的html页面而已 3.使用pyquery库中的PyQuery进行html的解析 页面样式: 复制代码 代码如下: def get_dealer_info(self):        """获取经销商信息"""        css_select = 'html body div.box div.news_wrapper div.main div.ne

  • python实现图片识别汽车功能

    本文实例为大家分享了python实现图片识别汽车的具体代码,供大家参考,具体内容如下 准备工作 1.登陆开发者控制台 2.安装 pip install baidu-aip 模块 原理读取图片的二进制信息,调用百度云第三方接口,将图片二进制信息传递给接口,获取接口返回的信息,进行处理输出 百度云准备第三方接口,实例应用简介 创建实例应用 创建完成后可以看到需要的三个参数 AppID, API Key, Secret Key 代码实现 from aip import AipImageClassify

  • Android自定义view实现车载可调整轨迹线

    本文实例为大家分享了Android自定义view完成车载可调整轨迹线的具体代码,供大家参考,具体内容如下 同事做的view,拿过来做个记录. /** * */ package com.text.myviewdemo.view; import org.apache.http.conn.routing.RouteInfo.LayerType; import android.content.Context; import android.graphics.Canvas; import android.

  • Unity平台模拟自动挡驾驶汽车

    自动挡汽车功能分析: (1)刹车数值用连续量0-255表示,连续量根据键盘按键按下时长进行递增,1秒后达到峰值,无论车辆处于前进挡还是倒挡,踩下刹车后车辆逐渐减速至0 (2)汽车分为四个挡位,停车挡P,倒挡R,空挡N,前进挡D (3)汽车启动后,松开刹车,车辆进入怠速模式,速度从0逐步提升至12KM/H (4)刹车数值用连续量0-255表示.车速对应1档0-10,2档11-20,3档21-40,4档41-60,5档61-80,6档81-最大值,对应峰值车速150KM/H (5)挂住P档,拉起手刹

  • 自动档汽车如何省油的小技巧

    1.先说自动档车的起步:不少朋友起步给油太少,这样没必要,其实也不好.自动档的换挡设计在2500转(热车时在2200左右换挡),给油太少,达不到2500转时,换挡很慢,不但发动机声音大,而且容易使发动机产生积炭,还会影响发动机的寿命,故多给一些油,让转速迅速到达2500转.这样做的目的不但起步快,对发动机也有利,虽然瞬时油耗可以到达40L,但平均油耗降低. 2.自动档车的带挡滑行最省油!加油到适当时候,松掉油门,这时候的瞬时油耗:0 !!,而且根据行驶状况可以保持很长时间.在市内特别有用:看到远

  • 手动挡汽车如何开省油的经验分享

    怎样开车最省油 一.新车磨合 新车在最初的3000公里行驶里程之内一定要磨合.新车磨合要注意时速控制在每小时80公里以内:尽量减少急加速.急减速. 二.合理保养汽车--定期保养 要知道车况良好的汽车可省油15%到20%. 1.空气滤清器.汽油滤清器.机油滤清器:每行驶5000公里以上配件都需要更换,因为空滤堵塞会引起气量减少,导致汽油燃烧不充分,降低燃油效率,而汽油滤清器的阻塞也会使发动机工作异常. 2.机油:加机油需要适量,注意机油标尺所标示的刻度.机油太多将曲轴淹没,增大阻力:机油太少则无法

  • 详解Android Automotive车载应用对驾驶模式Safe Drive Mode的适配

    前言 最近在Android Automotive 上遇到的一些问题,有好几个都跟Android 车载操作系统上应用的驾驶模式有关,国内这方面的资料很少,自己在这里总结一下相关的知识,主要包含下面几个方面: Android Automotive 和 Android Auto的区别 Android Automotive 的驾驶模式介绍 Android Automotive 实现驾驶模式的几种实现方式和代码示例,以及实现效果 主要是还是想总结一下Android 车载应用对Automotive 驾驶模式

  • 详解Android中Activity的四大启动模式实验简述

    作为Android四大组件之一,Activity可以说是最基本也是最常见的组件,它提供了一个显示界面,从而实现与用户的交互,作为初学者,必须熟练掌握.今天我们就来通过实验演示,来帮助大家理解Activity的四大启动模式. 演示效果如下: 第一步:实验前准备,相关配置文件以及Activity的建立 (1)AndroidMainfest.xml配置文件 <?xml version="1.0" encoding="utf-8"?> <manifest

  • 详解Android中Intent对象与Intent Filter过滤匹配过程

    如果对Intent不是特别了解,可以参见博文<详解Android中Intent的使用方法>,该文对本文要使用的action.category以及data都进行了详细介绍.如果想了解在开发中常见Intent的使用,可以参见<Android中Intent习惯用法>. 本文内容有点长,希望大家可以耐心读完. 本文在描述组件在manifest中注册的Intent Filter过滤器时,统一用intent-filter表示. 一.概述 我们知道,Intent是分两种的:显式Intent和隐式

  • 详解Android Webview加载网页时发送HTTP头信息

    详解Android Webview加载网页时发送HTTP头信息 当你点击一个超链接进行跳转时,WebView会自动将当前地址作为Referer(引荐)发给服务器,因此很多服务器端程序通过是否包含referer来控制盗链,所以有些时候,直接输入一个网络地址,可能有问题,那么怎么解决盗链控制问题呢,其实在webview加载时加入一个referer就可以了,如何添加呢? 从Android 2.2 (也就是API 8)开始,WebView新增加了一个接口方法,就是为了便于我们加载网页时又想发送其他的HT

  • 详解Android获得系统GPU参数 gl.glGetString

    详解Android获得系统GPU参数 gl.glGetString 通过文档的查找,以及源码的剖析,Android的GPU信息需要通过OpenGL来获取,android framework层提供GL10来获取相应的参数,而GL10要在使用自定义的View时才可以获得,下面是获得GPU信息的例子: 1.实现Render类 class DemoRenderer implements GLSurfaceView.Renderer { public void onSurfaceCreated(GL10

  • 详解Android通过修改配置文件设置wifi密码

    详解Android通过修改配置文件设置wifi密码 前言: 在一些非常规Android设备上,如眼镜/手表,输入wifi密码如同一场灾难.此时可以通过修改配置文件的方法设置wifi的ssid和密码. wifi密码配置文件 首先要保证设备已经root,wifi的配置文件在/data/misc/wifi/wpa_supplicant.conf,可以先将其pull出来,然后在下面加上network开头的那部分就ok了.然后再导入进去.下面是我的配置文件: ##### wpa_supplicant co

  • 详解Android更改APP语言模式的实现过程

    一.效果图 二.描述 更改Android项目中的语言,这个作用于只用于此APP,不会作用于整个系统 三.解决方案 (一)布局文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" a

  • 详解android 通过uri获取bitmap图片并压缩

    详解android 通过uri获取bitmap图片并压缩 很多人在调用图库选择图片时会在onActivityResult中用Media.getBitmap来获取返回的图片,如下: Uri mImageCaptureUri = data.getData(); Bitmap photoBmp = null; if (mImageCaptureUri != null) { photoBmp = MediaStore.Images.Media.getBitmap(ac.getContentResolve

  • 详解Android TableLayout中stretchColumns、shrinkColumns的用法

    详解Android 中TableLayout中stretchColumns.shrinkColumns的用法 android:stretchColumns="1" android:shrinkColumns="1"这两个属性是TableLayout所特有的,也是这两个属性影响了子对象的布局. 表格布局是按照行列来组织子视图的布局.表格布局包含一系列的Tabrow对象,用于定义行(也可以使用其它子对象).表格布局不为它的行.列和单元格显示表格线.每个行可以包含个以上(

  • 详解 Android中Libgdx使用ShapeRenderer自定义Actor解决无法接收到Touch事件的问题

    详解 Android中Libgdx使用ShapeRenderer自定义Actor解决无法接收到Touch事件的问题 今天在项目中实现了一个效果,主要是画一个圆.为了后续使用方便,将这个圆封装在一个自定义Actor(CircleActot)中,后续想显示一个圆的时候,只要创建一个CircleActor中即可. 部分代码如下所示: package com.ef.smallstar.unitmap.widget; import android.content.res.Resources; import

随机推荐