<uses-feature>

Google Play 使用应用清单中声明的 <uses-feature> 元素,将您的应用从不满足其硬件和软件功能要求的设备中过滤掉。

通过指定应用所需的功能,您可以让 Google Play 只向设备满足应用功能要求的用户展示您的应用,而不是向所有用户展示。

有关 Google Play 如何将功能用作过滤依据的重要信息,请参阅“Google Play 和基于功能的过滤”部分。

语法
<uses-feature
  android:name="string"
  android:required=["true" | "false"]
  android:glEsVersion="integer" />
包含于
<manifest>
说明

声明应用使用的单个硬件或软件功能。

<uses-feature> 声明的目的是告知任何外部实体您的应用依赖于哪些硬件和软件功能。该元素提供了一个 required 属性,让您指定您的应用是否需要并必须具备声明的功能,或者优先具备该功能但没有也能运行。

由于 Android 设备之间的功能支持可能有所不同,<uses-feature> 元素在让应用描述其使用的设备相关功能方面发挥着重要作用。

您的应用声明的可用功能集对应于 Android PackageManager 提供的一组功能常量。功能常量列在本文档的“功能参考”部分。

您必须在单独的 <uses-feature> 元素中指定每个功能,因此如果您的应用需要多个功能,它会声明多个 <uses-feature> 元素。例如,一个需要设备中同时具备蓝牙和相机功能的应用会声明以下两个元素

<uses-feature android:name="android.hardware.bluetooth" android:required="true" />
<uses-feature android:name="android.hardware.camera.any" android:required="true" />

通常,始终为您的应用所需的所有功能声明 <uses-feature> 元素。

声明的 <uses-feature> 元素仅供参考,这意味着 Android 系统本身在安装应用之前不会检查设备上是否有匹配的功能支持。

然而,其他服务(例如 Google Play)和应用可以检查您的应用的 <uses-feature> 声明,作为处理或与您的应用交互的一部分。因此,声明您的应用使用的所有功能非常重要。

对于某些功能,可能有一个特定的属性让您定义该功能的版本,例如使用的 Open GL 版本(使用 glEsVersion 声明)。其他功能,例如相机,如果设备存在或不存在,则使用 name 属性声明。

虽然 <uses-feature> 元素仅对运行 API Level 4 或更高版本的设备激活,但请为所有应用包含这些元素,即使 minSdkVersion 是 3 或更低。运行旧版本平台的设备会忽略该元素。

注意:声明功能时,请记住您还必须酌情请求相应的权限。例如,在您的应用访问相机 API 之前,您需要请求 CAMERA 权限。请求权限会授予您的应用访问相应硬件和软件的权限。声明您的应用使用的功能有助于确保设备兼容性正常。

属性
android:name
指定应用使用的单个硬件或软件功能作为描述符字符串。有效的属性值列在“硬件功能”“软件功能”部分。这些属性值区分大小写。
android:required
一个布尔值,指示应用是否需要 android:name 中指定的功能。
  • 为某个功能声明 android:required="true" 表示当设备上不存在指定功能时,应用无法正常运行或不是设计用来运行
  • 为某个功能声明 android:required="false" 表示应用如果设备上存在该功能则会使用该功能,但如果需要,它设计为在没有指定功能的情况下也能运行

android:required 的默认值为 "true"

android:glEsVersion
应用所需的 OpenGL ES 版本。高 16 位表示主版本号,低 16 位表示次版本号。例如,要指定 OpenGL ES 版本 2.0,可将值设置为 "0x00020000";要指定 OpenGL ES 3.2,可将值设置为 "0x00030002"。

一个应用在其清单中最多指定一个 android:glEsVersion 属性。如果指定多个,则使用数值最高的一个 android:glEsVersion,其他值将被忽略。

如果应用未指定 android:glEsVersion 属性,则假定该应用仅需要 OpenGL ES 1.0,所有 Android 设备都支持此版本。

应用可以假定,如果平台支持某个 OpenGL ES 版本,它也支持所有数值上较低的 OpenGL ES 版本。因此,对于需要 OpenGL ES 1.0 和 OpenGL ES 2.0 的应用,请指定它需要 OpenGL ES 2.0。

对于可以与多个 OpenGL ES 版本中的任意一个配合使用的应用,只需指定它所需的数值上最低的 OpenGL ES 版本即可。它可以在运行时检查是否有更高版本的 OpenGL ES 可用。

有关使用 OpenGL ES 的更多信息,包括如何在运行时检查支持的 OpenGL ES 版本,请参阅OpenGL ES API 指南

引入版本
API Level 4
另请参阅

Google Play 和基于功能的过滤

Google Play 会过滤对用户可见的应用,以便用户只能看到和下载与其设备兼容的应用。其过滤应用的方式之一是基于功能兼容性。

