<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>声明,作为处理或与应用程序交互的一部分。因此,声明应用程序使用​​的所有功能非常重要。

对于某些功能,可能存在一个特定的属性允许您定义功能的版本,例如使用的OpenGL版本(使用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()来查询包管理器以获取设备上可用功能的列表。然后,商店应用程序在为用户建立会话时将功能列表传递给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 Google Play 会从不支持 android.hardware.bluetooth 功能的任何设备(包括旧版本)中过滤应用。
>=5 >=5

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

在第一个示例中,一个设计用于在较旧的 API 级别上运行的应用声明了蓝牙权限,但在 <uses-feature> 元素中没有声明蓝牙功能。
结果:Google Play 不会从任何设备中过滤应用。
<manifest ...>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-sdk android:minSdkVersion="3" />
    ...
</manifest>
在第二个示例中,同一个应用还声明了“5”的目标 API 级别。
结果: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. 打开项目并选择运行 > 编辑配置
    2. 选择运行/调试配置窗口左上角附近的加号。
    3. 选择Gradle。
    4. 名称中输入“未签名的 APK”。
    5. Gradle 项目部分选择您的模块。
    6. 任务中输入“assemble”。
    7. 选择确定以完成新配置。
    8. 确保在工具栏中选择了未签名的 APK运行配置,然后选择运行 > 运行“未签名的 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.required="false" 显式声明 android.hardware.camera,则 Google Play 会过滤没有后置摄像头的设备(如 Chromebook)。如果您的应用支持仅具有前置摄像头的设备,请使用 android.required="false" 声明 android.hardware.camera 以防止不必要的过滤。

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功能的超集。

默认情况下,所有应用都需要此功能,因此无法在仅提供模拟“伪触摸”界面的设备上使用。您可以使您的应用在提供伪触摸界面的设备上可用,甚至在仅提供 D-pad 控制器的设备上可用,方法是使用android.hardware.touchscreenandroid: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之后,一些硬件和软件特性常量才可供应用使用。因此,一些应用可能会在使用API之前使用该API,然后再使用<uses-feature>系统声明它们需要该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