为 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 构建的应用必须在AndroidManifest.xml 文件中包含以下<uses-feature> 元素

<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 通过检查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 以支持移动网络。

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

使用备用资源

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

分发您的应用

在根据其类别的 汽车应用质量指南 测试您的应用并根据其类别对其进行必要的更改后创建 Android Automotive OS 版本,然后您可以将其发布到 Play 商店上的 Automotive OS 外形尺寸轨道。有关发布过程的更多详细信息,请参阅 分发 Android 汽车应用

提供有关停放应用的反馈

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

创建新问题