为了确定应用与特定用户设备的兼容性,Google Play 会比较

  • 应用所需的功能,如应用清单中的 <uses-feature> 元素中所声明。
  • 设备上硬件或软件中可用的功能,如使用只读系统属性报告。

为了准确比较功能,Android 包管理器提供了一组共享的功能常量,应用和设备都使用这些常量来声明功能要求和支持。可用的功能常量列在本文档的“功能参考”部分以及 PackageManager 的类文档中。

当用户启动 Google Play 时,应用会通过调用 getSystemAvailableFeatures() 查询包管理器以获取设备上可用功能的列表。商店应用随后在为用户建立会话时将功能列表传递给 Google Play。

每次您将应用上传到 Google Play 管理中心时,Google Play 都会扫描应用的清单文件。它会查找 <uses-feature> 元素,并在某些情况下结合其他元素(例如 <uses-sdk><uses-permission> 元素)来评估它们。在确定应用所需的功能集后,它将该列表内部存储为与应用 APK 和应用版本关联的元数据。

当用户使用 Google Play 应用搜索或浏览应用时,该服务会将每个应用所需的功能与用户设备上可用的功能进行比较。如果设备上存在应用所需的所有功能,Google Play 就会让用户看到该应用并可能下载。

如果设备不支持任何所需功能,Google Play 就会过滤该应用,使其对用户不可见或不可下载。

由于您在 <uses-feature> 元素中声明的功能直接影响 Google Play 如何过滤您的应用,因此了解 Google Play 如何评估应用的清单并确定所需功能集非常重要。以下各节提供更多信息。

基于显式声明功能的过滤

显式声明功能是您的应用在 <uses-feature> 元素中声明的功能。如果您针对 API level 5 或更高版本进行编译,功能声明可以包含 android:required=["true" | "false"] 属性。

这让您可以指定应用是否需要该功能并且没有该功能无法正常运行 ("true"),或者如果可用则使用该功能,但设计为在没有该功能的情况下也能运行 ("false")。

Google Play 以这种方式处理显式声明的功能

  • 如果某个功能被显式声明为必需的,如以下示例所示,Google Play 会将该功能添加到应用的所需功能列表中。然后,它会从不提供该功能的设备上的用户中过滤掉该应用。
    <uses-feature android:name="android.hardware.camera.any" android:required="true" />
  • 如果某个功能被显式声明为必需的,如以下示例所示,Google Play 不会将该功能添加到所需功能列表中。因此,在过滤应用时,永远不会考虑显式声明的非必需功能。即使设备不提供声明的功能,Google Play 仍然认为该应用与设备兼容,并会将其显示给用户,除非适用其他过滤规则。
    <uses-feature android:name="android.hardware.camera" android:required="false" />
  • 如果某个功能被显式声明,但没有 android:required 属性,Google Play 会假定该功能是必需的,并据此设置过滤。

一般来说,如果您的应用设计为在 Android 1.6 及更低版本上运行,则 android:required 属性在 API 中不可用,并且 Google Play 会假定所有 <uses-feature> 声明都是必需的。

注意:通过显式声明某个功能并包含 android:required="false" 属性,您可以有效禁用 Google Play 上针对指定功能的所有过滤。

基于隐式功能的过滤

隐式功能是指应用为了正常运行而需要,但在清单文件的 <uses-feature> 元素中声明的功能。严格来说,每个应用始终声明其使用的或需要的所有功能是最佳做法,应用使用的功能没有声明可能被视为错误。

然而,作为对用户和开发者的保障,Google Play 会在每个应用中寻找隐式功能,并为这些功能设置过滤,就像它为显式声明的功能所做的那样。

应用可能需要某个功能但未声明,原因如下

  • 该应用是针对旧版 Android 库(Android 1.5 或更早版本)编译的,其中 <uses-feature> 元素不可用。
  • 开发者错误地假定所有设备都具备该功能,因此无需声明。
  • 开发者意外遗漏了功能声明。
  • 开发者显式声明了该功能,但声明无效。例如,<uses-feature> 元素名称拼写错误或 android:name 属性的字符串值无法识别都会使功能声明无效。

为了应对这些情况,Google Play 会通过检查清单文件中声明的其他元素,特别是 <uses-permission> 元素,尝试发现应用的隐式功能要求。

如果应用请求硬件相关权限,Google Play 会假定该应用使用了底层硬件功能,因此需要这些功能,即使没有相应的 <uses-feature> 声明。对于此类权限,Google Play 会将底层硬件功能添加到它为应用存储的元数据中,并为它们设置过滤。

例如,如果应用请求 CAMERA 权限,Google Play 会假定该应用需要后置(世界面对)相机,即使应用没有声明 <uses-feature> 元素用于 android.hardware.camera。因此,Google Play 会过滤掉没有后置摄像头的设备。

