<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 级别 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 级别 4
另请参阅

Google Play 和基于功能的过滤

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

为了确定应用程序与给定用户的设备的功能兼容性,Google Play 会比较

  • 应用程序所需的特性,如应用程序清单中 <uses-feature> 元素中声明的那样。
  • 设备上可用的特性(在硬件或软件中),如使用只读系统属性报告的那样。

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

当用户启动 Google Play 时,应用程序会通过调用 getSystemAvailableFeatures() 查询包管理器以获取设备上可用特性的列表。然后,Store 应用程序在为用户建立会话时将特性列表传递给 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 级别 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 及更低版本上运行,则 API 中不提供 android:required 属性,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 会假定该应用程序需要后置(面向世界)摄像头,即使该应用程序未为 android.hardware.camera 声明 <uses-feature> 元素。因此,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> 元素中指定的那样。

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

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

如果 minSdkVersion 为... 并且 targetSdkVersion 结果
<=4,或未声明 <uses-sdk> <=4 Google Play不会根据设备报告的 android.hardware.bluetooth 特性支持情况从任何设备中过滤应用程序。
<=4 >=5 >=5
>=5 >=5

Google Play 会从不支持 android.hardware.bluetooth 特性的任何设备(包括较旧版本)中过滤应用程序。

以下示例说明了基于 Google Play 如何处理蓝牙特性的不同过滤效果。
在第一个示例中,设计为在较旧 API 级别上运行的应用程序声明了蓝牙权限,但在 <uses-feature> 元素中未声明蓝牙特性。
<manifest ...>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-sdk android:minSdkVersion="3" />
    ...
</manifest>
结果:Google Play 不会从任何设备中过滤应用程序。
在第二个示例中,同一个应用程序还声明了目标 API 级别为“5”。
<manifest ...>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="5" />
    ...
</manifest>
结果:Google Play 现在假定该特性是必需的,并从所有未报告蓝牙支持的设备(包括运行较旧平台版本的设备)中过滤应用程序。
这里,同一个应用程序现在专门声明了蓝牙特性。
<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" 属性。
<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>

结果:Google Play 禁用了所有设备基于蓝牙特性支持的过滤。

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

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

  1. 构建并导出您的应用程序作为未签名的 APK。如果您在 Android Studio 中开发,请按如下所示使用 Gradle 构建您的应用程序
    1. 打开项目并选择运行 > 编辑配置
    2. 选择运行/调试配置窗口左上角附近的加号。
    3. 选择Gradle。
    4. 名称中输入“Unsigned APK”。
    5. Gradle 项目部分选择您的模块。
    6. 任务中输入“assemble”。
    7. 选择确定以完成新配置。
    8. 确保在工具栏中选择了Unsigned APK 运行配置,然后选择运行 > 运行“Unsigned APK”
    您可以在 <ProjectName>/app/build/outputs/apk/ 目录中找到您的未签名 APK。
  2. 找到 aapt2 工具(如果它尚未在您的 PATH 中)。如果您使用的是 SDK Tools r8 或更高版本,则可以在 <SDK>/build-tools/<tools version number> 目录中找到 aapt2

    注意:您必须使用为最新可用的构建工具组件提供的 aapt2 版本。如果您没有最新的构建工具组件,请使用 Android SDK 管理器 下载它。

  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.hardware.camera 声明为 android:required="false"

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.hardware.camera 声明为 android:required="false"

警告:如果您的应用使用 android.hardware.camera.front 但没有显式声明 android.hardware.camera 并将其设置为 android.required="false",则 Google Play 会过滤掉没有后置摄像头的设备(如 Chromebook)。如果您的应用支持仅具有前置摄像头的设备,请将 android.hardware.camera 声明为 android.required="false" 以防止不必要的过滤。

android.hardware.camera.external

该应用与用户连接到设备的外部摄像头通信。此功能不能保证您的应用可以使用外部摄像头。

CAMERA 权限暗示您的应用也使用 android.hardware.camera。后置摄像头是必需的功能,除非 android.hardware.camera 声明为 android:required="false"

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.gainsandroid.colorCorrection.modeTRANSFORM_MATRIX

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。用户可以使用硬按钮、触摸、旋转控制器和鼠标式界面与应用进行交互。车辆的屏幕通常出现在车辆的中控台或仪表盘中。这些屏幕通常尺寸和分辨率有限。

注意:由于用户在使用此类应用 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 扩展包

传感器硬件功能

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为您的活动声明方向但实际上并不需要它,则可以通过使用<uses-feature>元素声明方向并包含android:required="false"来禁用该要求。

为了向后兼容,任何运行 Android 3.1(API 级别 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

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

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

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

如果您的应用程序需要基本的点击交互并且仅使用 D-pad 控制器不起作用,请声明此功能。由于这是最低级别的触摸交互,因此您也可以在提供更复杂触摸界面的设备上使用声明此功能的应用程序。

应用程序默认情况下需要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:required="false"显式声明触摸屏不是必需的,使您的应用程序可在提供伪触摸界面的设备上使用,甚至可在仅提供 D-pad 控制器的设备上使用。如果您的应用程序使用但不需要真实的触摸屏界面,请添加此声明。所有未显式要求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 属性中声明相应的 value,以 "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 级别 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 级别为 20 或更低时)。

ACCESS_FINE_LOCATION

android.hardware.location

android.hardware.location.gps(仅当目标 API 级别为 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