一. 简介
在UX Restrictions中需要根据当前的车辆行驶状态,决定当前的限制规则. 其中行驶状态地获取就是通过CarDrivingStateService来实现的. 它的主要职责就是对外提供车辆的行驶状态信息.
应用可以使用CarDrivingStateManager获取和监听驾车状态, CarDrivingStateManager中的方法不多, 用法上非常简单. 需要注意的是相关接口是系统接口(SystemAPI), 系统应用才能使用.
在CarDrivingStateEvent类中主要定义了四种驾车状态.
DRIVING_STATE_UNKNOWN | 当前状态未知 |
DRIVING_STATE_PARKED | 驻车状态 |
DRIVING_STATE_IDLING | 静止状态, 未驻车但车速为0 |
DRIVING_STATE_MOVING | 行驶状态, 车速大于0 |
二. CarDrivingStateService使用
使用方式如下:
Car car = Car.createCar(this);
CarDrivingStateManager carDrivingStateManager =
(CarDrivingStateManager)car.getCarManager(Car.CAR_DRIVING_STATE_SERVICE);
获取当前驾车状态
CarDrivingStateEvent stateEvent = carDrivingStateManager.getCurrentCarDrivingState();
if (stateEvent == null) {
return;
}
String text = null;
switch (stateEvent.eventValue) {
case CarDrivingStateEvent.DRIVING_STATE_MOVING:
text="行驶中";
break;
case CarDrivingStateEvent.DRIVING_STATE_IDLING:
text="速度为0";
break;
case CarDrivingStateEvent.DRIVING_STATE_PARKED:
text="驻车";
break;
case CarDrivingStateEvent.DRIVING_STATE_UNKNOWN:
text="Unknown";
break;
}
Log.e("test", "驾车状态: "+ text);
三. 监听驾车状态
监听驾车状态的变化:
carDrivingStateManager.registerListener(new CarDrivingStateManager.CarDrivingStateEventListener() {
@Override
public void onDrivingStateChanged(CarDrivingStateEvent carDrivingStateEvent) {
//
}
});
驾车状态的判定依赖当前的车速信息和档位信息. CarDrivingStateService通过向CarPropertyService注册监听器, 监听了VehicleProperty.PERF_VEHICLE_SPEED(车速属性)
VehicleProperty.GEAR_SELECTION(档位属性) VehicleProperty.PARKING_BRAKE_ON(驻车制动属性)这3个属性的变化, 从而实现了对当前行驶状态的判断.
结合这三个属性, 确定当前的行驶状态 是 UNKNOWN, PARKED IDLING MOVING 大致的判断规则如下:
1. 当前档位为P档时, 当前状态为parked
2. 当前档位不为P档, 如果辅助制动器(手刹)为工作状态, 则当前状态为parked
3. 当前档位不为P档且辅助制动器未工作, 则根据车速判断, 车速为0, 则当前状态为idling; 车速不为0, 则当前状态为moving
总体来说, CarDrivingStateService并不复杂, 使用同样的方式,系统应用通过CarPropertyManager也可以实现对车辆状态的判断, 但如果对行驶状态的判断都由应用去完成, 那么难免出现不一致的情况. CarDrivingStateService结合了各个属性, 提供了更加统一的车辆行驶状态值, 并提供给上层应用来调用.