如果您不希望 Google Play 基于某个特定的隐式功能进行过滤,请在 <uses-feature> 元素中显式声明该功能并包含 android:required="false" 属性。例如,要禁用由 CAMERA 权限隐含的过滤,请声明以下功能

<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />

注意:您在 <uses-permission> 元素中请求的权限可以直接影响 Google Play 如何过滤您的应用。“暗示功能要求的权限”部分列出了所有暗示功能要求并因此触发过滤的权限集。

蓝牙功能的特殊处理

Google Play 在确定蓝牙过滤时,应用的规则与前面的示例略有不同。

如果应用在 <uses-permission> 元素中声明了蓝牙权限,但未在 <uses-feature> 元素中显式声明蓝牙功能,Google Play 会检查应用设计运行的 Android 平台版本,如 <uses-sdk> 元素中所指定。

如下表所示,Google Play 仅在应用将其最低或目标平台声明为 Android 2.0(API level 5)或更高版本时,才启用蓝牙功能的过滤。但是请注意,当应用在 <uses-feature> 元素中显式声明蓝牙功能时,Google Play 应用正常的过滤规则。

表 1. Google Play 如何确定请求蓝牙权限但未在 <uses-feature> 元素中声明蓝牙功能的应用的蓝牙功能要求。

如果 minSdkVersion 是 ... targetSdkVersion 结果
<=4,或未声明 <uses-sdk> <=4 Google Play 不会根据任何设备报告的对 android.hardware.bluetooth 功能的支持来过滤该应用。
<=4 >=5 Google Play 会过滤掉所有不支持 android.hardware.bluetooth 功能的设备(包括旧版本)。
>=5 >=5

以下示例说明了 Google Play 如何处理蓝牙功能所产生的不同过滤效果。

在第一个示例中,一个设计用于在旧版 API level 上运行的应用声明了蓝牙权限,但未在 <uses-feature> 元素中声明蓝牙功能。
结果:Google Play 不会从任何设备上过滤该应用。
<manifest ...>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-sdk android:minSdkVersion="3" />
    ...
</manifest>
在第二个示例中,同一个应用还声明了目标 API level 为 "5"。
结果:Google Play 现在假定该功能是必需的,并从所有未报告支持蓝牙的设备(包括运行旧版本平台的设备)中过滤掉该应用。
<manifest ...>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="5" />
    ...
</manifest>
这里,同一个应用现在明确声明了蓝牙功能。
结果:与上一个示例相同:应用了过滤。
<manifest ...>
    <uses-feature android:name="android.hardware.bluetooth" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="5" />
    ...
</manifest>
最后,在以下情况下,同一个应用添加了 android:required="false" 属性。
结果:Google Play 会禁用所有设备上基于蓝牙功能支持的过滤。
<manifest ...>
    <uses-feature android:name="android.hardware.bluetooth" android:required="false" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="5" />
    ...
</manifest>

测试您的应用所需的功能

您可以使用 Android SDK 中包含的 aapt2 工具,根据应用声明的功能和权限来确定 Google Play 如何过滤您的应用。为此,请运行带有 dump badging 命令的 aapt2。这将导致 aapt2 解析您应用的清单,并应用 Google Play 用于确定您的应用所需功能的相同规则。

要使用该工具,请按照以下步骤操作

  1. 将您的应用构建并导出为未签名 APK。如果您在 Android Studio 中开发,请按如下方式使用 Gradle 构建应用
    1. 打开项目,然后选择 Run > Edit Configurations
    2. 选择 Run/Debug Configurations 窗口左上角附近的加号。
    3. 选择 Gradle
    4. Name 中输入“Unsigned APK”。
    5. Gradle project 部分选择您的模块。
    6. Tasks 中输入“assemble”。
    7. 选择 OK 以完成新配置。
    8. 确保在工具栏中选中了 Unsigned APK 运行配置,然后选择 Run > Run 'Unsigned APK'
    您可以在 <ProjectName>/app/build/outputs/apk/ 目录中找到您的未签名 APK。
  2. 找到 aapt2 工具,如果它不在您的 PATH 中。如果您使用的是 SDK Tools r8 或更高版本,您可以在 <SDK>/build-tools/<tools version number> 目录中找到 aapt2

    注意:您必须使用最新 Build-Tools 组件提供的 aapt2 版本。如果您没有最新的 Build-Tools 组件,请使用Android SDK Manager下载。

  3. 使用以下语法运行 aapt2
$ aapt2 dump badging <path_to_exported_.apk>

以下是前面显示的第二个蓝牙示例的命令输出示例

