语法:
包含于:
说明:
声明应用程序使用的单个硬件或软件功能。
应用程序声明的可用功能集对应于Android PackageManager提供的功能常量集,这些功能常量列在本文档底部的“功能参考”部分中。
您必须在单独的
Google Play过滤
Google Play使用应用清单中声明的
元素,从不符合其硬件和软件功能要求的设备中过滤您的应用。 通过指定应用程序所需的功能,您可以启用Google Play,仅将应用程序呈现给设备符合应用程序功能要求的用户,而不是将其呈现给所有用户。
有关Google Play如何使用功能作为过滤基础的重要信息,请参阅下面的Google Play和基于功能的过滤。
通常,您应始终确保为应用程序所需的所有功能声明
声明的
对于某些功能,可能存在一个特定属性,允许您定义功能的版本,例如使用的Open GL版本(使用glEsVersion声明)。使用name属性声明设备(例如摄像机)存在或不存在的其他功能。
虽然
注意:声明功能时,请记住您还必须根据需要请求权限。例如,在应用程序可以访问摄像头API之前,您仍必须请求CAMERA权限。请求权限授予您的应用程序访问相应硬件和软件的权限,同时声明应用程序使用的功能可确保正确的设备兼容性。
属性:
android:name
指定应用程序使用的单个硬件或软件功能,作为描述符字符串。 “硬件功能和软件功能”部分中列出了有效的属性值。这些属性值区分大小写。
android:required
布尔值,指示应用程序是否需要android:name中指定的功能。
android:默认值如果未声明则为“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
参阅:
PackageManager
FeatureInfo
ConfigurationInfo
Google Play会过滤用户可见的应用程序,以便用户只能查看和下载与其设备兼容的应用程序。过滤应用程序的方法之一是功能兼容性。
要确定应用程序与给定用户设备的功能兼容性,Google Play会比较:
为确保准确比较功能,Android Package Manager提供了一组共享的功能常量,应用程序和设备都使用这些功能常量来声明功能要求和支持。可用的功能常量列在本文档底部的“功能参考”部分以及PackageManager的类文档中。
当用户启动Google Play时,应用程序会通过调用getSystemAvailableFeatures()向程序包管理器查询设备上可用功能的列表。然后,Store应用程序在为用户建立会话时将功能列表传递到Google Play。
每次将应用程序上传到Google Play开发者控制台时,Google Play都会扫描应用程序的清单文件。它查找
当用户使用Google Play应用程序搜索或浏览应用程序时,该服务会将每个应用程序所需的功能与用户设备上可用的功能进行比较。如果设备上存在所有应用程序所需的功能,Google Play允许用户查看该应用程序并可能下载该应用程序。如果设备不支持任何所需功能,Google Play会过滤应用程序,以使用户看不到该应用程序且无法下载。
由于您在
基于显式声明的功能进行过滤
显式声明的功能是应用程序在
Google Play以这种方式处理显式声明的功能:
如果明确声明了某个功能,但没有安装了android:required属性,则Google Play会假定该功能是必需的,并对其进行过滤。
通常,如果您的应用程序设计为在Android 1.6及更早版本上运行,则API中不提供android:required属性,Google Play假定需要任何和所有
注意:通过明确声明功能并包含android:required =“false”属性,您可以有效禁用Google Play上针对指定功能的所有过滤。
隐式功能是应用程序为了正常运行而需要的功能,但未在清单文件的
应用程序可能需要一个功能但不能声明它,因为:
考虑到上述情况,Google Play会尝试通过检查清单文件中声明的其他元素(特别是
如果应用程序请求与硬件相关的权限,则Google Play会假定应用程序使用基础硬件功能,因此需要这些功能,即使可能没有与
例如,如果某个应用程序请求CAMERA权限但未为android.hardware.camera声明
如果您不希望Google Play根据特定的隐含功能进行过滤,则可以禁用该行为。为此,请在
重要的是要了解您在
在确定蓝牙过滤时,Google Play应用的规则与上述规则略有不同。
如果应用程序在
如下表所示,仅当应用程序将其最低或目标平台声明为Android 2.0(API级别5)或更高版本时,Google Play才会启用对蓝牙功能的过滤。但请注意,当应用程序在
表1. Google Play如何确定请求蓝牙权限但未在
如果minSdkVersion是... | 或者targetSdkVersion是 | Result |
<= 4(或未使用-sdk) | <=4 | Google Play不会根据他们报告的对android.hardware.bluetooth功能的支持从任何设备中过滤应用程序。 |
<=4 | >=5 | Google Play会从任何不支持android.hardware.bluetooth功能的设备(包括旧版本)中过滤应用程序。 |
>=5 | >=5 |
以下示例根据Google Play处理蓝牙功能的方式说明了不同的过滤效果。
在第一个示例中,设计为在较旧的API级别上运行的应用程序声明了蓝牙权限,但未在
结果:Google Play不会从任何设备过滤应用程序。
...
在下面的第二个示例中,相同的应用程序还声明目标API级别为“5”。
结果:Google Play现在假定该功能是必需的,并将从所有未报告蓝牙支持的设备(包括运行旧版平台的设备)中过滤应用程序。
...
现在,相同的应用程序专门声明了蓝牙功能。
结果:与前一个示例相同(应用过滤)。
...
最后,在下面的例子中,同一个应用程序添加了一个android:required =“false”属性。
结果:Google Play会针对所有设备禁用基于蓝牙功能支持的过滤功能。
...
您可以使用Android SDK中包含的aapt工具来确定Google Play如何根据其声明的功能和权限过滤您的应用。为此,请使用dump badging命令运行aapt。这会导致aapt解析您的应用程序的清单,并应用与Google Play使用的相同规则来确定您的应用程序所需的功能。
要使用该工具,请按照下列步骤操作:
1.首先,将您的应用程序构建并导出为未签名的.apk。如果您在Android Studio中进行开发,请使用Gradle构建应用程序:
a.打开项目,然后选择“运行”>“编辑配置”。
b.选择“运行/调试配置”窗口左上角附近的加号。
c.选择Gradle。
d.在名称中输入未签名的APK。
e.从Gradle项目部分选择您的模块。
f.在任务中输入汇编。
g.选择“确定”以完成新配置。
h.确保在工具栏中选择了未签名的APK运行配置,然后选择运行>运行'未签名的APK'。
2.接下来,找到aapt工具(如果它尚未在您的PATH中)。如果您使用的是SDK Tools r8或更高版本,则可以在
注意:您必须使用为最新的Platform-Tools组件提供的aapt版本。如果您没有最新的Platform-Tools组件,请使用Android SDK Manager下载它。
3.使用以下语法运行aapt:
$ aapt dump badging
以下是第二个蓝牙示例的命令输出示例,如上所示:
$ ./aapt 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”开头)。每次声明硬件功能时,请使用单独的
音频硬件功能
android.hardware.audio.low_latency
该应用程序使用该设备的低延迟音频管道,可减少处理声音输入或输出时的延迟和延迟。
android.hardware.audio.output
该应用程序使用设备的扬声器,音频插孔,蓝牙流功能或类似机制传输声音。
android.hardware.audio.pro
该应用程序使用该设备的高端音频功能和性能。
android.hardware.microphone
该应用程序使用设备的麦克风录制音频。
蓝牙硬件功能
android.hardware.bluetooth
该应用程序使用设备的蓝牙功能,通常用于与其他蓝牙设备通信。
android.hardware.bluetooth_le
该应用程序使用该设备的蓝牙低功耗无线电功能。
相机硬件功能
android.hardware.camera
该应用程序使用该设备的后置摄像头。只有前置摄像头的设备不会列出此功能,因此如果您的应用可以与任何摄像头通信,请使用android.hardware.camera.any功能,无论摄像头朝哪个方向。
android.hardware.camera.any
该应用程序使用设备的一个摄像头,或用户连接到设备的外部摄像头。如果您的应用不需要相机作为背面相机,请使用此值而不是android.hardware.camera。
android.hardware.camera.autofocus
该应用程序使用设备相机支持的自动对焦功能。
通过使用此功能,应用程序暗示它还使用android.hardware.camera功能,除非使用android:required =“false”声明此父功能。
android.hardware.camera.capability.manual_post_processing
该应用程序使用设备相机支持的MANUAL_POST_PROCESSING功能。
此功能允许您的应用覆盖相机的自动白平衡功能。使用android.colorCorrection.transform,android.colorCorrection.gains和TRANSFORM_MATRIX的android.colorCorrection.mode。
android.hardware.camera.capability.manual_sensor
该应用程序使用设备相机支持的MANUAL_SENSOR功能。
此功能意味着支持自动曝光锁定(android.control.aeLock),它允许相机的曝光时间和灵敏度保持固定在特定值
android.hardware.camera.capability.raw
该应用程序使用设备相机支持的RAW功能。
此功能意味着设备可以保存DNG(原始)文件,并且设备的摄像头提供应用程序直接处理这些原始图像所需的DNG相关元数据。
android.hardware.camera.external
该应用程序与用户连接到设备的外部摄像头通信。但是,此功能不保证外部相机可供您的应用使用。
android.hardware.camera.flash
该应用程序使用设备相机支持的闪光灯功能。
通过使用此功能,应用程序暗示它还使用android.hardware.camera功能,除非使用android:required =“false”声明此父功能。
android.hardware.camera.front
该应用程序使用该设备的前置摄像头。
通过使用此功能,应用程序暗示它还使用android.hardware.camera功能,除非使用android:required =“false”声明此父功能。
android.hardware.camera.level.full
该应用程序使用至少一个设备的摄像头提供的全级图像捕获支持。具有全面支持的摄像机提供突发捕获功能,每帧控制和手动后处理控制。
android.hardware.type.automotive
该应用程序旨在在车辆内的一组屏幕上显示其UI。用户使用硬按钮,触摸,旋转控制器和类似鼠标的界面与应用程序交互。车辆的屏幕通常出现在车辆的中控台或仪表组中。这些屏幕通常具有有限的尺寸和分辨率。
注意:请务必记住,由于用户在使用此类应用UI时正在驾驶,因此应用必须最大限度地减少驾驶员分心。
android.hardware.type.television
(已弃用;请改用android.software.leanback。)
该应用程序旨在在电视上显示其UI。此功能将“电视”定义为典型的客厅电视体验:显示在大屏幕上,用户坐在远处,主要输入形式类似于d-pad,通常不使用鼠标,指针或触摸设备。
android.hardware.type.watch
该应用程序旨在在手表上显示其UI。手表佩戴在手指上,例如手腕上。用户在与设备交互时非常靠近设备。
指纹硬件功能
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
该应用程序使用该设备的光传感器。例如,app可以基于环境照明条件显示两种不同颜色方案中的一种。
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
该应用要求设备使用纵向或横向。如果您的应用支持两种方向,则无需声明任何一项功能。
例如,如果您的应用需要纵向,则应声明以下功能,以便只有支持纵向(始终或由用户选择)的设备才能运行您的应用:
默认情况下,假设两个方向都不是必需的,因此您的应用程序可能安装在支持一个或两个方向的设备上。但是,如果您的任何活动要求它们以特定方向运行,请使用android:screenOrientation属性,则此声明暗示您的应用需要该方向。例如,如果您使用“landscape”,“reverseLandscape”或“sensorLandscape”声明android:screenOrientation,那么您的应用程序将仅在支持横向的设备上可用。
作为最佳实践,您仍应使用
为了向后兼容,运行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.touchscreen功能。如果您希望应用程序可用于提供虚假触摸界面的设备,则还必须明确声明不需要触摸屏,如下所示:
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.touchscreen与android明确声明不需要触摸屏:需要= “假”。如果您的应用使用 - 但不需要 - 真正的触摸屏界面,您应该添加此声明。
如果您的应用程序实际上需要触摸界面(以执行更高级的触摸手势,例如fling),那么您不需要声明任何触摸界面功能,因为默认情况下它们是必需的。但是,如果您明确声明应用使用的所有功能,则最好。
如果您需要更复杂的触摸交互,例如多指手势,则应声明您的应用使用高级触摸屏功能。
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主机。
Wi-Fi硬件功能
android.hardware.wifi
该应用程序使用设备上的802.11网络(Wi-Fi)功能。
android.hardware.wifi.direct
该应用程序使用设备上的Wi-Fi Direct网络功能。
本节介绍最新平台版本支持的软件功能。要指示您的应用程序使用或需要软件功能,请在android:name属性中声明相应的值(以“android.software”开头)。每次声明软件功能时,请使用单独的
通讯软件功能
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
该应用程序提供了一个用于在大屏幕(如电视)上观看的UI。
android.software.live_tv
该应用程序流式传输电视节目。
屏幕界面软件功能
android.software.app_widgets
该应用程序使用或提供App Widgets,并且只应安装在包含主屏幕或用户可以嵌入App Widgets的类似位置的设备上。
android.software.home_screen
该应用程序可以替代设备的主屏幕。
android.software.live_wallpaper
该应用程序使用或提供包含动画的壁纸。
在相应的API之后,一些硬件和软件特征常量可供应用程序使用;例如,android.hardware.bluetooth功能是在Android 2.2(API级别8)中添加的,但它引用的蓝牙API是在Android 2.0(API级别5)中添加的。因此,一些应用程序能够使用API,然后才能使用
为防止这些应用无意中提供,Google Play会假定某些与硬件相关的权限表明默认情况下需要基础硬件功能。例如,使用蓝牙的应用程序必须在
请注意,
表2.暗示设备硬件使用的设备权限。