构建适用于 Android Automotive OS 的停车状态下使用的应用

除了支持专为在驾车时使用而构建的应用外,Android Automotive OS 还支持在停车状态下使用的浏览器游戏视频应用。您可以像以其他大屏设备为对象那样,面向汽车发布相同的应用,只需进行一些细微更改即可。

在 Android Automotive OS 模拟器上测试现有应用

如需开始构建 Android Automotive OS 应用,请先在 Android Automotive OS 模拟器上测试您的现有应用。如需设置模拟器,请按照使用 Android Automotive OS 模拟器进行测试中的步骤操作。然后,您可以按照在模拟器上运行应用中的说明运行该应用。

运行应用时,请注意兼容性问题,例如:

  • 信息娱乐屏幕采用固定屏幕方向。为了符合汽车应用质量指南,应用必须同时支持竖屏和横屏方向。
  • 适用于其他设备的 API 可能不适用于 Android Automotive OS。例如,某些 Google Play 服务 API 不适用于 Android Automotive OS。如需详细了解如何处理这些问题,请参阅停用功能部分。

配置应用的清单文件

如需以 Android Automotive OS 设备为目标平台,应用必须具有特定的清单条目。您选择分发到 Android Automotive OS 设备后,我们会对兼容的应用进行人工审核,以确保它们在汽车中使用是安全的。如需了解详情,请参阅分发到汽车

必需的 Android Automotive OS 功能

若要在汽车上的 Play 商店中上架,专为 Android Automotive OS 构建的应用必须在 AndroidManifest.xml 文件中为 android.hardware.type.automotive 功能添加 <uses-feature> 元素:

<manifest ...>
  ...
  <!--
    Depending on the track you choose to distribute your app, the android:required attribute can
    also be "false" or left unset. See Choose a track for Android Automotive OS.
  -->
  <uses-feature
      android:name="android.hardware.type.automotive"
      android:required="[true|false]" />
  ...
</manifest>

除了上一个代码示例中显示的元素之外,为 Android Automotive OS 构建的应用还必须在根 <manifest> 元素中包含以下 <uses-feature> 元素:

<uses-feature
  android:name="android.hardware.wifi"
  android:required="false"/>
<uses-feature
  android:name="android.hardware.screen.portrait"
  android:required="false"/>
<uses-feature
  android:name="android.hardware.screen.landscape"
  android:required="false"/>

通过将这些功能明确设置为非必需功能,有助于确保应用不会与 Android Automotive OS 设备中的可用硬件功能发生冲突

确保没有任何经过防分心优化的 activity

为确保应用只能在停车状态下使用,请勿在清单中的任何 <activity> 元素中添加以下 <meta-data> 元素:

<!-- NOT ALLOWED -->
<meta-data
  android:name="distractionOptimized"
  android:value="true"/>

在没有这项元数据的情况下,当汽车进入驾车模式后,操作系统会自动阻止您应用的 activity,以减少让驾驶员分心的因素。此操作会作为 onPause 生命周期回调发生,在此期间,您必须暂停播放应用中的视频和音频。

特定类别的清单条目

除了适用于所有停车状态下使用的应用的上述要求外,视频和游戏类别还有其他要求:

针对 Android Automotive OS 优化应用

为了尽可能向用户提供最佳体验,请在构建 Android Automotive OS 应用时牢记以下几点。

针对大屏设备进行优化

Android Automotive OS 车辆的现有屏幕在尺寸、分辨率和宽高比方面与平板电脑和可折叠设备(而非手机)更相似。因此,针对大屏设备优化应用对车载用户也大有裨益。

特别值得一提的是,请参阅支持不同的屏幕尺寸将界面迁移到自适应布局指南以详细了解如何充分利用大显示屏尺寸,并查看媒体库和游戏库以获取设计灵感和指导。

其他针对大屏设备的优化(例如输入兼容性)对 Android Automotive OS 没有直接益处,但仍然可以改善用户体验。例如,键盘导航会使用旋转导航所用的相同 API,因此通过键盘导航进行的优化对这两种设备规格都有益。

使用窗口边衬区和刘海屏

与其他设备规格一样,Android Automotive OS 包含系统界面元素(例如状态栏和导航栏),并支持非矩形显示屏。

默认情况下,应用会在与系统栏或显示屏刘海区域不重叠的区域中绘制。不过,您可能希望应用隐藏系统栏、在系统栏后面绘制内容,或在显示屏刘海中显示内容,如在窗口边衬区内排列应用中所述。如果您的应用执行上述任何操作,请参阅以下子部分,详细了解如何让您的应用在 Android Automotive OS 设备生态系统中正常运行。

系统栏、沉浸模式和无边框渲染

车载系统栏的尺寸和位置可能与其他外形规格的系统栏不同。例如,导航栏可以位于屏幕的左侧、右侧或底部。即使顶部有状态栏,底部有导航栏(如大多数手机和平板电脑),这些元素在汽车上的尺寸也可能会大得多。

此外,Android Automotive OS 允许 OEM 控制应用能否显示或隐藏系统栏以进入和退出沉浸式模式。例如,通过阻止应用隐藏系统栏,原始设备制造商 (OEM) 可以确保车辆控件(例如空调控件)在屏幕上始终可用。如果原始设备制造商 (OEM) 阻止应用控制系统栏,当应用调用 WindowInsetsController(或 WindowInsetsControllerCompat)API 以显示或隐藏系统栏时,系统不会执行任何操作。如需详细了解如何检测应用是否能够修改内边距,请参阅 showhide 的文档。