$ ./aapt2 dump badging BTExample.apk
package: name='com.example.android.btexample' versionCode='' versionName=''
uses-permission:'android.permission.BLUETOOTH_ADMIN'
uses-feature:'android.hardware.bluetooth'
sdkVersion:'3'
targetSdkVersion:'5'
application: label='BT Example' icon='res/drawable/app_bt_ex.png'
launchable activity name='com.example.android.btexample.MyActivity'label='' icon=''
uses-feature:'android.hardware.touchscreen'
main
supports-screens: 'small' 'normal' 'large'
locales: '--_--'
densities: '160'

功能参考

以下各节提供了有关硬件功能、软件功能以及暗示特定功能要求的权限集的参考信息。

硬件功能

本节介绍最新平台版本支持的硬件功能。要表明您的应用使用或需要某个硬件功能,请在 android:name 属性中声明对应的值,以 "android.hardware" 开头。每次声明一个硬件功能时,使用单独的 <uses-feature> 元素。

音频硬件功能

android.hardware.audio.low_latency
应用使用设备的低延迟音频管线,可减少处理声音输入或输出时的延迟和滞后。
android.hardware.audio.output
应用使用设备的扬声器、音频插孔、蓝牙流媒体功能或类似机制传输声音。
android.hardware.audio.pro
应用使用设备的高端音频功能和性能。
android.hardware.microphone
应用使用设备的麦克风录制音频。

蓝牙硬件功能

android.hardware.bluetooth
应用使用设备的蓝牙功能,通常用于与其他支持蓝牙的设备通信。
android.hardware.bluetooth_le
应用使用设备的低功耗蓝牙无线电功能。

相机硬件功能

注意:为避免 Google Play 不必要地过滤您的应用,请为您应用没有也能运行的任何相机功能添加 android:required="false"。否则,Google Play 会假定该功能是必需的,并阻止不支持该功能的设备访问您的应用。

大屏幕支持

一些大屏幕设备不支持所有相机功能。Chromebook 通常没有后置(世界面对)相机、自动对焦或闪光灯。但 Chromebook 有前置(用户面对)相机,并且经常连接外部相机。

为了提供基本的相机支持并使您的应用在尽可能多的设备上可用,请在您的应用清单中添加以下相机功能设置

<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" />

调整功能设置以支持您的应用用例。但是,为了使您的应用在最大数量的设备上可用,始终包含 required 属性以明确指定某个功能是否为必需。

功能列表
android.hardware.camera.any

应用使用设备的任一相机或连接到设备的外部相机。如果您的应用不要求相机必须是后置(世界面对)或前置(用户面对)的,则使用此功能代替 android.hardware.cameraandroid.hardware.camera.front

CAMERA 权限意味着您的应用也使用 android.hardware.camera。后置摄像头是一项必需功能,除非使用 android:required="false" 声明了 android.hardware.camera

android.hardware.camera

应用使用设备的后置(世界面对)相机。

注意:像 Chromebook 这样只有前置(用户面对)相机的设备不支持此功能。如果您的应用可以使用任何相机,无论相机朝向哪个方向,都请使用 android.hardware.camera.any

注意:CAMERA 权限意味着后置摄像头是必需功能。为了帮助确保当您的应用清单包含 CAMERA 权限时在 Google Play 上正确过滤,请明确指定您的应用使用 camera 功能,并指明它是否是必需的,例如
<uses-feature android:name="android.hardware.camera" android:required="false" />

android.hardware.camera.front

应用使用设备的前置(用户面对)相机。

CAMERA 权限意味着您的应用也使用 android.hardware.camera。后置摄像头是一项必需功能,除非使用 android:required="false" 声明了 android.hardware.camera

注意:如果您的应用使用 android.hardware.camera.front 但未明确声明 android.hardware.camera 并将 android.required 设置为 "false",则没有后置摄像头的设备(例如 Chromebook)将被 Google Play 过滤掉。如果您的应用支持只有前置摄像头的设备,请声明 android.hardware.camera 并将 android.required 设置为 "false",以防止不必要的过滤。

android.hardware.camera.external

应用与用户连接到设备的外部相机进行通信。此功能不保证您的应用可以使用外部相机。

CAMERA 权限意味着您的应用也使用 android.hardware.camera。后置摄像头是一项必需功能,除非使用 android:required="false" 声明了 android.hardware.camera

android.hardware.camera.autofocus

应用使用设备相机支持的自动对焦功能。

注意:CAMERA 权限意味着自动对焦是一项必需功能。为了帮助确保当您的应用清单包含 CAMERA 权限时在 Google Play 上正确过滤,请明确指定您的应用使用自动对焦功能,并指明它是否是必需的,例如
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />.

android.hardware.camera.flash

应用使用设备相机支持的闪光灯功能。

android.hardware.camera.capability.manual_post_processing

应用使用设备相机支持的 MANUAL_POST_PROCESSING 功能。

