为 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 的应用将使用单独的 Automotive OS 发行类型提交到 Play 商店。它们将经过手动审查流程,以帮助确保它们在汽车中使用是安全的。有关更多详细信息,请参见分发适用于汽车的 Android 应用

所需的 Android Automotive OS 功能

要列在汽车中的 Play 商店中,为 Android Automotive OS 构建的应用必须在<uses-feature> 元素中包含以下内容AndroidManifest.xml 文件

<manifest ...>
    ...
    <uses-feature
        android:name="android.hardware.type.automotive"
        android:required="true" />
    ...
</manifest>

提交到非汽车轨道上的应用不能声明前面代码示例中显示的<uses-feature> 元素,因为它们不能依赖于汽车特定硬件。因此,要为汽车和非汽车设备同时发布相同的应用,您需要生成至少两个应用版本:一个用于汽车设备,另一个用于移动设备。有关如何创建这些单独版本的更多信息,请参阅以下文档

应用的两个版本可以共享相同的包名,但必须具有不同的版本代码,因为它们是分别上传到 Play 商店轨道的。

或者,您也可以使用单独的包名,而不是使用单独的版本,为您的移动和汽车 APK 或应用包使用。要了解每种方法的权衡,请参阅媒体应用开发者指南中的包名

除了前面代码示例中显示的元素外,为 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> 元素中包含以下<meta-data> 元素

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

没有此元数据,当汽车进入驾驶模式时,您的应用的活动将被操作系统自动阻止,以减少对驾驶员的干扰。 这种情况发生在onPause 生命周期回调期间,在此期间您必须暂停应用中的视频和音频播放。

类别特定的清单条目

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

优化您的应用以适应 Android Automotive OS

为了给您的用户提供最佳体验,请在为 Android Automotive OS 构建应用时牢记以下事项。

针对大屏幕优化

Android Automotive OS 车辆中提供的屏幕在尺寸、分辨率和纵横比方面与平板电脑和可折叠手机更相似,而不是与手机相似。因此,针对大屏幕优化您的应用也有利于您在汽车中的用户。

特别是,请参阅支持不同的屏幕尺寸将您的 UI 迁移到响应式布局 指南,了解如何充分利用大型显示尺寸,以及媒体游戏 画廊,以获取设计灵感和指导。

其他大型屏幕优化,例如输入兼容性,对 Android Automotive OS 来说并不那么直接有利,但它们仍然可以改善用户体验。例如,键盘导航使用与旋转导航 相同的 API,因此在该方面进行的任何优化都可以使两种形式因素受益。

使用窗口内嵌和显示切口

与其他形式因素一样,Android Automotive OS 包括系统 UI 元素,例如状态栏和导航栏,以及对非矩形显示的支持。

默认情况下,应用在不与系统栏或显示切口重叠的区域中绘制。但是,您可能希望您的应用隐藏系统栏、在它们后面绘制内容或在显示切口处显示内容,如在窗口内嵌内布局您的应用 中所述。如果您的应用执行了这些操作中的任何一项,请参阅以下小节,了解有关如何让您的应用在 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 所示

A diagram of an Android Automotive OS device with a display that's
      curved on the right side.
图 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,则某些功能和功能可能不相关或不可用。例如,汽车通常不提供对摄像头的访问权限。此外,Android Automotive OS 上只提供了一部分 Google Play 服务;有关更多详细信息,请参阅适用于汽车的 Google Play 服务

您可以使用PackageManager.hasSystemFeature API 检测应用是否在 Android Automotive OS 上运行,方法是检查FEATURE_AUTOMOTIVE 功能,如下面的示例所示

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 组件,您可以使用CarConnection API(来自适用于汽车的 Android 应用库)来检测应用是在 Android Automotive OS 还是 Android Auto 上运行——或者它是否根本没有连接到汽车。

对于画中画 (PiP),请遵循既定的最佳实践,检查功能是否可用并做出相应的反应。

处理离线场景

虽然汽车越来越联网,但建议应用处理在没有互联网连接的情况下运行,例如在以下情况下

  • 用户可能会选择退出汽车制造商提供的订阅套餐中的移动数据。
  • 在某些区域,对移动数据的访问可能会受到限制。
  • 具有 Wi-Fi 无线电的汽车可能超出 Wi-Fi 范围,或者 OEM 可能会关闭 Wi-Fi 以支持移动网络。

通过优雅地降低依赖于互联网访问的功能(例如,通过提供离线内容)来准备好处理这些场景。有关更多信息,请参阅优化网络的最佳实践

使用备用资源

为了帮助您在汽车上调整应用,您可以使用car 资源限定符 在 Android Automotive OS 车辆上运行时提供备用资源。例如,如果您使用维度资源 来存储填充值,您可以为car 资源集使用更大的值,以使触摸目标更大。

分发您的应用

在根据适用于其类别的汽车应用质量指南测试完您的应用并针对其类别进行必要的修改后,您可以将其发布到 Play 商店的 Automotive OS 外形规格轨道上。有关发布过程的更多详细信息,请参阅 为汽车分发 Android 应用

提供有关停放应用的反馈

如果您在为 Android Automotive OS 开发停放应用时遇到问题或有功能请求,可以使用Google 问题跟踪器 报告。请务必在问题模板中填写所有要求的信息。在提交新问题之前,请检查该问题是否已在问题列表中报告。您可以通过单击跟踪器中问题旁边的星号来订阅和投票。有关更多信息,请参阅 订阅问题

创建新问题