同样,原始设备制造商 (OEM) 还可以控制应用能否设置系统栏的颜色和透明度,以确保系统栏及其包含的元素始终清晰可见。如果您的应用从边到边绘制,请检查是否仅在系统栏后面绘制非关键内容。如果设备原始设备制造商 (OEM) 阻止设置栏的颜色或半透明度,则此内容可能无法显示。

<!-- Depending on OEM configuration, these style declarations
     (and the corresponding runtime calls) may be ignored -->
<style name="...">
  <item name="android:statusBarColor">...</item>
  <item name="android:navigationBarColor">...</item>
  <item name="android:windowTranslucentStatus">...</item>
  <item name="android:windowTranslucentNavigation">...</status>
</style>

如果您的应用采用无边框设计,请勿假定系统栏的大小、数量、类型或位置。请改用窗口边衬区 API 以相对于系统栏排列应用的内容。如需详细了解如何使用这些 API,请参阅在应用中以无边框方式显示内容。虽然从来不建议使用,但硬编码的边距值可能会在其他设备上将内容保持在安全区域内,但在汽车上可能不会。

适应不规则形状的显示屏

除了矩形显示屏之外,某些车辆可能还具有不规则形状的屏幕,如图 1 所示:

一张 Android Automotive OS 设备的示意图,显示屏右侧呈弧形。
图 1:一款 Android Automotive OS 设备,其显示屏右侧为弧形。绿色区域是不会与曲线显示屏切口的边界框重叠的安全矩形。

如果您的应用未全屏渲染,则无需执行任何操作,即可在安全区域内渲染。

如果您的应用从边到边呈现,您可以选择应用在显示屏刘海区域中的行为方式。您可以使用资源来实现此目的,方法是为应用的主题设置 android:windowLayoutInDisplayCutoutMode 属性,也可以在运行时修改窗口的 layoutInDisplayCutoutMode 属性。

由于 Android Automotive OS 设备上的显示屏缺口类型与移动设备上的显示屏缺口类型不同,因此请勿使用 LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULTLAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES,它们的行为针对移动设备上的缺口进行了优化。请改用 LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVERLAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS,以始终避开或始终进入剪裁区域。选择后者时,请参阅支持刘海屏,详细了解与刘海屏相关的 API。

如果您的应用渲染到显示屏切口区域,并且您希望在 Android Automotive OS 和移动设备之间采用不同的行为,请参阅停用功能(如果您的应用在运行时设置此行为)和使用备用资源(如果您的应用使用资源文件设置此行为)获取相关指导。

停用功能

如果您要将现有移动应用提供给 Android Automotive OS,某些特性和功能可能不相关或不可用。例如,汽车通常不提供对摄像头的访问权限。此外,只有部分 Google Play 服务适用于 Android Automotive OS;如需了解详情,请参阅适用于汽车的 Google Play 服务

您可以使用 PackageManager.hasSystemFeature API,通过检查有无 FEATURE_AUTOMOTIVE 功能来检测应用是否正在 Android Automotive OS 上运行,如以下示例所示:

Kotlin

val packageManager: PackageManager = ... // Get a PackageManager from a Context
val isCar = packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)
if (isCar) {
  // Enable or disable a given feature
}

Java

PackageManager packageManager = ... // Get a PackageManager from a Context
boolean isCar = packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)
if (isCar) {
  // Enable or disable a given feature
}

或者,如果您的应用还包含 Android Auto 组件,您可以使用 Android for Cars 应用库中的 CarConnection API 来检测应用是在 Android Automotive OS 或 Android Auto 上运行,还是根本未关联到汽车。

对于画中画 (PiP) 功能,请遵循既有的最佳实践来检查该功能是否可用并做出适当的回应。

处理离线场景

尽管汽车的联网程度越来越高,但我们建议应用具备在没有互联网连接的情况下处理运行的能力,例如以下情况:

  • 用户可能会选择停用汽车制造商提供的订阅套餐中的移动流量服务。
  • 在某些区域,使用移动流量可能会受到限制。
  • 配有 Wi-Fi 无线装置的汽车可能不在 Wi-Fi 覆盖范围内,或者原始设备制造商 (OEM) 可能会停用 Wi-Fi,改为使用移动网络。

请优雅降级依赖于访问互联网的功能(例如提供离线内容),准备好在您的应用中处理这些场景。如需了解详情,请参阅网络优化最佳实践

使用备用资源

为了有助于您的应用在汽车上运行,当在 Android Automotive OS 车辆上运行时,您可以使用 car 资源限定符提供备用资源。例如,如果您使用尺寸资源来存储内边距值,则可以为 car 资源集使用较大的值,以增大触摸目标。

分发您的应用

根据应用所属类别的汽车应用质量指南测试您的应用后,您就可以使用 Google Play 将应用分发到内置 Google 的汽车。如需详细了解发布流程,请参阅分发到汽车

针对在停车状态下使用的应用提供反馈

如果您在针对 Android Automotive OS 开发在停车状态下使用的应用时遇到问题或有功能请求,可以使用 Google 问题跟踪器报告该问题。确保在问题模板中填写所需的所有信息。在提交新问题之前,请先查看问题列表,确认该问题是否已报告过。您可以在跟踪器中点击某个问题的星标,订阅该问题并为其投票。如需了解详情,请参阅订阅问题

创建新问题