此功能允许您的应用覆盖相机的自动白平衡功能。使用 android.colorCorrection.transformandroid.colorCorrection.gains 和模式为 TRANSFORM_MATRIXandroid.colorCorrection.mode

android.hardware.camera.capability.manual_sensor

应用使用设备相机支持的 MANUAL_SENSOR 功能。

此功能意味着支持自动曝光锁定 (android.control.aeLock),使相机的曝光时间和感光度保持固定在特定值。

android.hardware.camera.capability.raw

应用使用设备相机支持的 RAW 功能。

此功能意味着设备可以保存 DNG(原始)文件。设备的相机提供您的应用直接处理原始图像所需的 DNG 相关元数据。

android.hardware.camera.level.full
应用使用设备至少一个相机提供的 FULL 级别图像捕获支持。FULL 支持包括连拍功能、每帧控制和手动后处理控制。请参阅 INFO_SUPPORTED_HARDWARE_LEVEL_FULL

设备 UI 硬件功能

android.hardware.type.automotive

应用设计用于在车辆内的一组屏幕上显示其 UI。用户使用物理按钮、触控、旋钮控制器和类似鼠标的界面与应用交互。车辆的屏幕通常出现在车辆的中控台或仪表盘上。

注意:有关此功能的使用以及构建车载应用的指导,请参阅分发到汽车

android.hardware.type.television

(已弃用;请改用 android.software.leanback。)

应用设计用于在电视上显示其 UI。此功能将“电视”定义为典型的客厅电视体验:应用在大屏幕上显示,用户坐得很远,主要输入形式是方向键等,而不是鼠标、指针或触控设备。

android.hardware.type.watch
应用设计用于在手表上显示其 UI。手表佩戴在身体上,例如手腕上。用户与设备交互时距离设备非常近。
android.hardware.type.pc

应用设计用于在 Chromebook 上显示其 UI。此功能会禁用鼠标和触控板的输入模拟,因为 Chromebook 使用鼠标和触控板硬件。请参阅鼠标输入

注意:将此元素的 required 设置为 "false";否则,Google Play 商店会使您的应用在 Chromebook 以外的设备上不可用。

指纹硬件功能

android.hardware.fingerprint
应用使用设备的生物识别硬件读取指纹。

游戏手柄硬件功能

android.hardware.gamepad
应用捕获游戏控制器输入,可以是来自设备本身的输入,也可以是来自连接的游戏手柄的输入。

红外硬件功能

android.hardware.consumerir
应用使用设备的红外 (IR) 功能,通常用于与其他消费类 IR 设备通信。

位置硬件功能

android.hardware.location
应用使用设备上的一项或多项功能来确定位置,例如 GPS 位置、网络位置或蜂窝位置。
android.hardware.location.gps

应用使用从设备上的全球定位系统 (GPS) 接收器获得的精确位置坐标。

通过使用此功能,应用意味着它也使用 android.hardware.location 功能,除非使用属性 android:required="false" 声明了此父功能。

android.hardware.location.network

应用使用从设备上支持的网络地理位置系统获得的粗略位置坐标。

通过使用此功能,应用意味着它也使用 android.hardware.location 功能,除非使用属性 android:required="false" 声明了此父功能。

NFC 硬件功能

android.hardware.nfc
应用使用设备的近场通信 (NFC) 无线电功能。
android.hardware.nfc.hce

应用使用设备上托管的 NFC 卡模拟功能。

OpenGL ES 硬件功能

android.hardware.opengles.aep
应用使用设备上安装的OpenGL ES Android Extension Pack

传感器硬件功能

android.hardware.sensor.accelerometer
应用使用设备的加速度计读取运动数据,以检测设备的当前方向。例如,应用可以使用加速度计读数来确定何时在纵向和横向之间切换。
android.hardware.sensor.ambient_temperature
应用使用设备的环境温度传感器。例如,天气应用可以报告室内或室外温度。
android.hardware.sensor.barometer
应用使用设备的气压计。例如,天气应用可能报告气压。
android.hardware.sensor.compass
应用使用设备的磁力计(指南针)。例如,导航应用可能显示用户当前面对的方向。
android.hardware.sensor.gyroscope
应用使用设备的陀螺仪检测旋转和扭转,创建六轴方向系统。通过使用此传感器,应用可以更平滑地检测何时需要在纵向和横向之间切换。
android.hardware.sensor.hifi_sensors
应用使用设备的高保真 (Hi-Fi) 传感器。例如,游戏应用可能检测用户的高精度移动。
android.hardware.sensor.heartrate
应用使用设备的心率监测器。例如,健身应用可能报告用户心率随时间变化的趋势。
android.hardware.sensor.heartrate.ecg
应用使用设备的心电图 (ECG) 心率传感器。例如,健身应用可能报告有关用户心率的更详细信息。
android.hardware.sensor.light
应用使用设备的光传感器。例如,应用可以根据环境光照条件显示两种颜色方案之一。
android.hardware.sensor.proximity
应用使用设备的接近传感器。例如,电话应用在检测到用户将设备靠近身体时可能会关闭设备屏幕。
android.hardware.sensor.relative_humidity
应用使用设备的相对湿度传感器。例如,天气应用可能使用湿度计算并报告当前露点。
android.hardware.sensor.stepcounter
应用使用设备的计步器。例如,健身应用可能报告用户达到每日步数目标所需的步数。
android.hardware.sensor.stepdetector
应用使用设备的步态检测器。例如,健身应用可能使用步距时间来推断用户正在进行的运动类型。

