针对大屏设备的实战宝典

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

Android 提供打造 5 星级大屏应用所需的全部要素。在此实战宝典中的各个方案里,我们会选择并结合利用各种要素,解决开发方面的特定问题。每个方案都包含最佳实践、优质的代码示例和分步说明,可帮助您成为大屏应用开发的高手。

星级评分

我们根据方案对大屏应用质量指南的遵循程度对其进行星级评分。

5 星 符合 1 级标准,应用在大屏设备上表现优异
4 星 符合 2 级标准,应用针对大屏设备优化
3 星 符合 3 级标准,应用支持大屏设备
2 星 提供一些支持大屏设备的功能,但不符合大屏应用质量指南
1 星 满足特定用例的需求,但无法正常支持大屏设备

Chromebook 相机支持

3 星

在 Google Play 上获得 Chromebook 用户的关注。

如果您的相机应用只需基本的相机功能即可正常运行,请注意避免因为无意中指定高端手机上才有的高级相机功能而致使应用商店阻止 Chromebook 用户安装该应用。

Chromebook 内置有前置(朝向用户)的摄像头,非常适合视频会议、快照及其他应用场景。不过并非所有 Chromebook 都有后置(朝向外面)的摄像头,而且 Chromebook 上朝向用户的摄像头大多不支持自动对焦或闪光灯。

最佳实践

兼容面广的相机应用支持所有设备(无论摄像头配置如何),包括配有前置摄像头、后置摄像头和通过 USB 连接外接摄像头的设备。

为确保应用商店能让尽可能多的设备使用您的应用,请务必声明应用使用的所有相机功能,并明确指出各项功能是否为必需功能。

所需要素

  • CAMERA 权限 - 向应用授予对设备相机的使用权限
  • <uses-feature> 清单元素 - 向应用商店声明应用所使用的功能
  • required 属性 - 向应用商店指明应用在不用某项特定功能的情况下能否照常运行

步骤

摘要

声明 CAMERA 权限。声明可提供基本相机支持的相机功能。指明每项功能是否为必需功能。

1. 声明 CAMERA 权限

在应用清单中添加以下权限:

<uses-permission android:name="android.permission.CAMERA" />
2. 声明基本的相机功能

在应用清单中添加以下功能:

<uses-feature android:name="android.hardware.camera.any" android:required="false" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
<uses-feature android:name="android.hardware.camera.flash" android:required="false" />
3. 指明每项功能是否为必需功能

android.hardware.camera.any 功能设置 android:required="false" 以允许具有任何内置或外置摄像头(或根本没有摄像头)的设备使用您的应用。

对于其他功能,请设置 android:required="false",以确保没有后置摄像头、自动对焦或闪光灯功能的设备(例如 Chromebook)也能使用您发布到应用商店中的应用。

成果

Chromebook 用户可以从 Google Play 和其他应用商店下载并安装您的应用。全面支持相机的设备(例如手机)的相机功能不会受到限制。

通过明确设置应用支持的相机功能并指定应用必需的功能,您已让自己的应用可在尽可能多的设备上使用。

其他资源

如需了解更多信息,请参阅 <uses-feature> 文档中的相机硬件功能

限制应用在手机上的屏幕方向,但不限制其在大屏设备上的屏幕方向

2 星

您的应用在纵向模式下效果好,因此您将应用限制为仅限纵向显示。但是您发现该应用在横向模式下还可实现更多优势。

如何同时兼顾两种场景?也就是说,如何让应用在小屏设备上仅可纵向显示,但在大屏设备上也可横向显示?

最佳实践

出色的应用会考虑设备屏幕方向等用户偏好设置。

大屏设备应用质量指南建议应用支持所有设备配置,包括纵向和横向屏幕方向、多窗口模式以及可折叠设备的折叠和展开状态。应用应针对不同的配置优化布局和界面,并且在配置发生更改时应保存及恢复状态。

