构建适用于 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 为目标平台,应用必须具有特定的清单条目。 有了这些条目,您便可以使用单独的 Automotive OS 版本类型将以 Android 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 或 app bundle 使用单独的软件包名称,而不是使用单独的变种。如需了解每种方法的利弊,请参阅媒体应用开发者指南的软件包名称部分。

除了上一个代码示例中显示的元素之外,为 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 资源集使用较大的值,以增大触摸目标。

分发您的应用

根据应用所属类别的汽车应用质量指南测试您的应用、为其构建 Android Automotive OS build,并针对所属类别完成所有必要更改后,接下来便可将应用发布到 Play 商店的 Automotive OS 设备规格轨道。如需详细了解发布流程,请参阅分发 Android 汽车应用

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

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

创建新问题