屏幕硬件功能

android.hardware.screen.landscape
android.hardware.screen.portrait

应用要求设备使用纵向或横向。如果您的应用同时支持两种方向,则无需声明任一功能。

例如,如果您的应用需要纵向,请声明以下功能,以便只有始终或由用户选择支持纵向的设备才能运行您的应用

<uses-feature android:name="android.hardware.screen.portrait" />

默认情况下假定两种方向都不是必需的,因此您的应用可以安装在支持一种或两种方向的设备上。但是,如果您的任何活动请求以特定方向运行,使用 android:screenOrientation 属性,则此声明意味着您的应用需要该方向。

例如,如果您使用 "landscape""reverseLandscape""sensorLandscape" 声明 android:screenOrientation,则您的应用仅在支持横向的设备上可用。

作为最佳实践,使用 <uses-feature> 元素声明对此方向的需求。如果您使用 android:screenOrientation 声明了您的 Activity 的方向,但实际上并不需要它,您可以通过使用 <uses-feature> 元素声明方向并包含 android:required="false" 来禁用此要求。

为了向后兼容,任何运行 Android 3.1(API level 12)或更低版本的设备都支持横向和纵向。

电话硬件功能

android.hardware.telephony
应用使用设备的电话功能,例如带有数据通信服务的电话无线电。
android.hardware.telephony.cdma

应用使用码分多址 (CDMA) 电话无线电系统。

通过使用此功能,应用意味着它也使用 android.hardware.telephony 功能,除非使用 android:required="false" 声明了此父功能。

android.hardware.telephony.gsm

应用使用全球移动通信系统 (GSM) 电话无线电系统。

通过使用此功能,应用意味着它也使用 android.hardware.telephony 功能,除非使用 android:required="false" 声明了此父功能。

触摸屏硬件功能

android.hardware.faketouch

应用使用基本的触摸交互事件,例如点按和拖动。

当声明为必需时,此功能表示应用仅在设备具有模拟的“假触摸”触摸屏或实际触摸屏时才兼容。

提供假触摸界面的设备提供了一个用户输入系统,该系统模拟了触摸屏的部分功能。例如,鼠标或遥控器可以驱动屏幕上的光标。

如果您的应用需要基本的点按和点击交互,并且无法仅使用方向键控制器工作,请声明此功能。由于这是最低级别的触摸交互,您也可以在提供更复杂触摸界面的设备上使用声明此功能的应用。

应用默认需要 android.hardware.faketouch 功能。如果您希望您的应用仅限于具有触摸屏的设备,则必须如下所示明确声明需要触摸屏

<uses-feature android:name="android.hardware.touchscreen"
    android:required="true" />

所有未显式要求 android.hardware.touchscreen 的应用(如以下示例所示)也可以在具有 android.hardware.faketouch 的设备上工作。

<uses-feature android:name="android.hardware.touchscreen" android:required="false" />
android.hardware.faketouch.multitouch.distinct

应用跟踪假触摸界面上的两个或多个不同的“手指”。这是 android.hardware.faketouch 功能的超集。当声明为必需时,此功能表示应用仅在设备模拟了两个或多个手指的独立跟踪或具有实际触摸屏时才兼容。

与由 android.hardware.touchscreen.multitouch.distinct 定义的独立多点触控不同,支持假触摸界面的独立多点触控输入设备不支持所有双指手势,因为输入被转换为屏幕上的光标移动。也就是说,在此类设备上的单指手势会移动光标,双指滑动会触发单指触摸事件,而其他双指手势会触发相应的双指触摸事件。

提供用于光标移动的双指触控板的设备可以支持此功能。

android.hardware.faketouch.multitouch.jazzhand

应用跟踪假触摸界面上的五个或更多不同的“手指”。这是 android.hardware.faketouch 功能的超集。当声明为必需时,此功能表示应用仅在设备模拟了五个或更多手指的独立跟踪或具有实际触摸屏时才兼容。

与由 android.hardware.touchscreen.multitouch.jazzhand 定义的独立多点触控不同,支持假触摸界面的爵士手多点触控输入设备不支持所有五指手势,因为输入被转换为屏幕上的光标移动。也就是说,在此类设备上的单指手势会移动光标,多指手势会触发单指触摸事件,而其他多指手势会触发相应的多指触摸事件。