此方案是一种临时性措施 - 提供一些屏幕支持。在您能够改进应用,使其针对所有设备配置提供全面支持之前,可以权且使用此方案。

所需要素

步骤

摘要

在应用清单中让应用默认能够响应屏幕方向变化。在运行时,确定应用窗口大小。如果应用窗口很小,则通过替换清单中的屏幕方向设置来限制应用的屏幕方向。

1. 在应用清单中指定屏幕方向设置

将应用清单的 screenOrientation 元素设置为 fullUser。如果用户没有锁定基于传感器的旋转,您的应用将支持所有设备屏幕方向。

<activity
    android:name=".MyActivity"
    android:screenOrientation="fullUser">

2. 确定屏幕尺寸

在清单中设置为支持用户允许的所有屏幕方向后,您就能以编程方式根据屏幕尺寸指定应用的屏幕方向。

使用 Jetpack WindowManager 库的 WindowMetricsCalculator#computeMaximumWindowMetrics() 方法可获取设备屏幕尺寸(作为 WindowMetrics 对象)。窗口指标可与窗口大小类别进行比较,以确定何时限制屏幕方向。

窗口大小类别提供小屏幕和大屏幕之间的断点。一般手机中尺寸(宽度或高度)较小者小于 600dp;而平板电脑和大屏可折叠设备中尺寸较小者则大于 600dp。

使用断点 dp 值确定屏幕尺寸:

Kotlin

/** Determines whether the device has a compact screen. **/
fun compactScreen(): Boolean {
    val screenMetrics = WindowMetricsCalculator
                        .getOrCreate()
                        .computeMaximumWindowMetrics(this)
    val shortSide = min(screenMetrics.bounds.width(),
                        screenMetrics.bounds.height())
    return shortSide / resources.displayMetrics.density < 600
}

Java

/** Determines whether the device has a compact screen. **/
public boolean compactScreen() {
    WindowMetrics screenMetrics = WindowMetricsCalculator
                                  .getOrCreate()
                                  .computeMaximumWindowMetrics(this);
    int shortSide = Math.min(screenMetrics.getBounds().width(),
                             screenMetrics.getBounds().height());
    return shortSide / getResources().getDisplayMetrics().density < 600;
}
    注意
  • 以上示例作为 activity 的方法实现;因此,系统会在 computeMaximumWindowMetrics() 的参数中将 activity 作为 this 解除引用。
  • 示例中使用 computeMaximumWindowMetrics() 方法代替 computeCurrentWindowMetrics(),因为应用可以在多窗口模式下启动,该模式会忽略屏幕方向设置。除非应用窗口占满整个设备屏幕,否则确定应用窗口大小并替换屏幕方向设置没有意义。

如需了解如何声明依赖项以使 computeMaximumWindowMetrics() 方法在您的应用中可用,请参阅 WindowManager

3. 替换应用清单设置

确定设备的屏幕尺寸较小后,可以调用 Activity#setRequestedOrientation() 来替换清单的 screenOrientation 设置:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    requestedOrientation = if (compactScreen())
        ActivityInfo.SCREEN_ORIENTATION_PORTRAIT else
        ActivityInfo.SCREEN_ORIENTATION_FULL_USER
    ...
}

Java

@Override
protected void onCreate(Bundle savedInstance) {
    super.onCreate(savedInstanceState);
    if (compactScreen()) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    } else {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_USER);
    }
    ...
}

通过将逻辑添加到 onCreate() 方法,您可以在创建 activity 时获取屏幕尺寸并替换屏幕方向设置,例如在设备旋转后或者可折叠设备折叠或展开时。

成果

现在,在小屏设备上,无论设备如何旋转,应用应该会始终保持纵向模式。在大屏设备上,该应用应支持横向模式和纵向模式。

其他资源

如果您在为使应用始终支持所有设备配置而升级应用方面需要帮助,请参阅以下内容: