从 Car App API 级别 3 开始,您可以使用汽车应用库 API 访问车辆属性和传感器。
要求
若要将 API 与 Android Auto 搭配使用,首先要将 androidx.car.app:app-projected 的依赖项添加到 Android Auto 模块的 build.gradle 文件中。对于 Android Automotive OS,将 androidx.car.app:app-automotive 的依赖项添加到 Android Automotive OS 模块的 build.gradle 文件中。
此外,在您的 AndroidManifest.xml 文件中,您需要声明请求您要使用的汽车数据所需的相关权限。这些权限还必须由用户授予您。您可以在 Android Auto 和 Android Automotive OS 上使用相同的代码,无需创建依赖于平台的流程。不过,所需的权限有所不同。
CarInfo
下表描述了 CarInfo API 中提供的属性以及使用这些属性时必须请求的权限。
| 方法 | 属性 | 权限: Android Auto |
权限: AAOS |
Car App API |
|---|---|---|---|---|
fetchModel |
品牌、型号、年份 | android.car.permission.CAR_INFO |
3 | |
fetchEnergyProfile |
EV 连接器类型、燃料类型 | com.google.android.gms.permission.CAR_FUEL |
android.car.permission.CAR_INFO |
3 |
fetchExteriorDimensions
数据仅在搭载 API 30 或更高版本的某些 AAOS 车辆上提供。 |
外部尺寸 | 不适用 | android.car.permission.CAR_INFO |
7 |
| 收费卡状态、收费卡类型 | 3 | |||
| 电池电量、油量、油量较低、剩余可行驶距离 | com.google.android.gms.permission.CAR_FUEL |
android.car.permission.CAR_ENERGYandroid.car.permission.CAR_ENERGY_PORTSandroid.car.permission.READ_CAR_DISPLAY_UNITS
|
3 | |
| 原始速度、显示速度(显示在汽车的仪表板屏幕上) | com.google.android.gms.permission.CAR_SPEED |
android.car.permission.CAR_SPEEDandroid.car.permission.READ_CAR_DISPLAY_UNITS
|
3 | |
| 里程表距离 | com.google.android.gms.permission.CAR_MILEAGE |
从 Google Play 安装的 Android Automotive OS 应用无法使用这些数据。 | 3 |
例如,若要获取剩余可行驶距离,可实例化 CarInfo 对象,然后创建并注册 OnCarDataAvailableListener:
Kotlin
val carInfo = carContext.getCarService(CarHardwareManager::class.java).carInfo
val listener = OnCarDataAvailableListener<EnergyLevel> { data ->
if (data.rangeRemainingMeters.status == CarValue.STATUS_SUCCESS) {
val rangeRemaining = data.rangeRemainingMeters.value
} else {
// Handle error
}
}
carInfo.addEnergyLevelListener(carContext.mainExecutor, listener)
…
// Unregister the listener when you no longer need updates
carInfo.removeEnergyLevelListener(listener)
Java
CarInfo carInfo = getCarContext().getCarService(CarHardwareManager.class).getCarInfo();
OnCarDataAvailableListener<EnergyLevel> listener = (data) -> {
if(data.getRangeRemainingMeters().getStatus() == CarValue.STATUS_SUCCESS) {
float rangeRemaining = data.getRangeRemainingMeters().getValue();
} else {
// Handle error
}
};
carInfo.addEnergyLevelListener(getCarContext().getMainExecutor(), listener);
…
// Unregister the listener when you no longer need updates
carInfo.removeEnergyLevelListener(listener);
请勿假设汽车的数据始终可用。如果出现错误,请检查您请求的值的状态,从而更好地了解无法检索您请求的数据的原因。如需详细了解 CarInfo 类定义,请参阅参考文档。
CarSensors
CarSensors 类使您可以访问车辆的加速度计、陀螺仪、指南针和位置数据。这些值的可用性可能取决于 OEM。来自加速度计、陀螺仪和指南针的数据的格式与从 SensorManager API 获取的数据的格式相同。
例如,若要检查车辆的朝向:
Kotlin
val carSensors = carContext.getCarService(CarHardwareManager::class.java).carSensors
val listener = OnCarDataAvailableListener<Compass> { data ->
if (data.orientations.status == CarValue.STATUS_SUCCESS) {
val orientation = data.orientations.value
} else {
// Data not available, handle error
}
}
carSensors.addCompassListener(CarSensors.UPDATE_RATE_NORMAL, carContext.mainExecutor, listener)
…
// Unregister the listener when you no longer need updates
carSensors.removeCompassListener(listener)
Java
CarSensors carSensors = getCarContext().getCarService(CarHardwareManager.class).getCarSensors();
OnCarDataAvailableListener<Compass> listener = (data) -> {
if (data.getOrientations().getStatus() == CarValue.STATUS_SUCCESS) {
List<Float> orientations = data.getOrientations().getValue();
} else {
// Data not available, handle error
}
};
carSensors.addCompassListener(CarSensors.UPDATE_RATE_NORMAL, getCarContext().getMainExecutor(),
listener);
…
// Unregister the listener when you no longer need updates
carSensors.removeCompassListener(listener);
若要访问汽车的位置数据,您还需要声明和请求 android.permission.ACCESS_FINE_LOCATION 权限。
测试
若要在 Android Auto 上进行测试时模拟传感器数据,请参阅桌面车机指南的传感器和传感器配置部分。若要在 Android Automotive OS 上进行测试时模拟传感器数据,请参阅 Android Automotive OS 模拟器指南中的模拟硬件状态。