提供用于光标移动的五指触控板的设备可以支持此功能。

android.hardware.touchscreen

应用使用设备的触摸屏功能进行比基本触摸事件更具交互性的手势,例如快速滑动。这是 android.hardware.faketouch 功能的超集。

默认情况下,所有应用都需要此功能,因此无法在仅提供模拟“假触摸”界面的设备上使用。您可以通过明确声明不需要触摸屏(使用 android.hardware.touchscreen 并将 android:required 设置为 "false"),使您的应用在提供假触摸界面的设备上,甚至在仅提供方向键控制器的设备上可用。如果您的应用使用但并非必需真实触摸屏界面,请添加此声明。所有未明确要求 android.hardware.touchscreen 的应用也可以在具有 android.hardware.faketouch 的设备上工作。

如果您的应用实际上需要触摸界面,例如执行更高级的触摸手势(如快速滑动),则无需声明任何触摸界面功能,因为它们默认是必需的。但是,最好是显式声明您的应用使用的所有功能。

如果您需要更复杂的触摸交互,例如多指手势,请声明您的应用使用高级触摸屏功能。

android.hardware.touchscreen.multitouch

应用使用设备的基本双点多点触控功能,例如用于捏合手势,但应用无需独立跟踪触控。这是 android.hardware.touchscreen 功能的超集。

通过使用此功能,应用意味着它也使用 android.hardware.touchscreen 功能,除非使用 android:required="false" 声明了此父功能。

android.hardware.touchscreen.multitouch.distinct

应用使用设备的高级多点触控功能,用于独立跟踪两个或多个点。此功能是 android.hardware.touchscreen.multitouch 功能的超集。

通过使用此功能,应用意味着它也使用 android.hardware.touchscreen.multitouch 功能,除非使用 android:required="false" 声明了此父功能。

android.hardware.touchscreen.multitouch.jazzhand

应用使用设备的高级多点触控功能,用于独立跟踪五个或更多点。此功能是 android.hardware.touchscreen.multitouch 功能的超集。

通过使用此功能,应用意味着它也使用 android.hardware.touchscreen.multitouch 功能,除非使用 android:required="false" 声明了此父功能。

USB 硬件功能

android.hardware.usb.accessory
应用作为 USB 设备运行并连接到 USB 主机。
android.hardware.usb.host
应用使用连接到设备的 USB 配件。设备充当 USB 主机。

Vulkan 硬件功能

android.hardware.vulkan.compute
应用使用 Vulkan 计算功能。此功能表明应用需要硬件加速的 Vulkan 实现。功能版本指示应用在 Vulkan 1.0 要求之外还需要哪个级别的可选计算功能。例如,如果您的应用需要 Vulkan 计算级别 0 的支持,请声明以下功能
<uses-feature
    android:name="android.hardware.vulkan.compute"
    android:version="0"
    android:required="true" />
有关功能版本的更多详细信息,请参阅 FEATURE_VULKAN_HARDWARE_COMPUTE
android.hardware.vulkan.level
应用使用 Vulkan 级别功能。此功能表明应用需要硬件加速的 Vulkan 实现。功能版本指示应用需要哪个级别的可选硬件功能。例如,如果您的应用需要 Vulkan 硬件级别 0 的支持,请声明以下功能
<uses-feature
    android:name="android.hardware.vulkan.level"
    android:version="0"
    android:required="true" />
有关功能版本的更多信息,请参阅 FEATURE_VULKAN_HARDWARE_LEVEL
android.hardware.vulkan.version
应用使用 Vulkan。此功能表明应用需要硬件加速的 Vulkan 实现。功能版本指示应用所需的 Vulkan API 支持的最低版本。例如,如果您的应用需要 Vulkan 1.0 支持,请声明以下功能
<uses-feature
    android:name="android.hardware.vulkan.version"
    android:version="0x400003"
    android:required="true" />
有关功能版本的更多详细信息,请参阅 FEATURE_VULKAN_HARDWARE_VERSION

Wi-Fi 硬件功能

android.hardware.wifi
应用使用设备的 802.11 网络(Wi-Fi)功能。
android.hardware.wifi.direct
应用使用设备的 Wi-Fi Direct 网络功能。

软件功能

本节介绍最新平台版本支持的软件功能。要表明您的应用使用或需要某个软件功能,请在 android:name 属性中声明对应的值,以 "android.software" 开头。每次声明一个软件功能时,使用单独的 <uses-feature> 元素。

通信软件功能

android.software.sip
应用使用会话发起协议 (SIP) 服务。通过使用 SIP,应用可以支持互联网电话操作,例如视频会议和即时消息。
android.software.sip.voip

应用使用基于 SIP 的语音通过互联网协议 (VoIP) 服务。通过使用 VoIP,应用可以支持实时互联网电话操作,例如双向视频会议。

通过使用此功能,应用意味着它也使用 android.software.sip 功能,除非使用 android:required="false" 声明了此父功能。

android.software.webview
应用显示来自互联网的内容。

自定义输入软件功能

android.software.input_methods
应用使用一种新的输入法,开发者在 InputMethodService 中定义了该输入法。

设备管理软件功能

android.software.backup
应用包含处理备份和恢复操作的逻辑。
android.software.device_admin
应用使用设备管理员强制执行设备政策。
android.software.managed_users
应用支持辅助用户和托管配置文件。
android.software.securely_removes_users
应用可以永久删除用户及其关联数据。
android.software.verified_boot
应用包含用于处理设备验证启动功能结果的逻辑,该功能用于检测设备配置在重启操作期间是否发生变化。

媒体软件功能

android.software.midi
应用使用乐器数字接口 (MIDI) 协议连接到乐器或输出声音。
android.software.print
应用包含用于打印设备上显示的文档的命令。
android.software.leanback
应用设计用于在 Android TV 设备上运行。
android.software.live_tv
应用流式传输直播电视节目。

屏幕界面软件功能

android.software.app_widgets
应用使用或提供应用微件,并且仅适用于包含主屏幕或类似位置(用户可以在其中嵌入应用微件)的设备。
android.software.home_screen
应用作为设备主屏幕的替代品。
android.software.live_wallpaper
应用使用或提供包含动画的壁纸。

暗示功能要求的权限

某些硬件和软件功能常量在相应的 API 之后才提供给应用。因此,一些应用可能在能够使用 <uses-feature> 系统声明它们需要该 API 之前就已经使用了该 API。

为了防止这些应用意外地可用,Google Play 假定某些硬件相关权限默认表示需要底层硬件功能。例如,使用蓝牙的应用必须在 <uses-permission> 元素中请求 BLUETOOTH 权限。

对于旧版应用,Google Play 假定权限声明意味着应用需要底层 android.hardware.bluetooth 功能,并基于该功能设置过滤。表 2 列出了暗示功能要求(等同于在 <uses-feature> 元素中声明的要求)的权限。

<uses-feature> 声明,包括任何已声明的 android:required 属性,始终优先于表 2 中权限所暗示的功能。对于这些权限中的任何一个,您可以通过在 <uses-feature> 元素中明确声明该功能并将其 required 属性设置为 false 来禁用基于暗示功能的过滤。

例如,要禁用基于 CAMERA 权限的过滤,请在清单文件中添加以下 <uses-feature> 声明

<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />

注意:如果您的应用的目标平台是 Android 5.0(API level 21)或更高版本,并且使用 ACCESS_COARSE_LOCATIONACCESS_FINE_LOCATION 权限分别从网络或 GPS 接收位置更新,则您还必须明确声明您的应用使用了 android.hardware.location.networkandroid.hardware.location.gps 硬件功能。

表 2. 暗示设备硬件使用的设备权限。

类别 权限 隐含功能要求
蓝牙 BLUETOOTH android.hardware.bluetooth

有关详细信息,请参阅“蓝牙功能的特殊处理”

BLUETOOTH_ADMIN android.hardware.bluetooth
相机 CAMERA android.hardware.camera
android.hardware.camera.autofocus
位置 ACCESS_MOCK_LOCATION android.hardware.location
ACCESS_LOCATION_EXTRA_COMMANDS android.hardware.location
INSTALL_LOCATION_PROVIDER android.hardware.location
ACCESS_COARSE_LOCATION

android.hardware.location

android.hardware.location.network (仅当目标 API level 为 20 或更低时。)

ACCESS_FINE_LOCATION

android.hardware.location

android.hardware.location.gps (仅当目标 API level 为 20 或更低时。)

麦克风 RECORD_AUDIO android.hardware.microphone
电话 CALL_PHONE android.hardware.telephony
CALL_PRIVILEGED android.hardware.telephony
MODIFY_PHONE_STATE android.hardware.telephony
PROCESS_OUTGOING_CALLS android.hardware.telephony
READ_SMS android.hardware.telephony
RECEIVE_SMS android.hardware.telephony
RECEIVE_MMS android.hardware.telephony
RECEIVE_WAP_PUSH android.hardware.telephony
SEND_SMS android.hardware.telephony
WRITE_APN_SETTINGS android.hardware.telephony
WRITE_SMS android.hardware.telephony
Wi-Fi ACCESS_WIFI_STATE android.hardware.wifi
CHANGE_WIFI_STATE android.hardware.wifi
CHANGE_WIFI_MULTICAST_STATE android.hardware.wifi