1page.title=<uses-feature> 2page.tags=filtering,features,google play filters,permissions 3@jd:body 4 5<div id="qv-wrapper"> 6<div id="qv"> 7 8 9<h2>In this document</h2> 10<ol> 11 <li><a href="#market-feature-filtering">Google Play and Feature-Based Filtering</a> 12 <ol> 13 <li><a href="#declared">Filtering based on explicitly declared features</a></li> 14 <li><a href="#implicit">Filtering based on implicit features</a></li> 15 <li><a href="#bt-permission-handling">Special handling for Bluetooth feature</a></li> 16 <li><a href="#testing">Testing the features required by your application</a></li> 17 </ol> 18 </li> 19 <li><a href="#features-reference">Features Reference</a> 20 <ol> 21 <li><a href="#hw-features">Hardware features</a></li> 22 <li><a href="#sw-features">Software features</a></li> 23 <li><a href="#permissions">Permissions that Imply Feature Requirements</a></li> 24 </ol> 25 </li> 26</ol> 27</div> 28</div> 29 30 <div class="sidebox-wrapper"> 31 <div class="sidebox"> 32 <img src="{@docRoot}assets/images/icon_play.png" style="float:left;margin:0;padding:0;"> 33 <p style="color:#669999;padding-top:1em;">Google Play Filtering</p> 34 <p style="padding-top:1em;">Google Play uses the <code><uses-feature></code> 35 elements declared in your app manifest to filter your app from devices 36 that do not meet its hardware and software feature requirements. </p> 37 38<p style="margin-top:1em;">By specifying the features that your application requires, 39you enable Google Play to present your application only to users whose 40devices meet the application's feature requirements, rather than presenting it 41to all users. </p> 42 43<p>For important information about how 44Google Play uses features as the basis for filtering, please read <a 45href="#market-feature-filtering">Google Play and Feature-Based Filtering</a>, 46below.</p> 47</div> 48</div> 49 50<dl class="xml"> 51 52<dt>syntax:</dt> 53<dd> 54<pre class="stx"><uses-feature 55 android:<a href="#name">name</a>="<em>string</em>" 56 android:<a href="#required">required</a>=["true" | "false"] 57 android:<a href="#glEsVersion">glEsVersion</a>="<em>integer</em>" /></pre> 58</dd> 59 60<dt>contained in:</dt> 61<dd><code><a 62href="{@docRoot}guide/topics/manifest/manifest-element.html"><manifest></a></code></dd> 63 64<dt>description:</dt> 65<dd itemprop="description">Declares a single hardware or software feature that is used by the 66application. 67 68<p>The purpose of a <code><uses-feature></code> declaration is to inform 69any external entity of the set of hardware and software features on which your 70application depends. The element offers a <code>required</code> attribute that 71lets you specify whether your application requires and cannot function without 72the declared feature, or whether it prefers to have the feature but can function 73without it. Because feature support can vary across Android devices, the 74<code><uses-feature></code> element serves an important role in letting an 75application describe the device-variable features that it uses.</p> 76 77<p>The set of available features that your application declares corresponds to 78the set of feature constants made available by the Android {@link 79android.content.pm.PackageManager}, which are listed for 80convenience in the <a href="#features-reference">Features Reference</a> sections 81at the bottom of this document. 82 83<p>You must specify each feature in a separate <code><uses-feature></code> 84element, so if your application requires multiple features, it would declare 85multiple <code><uses-feature></code> elements. For example, an application 86that requires both Bluetooth and camera features in the device would declare 87these two elements:</p> 88 89<pre> 90<uses-feature android:name="android.hardware.bluetooth" /> 91<uses-feature android:name="android.hardware.camera" /> 92</pre> 93 94<p>In general, you should always make sure to declare 95<code><uses-feature></code> elements for all of the features that your 96application requires.</p> 97 98<p>Declared <code><uses-feature></code> elements are informational only, meaning 99that the Android system itself does not check for matching feature support on 100the device before installing an application. However, other services 101(such as Google Play) or applications may check your application's 102<code><uses-feature></code> declarations as part of handling or interacting 103with your application. For this reason, it's very important that you declare all of 104the features (from the list below) that your application uses. </p> 105 106<p>For some features, there may exist a specific attribute that allows you to define 107a version of the feature, such as the version of Open GL used (declared with 108<a href="#glEsVersion"><code>glEsVersion</code></a>). Other features that either do or do not 109exist for a device, such as a camera, are declared using the 110<a href="#name"><code>name</code></a> attribute.</p> 111 112 113<p>Although the <code><uses-feature></code> element is only activated for 114devices running API Level 4 or higher, it is recommended to include these 115elements for all applications, even if the <a href="uses-sdk-element.html#min"><code>minSdkVersion</code></a> 116is "3" or lower. Devices running older versions of the platform will simply 117ignore the element.</p> 118 119<p class="note"><strong>Note:</strong> When declaring a feature, remember 120that you must also request permissions as appropriate. For example, you must 121still request the {@link android.Manifest.permission#CAMERA} 122permission before your application can access the camera API. Requesting the 123permission grants your application access to the appropriate hardware and 124software, while declaring the features used by your application ensures proper 125device compatibility.</p> 126 127</dd> 128 129 130<dt>attributes:</dt> 131 132<dd> 133<dl class="attr"> 134 <dt> 135 <a name="name"></a><code>android:name</code> 136 </dt> 137 138 <dd> 139 Specifies a single hardware or software feature used by the application, as 140 a descriptor string. Valid attribute values are listed in the <a href= 141 "#hw-features">Hardware features</a> and <a href="#sw-features">Software 142 features</a> sections. These attribute values are case-sensitive. 143 </dd> 144 145 <dt> 146 <a name="required"></a><code>android:required</code> 147 </dt> 148 <!-- added in api level 5 --> 149 150 <dd> 151 Boolean value that indicates whether the application requires the feature 152 specified in <code>android:name</code>. 153 <ul> 154 <li>When you declare <code>android:required="true"</code> for a feature, 155 you are specifying that the application <em>cannot function, or is not 156 designed to function</em>, when the specified feature is not present on the 157 device. </li> 158 159 <li>When you declare <code>android:required="false"</code> for a feature, it 160 means that the application <em>prefers to use the feature</em> if present on 161 the device, but that it <em>is designed to function without the specified 162 feature</em>, if necessary. </li> 163 164 </ul> 165 166 <p>The default value for <code>android:required</code> if not declared is 167 <code>"true"</code>.</p> 168 </dd> 169 170 <dt><a name="glEsVersion"></a><code>android:glEsVersion</code></dt> 171 <dd>The OpenGL ES version required by the application. The higher 16 bits 172represent the major number and the lower 16 bits represent the minor number. For 173example, to specify OpenGL ES version 2.0, you would set the value as 174"0x00020000", or to specify OpenGL ES 3.2, you would set the value as "0x00030002". 175 176 <p>An application should specify at most one <code>android:glEsVersion</code> 177attribute in its manifest. If it specifies more than one, the 178<code>android:glEsVersion</code> with the numerically highest value is used and 179any other values are ignored.</p> 180 181 <p>If an application does not specify an <code>android:glEsVersion</code> 182attribute, then it is assumed that the application requires only OpenGL ES 1.0, 183which is supported by all Android-powered devices.</p> 184 185 <p>An application can assume that if a platform supports a given OpenGL ES 186version, it also supports all numerically lower OpenGL ES versions. Therefore, 187an application that requires both OpenGL ES 1.0 and OpenGL ES 2.0 must specify 188that it requires OpenGL ES 2.0.</p> 189 190 <p>An application that can work with any of several OpenGL ES versions should 191only specify the numerically lowest version of OpenGL ES that it requires. (It 192can check at run-time whether a higher level of OpenGL ES is available.)</p> 193 194 <p>For more information about using OpenGL ES, including how to check the supported OpenGL ES 195version at runtime, see the <a href="{@docRoot}guide/topics/graphics/opengl.html">OpenGL ES 196API guide</a>.</p> 197 </dd> 198 199</dl> 200</dd> 201 202<!-- ##api level indication## --> 203<dt>introduced in:</dt> 204<dd>API Level 4</dd> 205 206<dt>see also:</dt> 207<dd> 208 <ul> 209 <li>{@link android.content.pm.PackageManager}</li> 210 <li>{@link android.content.pm.FeatureInfo}</li> 211 <li>{@link android.content.pm.ConfigurationInfo}</li> 212 <li><a href="{@docRoot}guide/topics/manifest/uses-permission-element.html"><code><uses-permission></code></a></li> 213 <li><a href="{@docRoot}google/play/filters.html">Filters on Google Play</a></li> 214 </ul> 215</dd> 216 217</dl> 218 219 220<h2 id="market-feature-filtering">Google Play and Feature-Based Filtering</h2> 221 222<p>Google Play filters the applications that are visible to users, so that 223users can see and download only those applications that are compatible with 224their devices. One of the ways it filters applications is by feature 225compatibility.</p> 226 227<p>To determine an application's feature compatibility with a given user's 228device, Google Play compares:</p> 229 230<ul> 231<li>Features required by the application — an application declares features in 232<code><uses-feature></code> elements in its manifest <br/>with...</li> 233<li>Features available on the device, in hardware or software — 234a device reports the features it supports as read-only system properties.</li> 235</ul> 236 237<p>To ensure an accurate comparison of features, the Android Package Manager 238provides a shared set of feature constants that both applications and devices 239use to declare feature requirements and support. The available feature constants 240are listed in the <a href="#features-reference">Features Reference</a> sections at 241the bottom of this document, and in the class documentation for {@link 242android.content.pm.PackageManager}.</p> 243 244<p>When the user launches Google Play, the application queries the 245Package Manager for the list of features available on the device by calling 246{@link android.content.pm.PackageManager#getSystemAvailableFeatures()}. The 247Store application then passes the features list up to Google Play 248when establishing the session for the user.</p> 249 250<p>Each time you upload an application to the Google Play Developer Console, 251Google Play scans the application's manifest file. It looks for 252<code><uses-feature></code> elements and evaluates them in combination 253with other elements, in some cases, such as <code><uses-sdk></code> and 254<code><uses-permission></code> elements. After establishing the 255application's set of required features, it stores that list internally as 256metadata associated with the application <code>.apk</code> and the application 257version. </p> 258 259<p>When a user searches or browses for applications using the Google Play 260application, the service compares the features needed by each application with 261the features available on the user's device. If all of an application's required 262features are present on the device, Google Play allows the user to see the 263application and potentially download it. If any required feature is not 264supported by the device, Google Play filters the application so that it is 265not visible to the user and not available for download. </p> 266 267<p>Because the features you declare in <code><uses-feature></code> 268elements directly affect how Google Play filters your application, it's 269important to understand how Google Play evaluates the application's manifest 270and establishes the set of required features. The sections below provide more 271information. </p> 272 273<h3 id="declared">Filtering based on explicitly declared features</h3> 274 275<p>An explicitly declared feature is one that your application declares in a 276<code><uses-feature></code> element. The feature declaration can include 277an <code>android:required=["true" | "false"]</code> attribute (if you are 278compiling against API level 5 or higher), which lets you specify whether the 279application absolutely requires the feature and cannot function properly without 280it (<code>"true"</code>), or whether the application prefers to use the feature 281if available, but is designed to run without it (<code>"false"</code>).</p> 282 283<p>Google Play handles explicitly declared features in this way: </p> 284 285<ul> 286<li>If a feature is explicitly declared as being required, Google Play adds 287the feature to the list of required features for the application. It then 288filters the application from users on devices that do not provide that feature. 289For example: 290<pre><uses-feature android:name="android.hardware.camera" android:required="true" /></pre></li> 291<li>If a feature is explicitly declared as <em>not</em> being required, Google 292Play <em>does not</em> add the feature to the list of required features. For 293that reason, an explicitly declared non-required feature is never considered when 294filtering the application. Even if the device does not provide the declared 295feature, Google Play will still consider the application compatible with the 296device and will show it to the user, unless other filtering rules apply. For 297example: 298<pre><uses-feature android:name="android.hardware.camera" android:required="false" /></pre></li> 299<li>If a feature is explicitly declared, but without an 300<code>android:required</code> attribute, Google Play assumes that the feature 301is required and sets up filtering on it. </li> 302</ul> 303 304<p>In general, if your application is designed to run on Android 1.6 and earlier 305versions, the <code>android:required</code> attribute is not available in the 306API and Google Play assumes that any and all 307<code><uses-feature></code> declarations are required. </p> 308 309<p class="note"><strong>Note:</strong> By declaring a feature explicitly and 310including an <code>android:required="false"</code> attribute, you can 311effectively disable all filtering on Google Play for the specified feature. 312</p> 313 314 315<h3 id="implicit">Filtering based on implicit features</h3> 316 317<p>An <em>implicit</em> feature is one that an application requires in order to 318function properly, but which is <em>not</em> declared in a 319<code><uses-feature></code> element in the manifest file. Strictly 320speaking, every application should <em>always</em> declare all features that it 321uses or requires, so the absence of a declaration for a feature used by an 322application should be considered an error. However, as a safeguard for users and 323developers, Google Play looks for implicit features in each application and 324sets up filters for those features, just as it would do for an explicitly 325declared feature. </p> 326 327<p>An application might require a feature but not declare it because: </p> 328 329<ul> 330<li>The application was compiled against an older version of the Android library 331(Android 1.5 or earlier) and the <code><uses-feature></code> element was 332not available.</li> 333<li>The developer incorrectly assumed that the feature would be present on all 334devices and a declaration was unnecessary.</li> 335<li>The developer omitted the feature declaration accidentally.</li> 336<li>The developer declared the feature explicitly, but the declaration was not 337valid. For example, a spelling error in the <code><uses-feature></code> 338element name or an unrecognized string value for the 339<code>android:name</code> attribute would invalidate the feature declaration. 340</li> 341</ul> 342 343<p>To account for the cases above, Google Play attempts to discover an 344application's implied feature requirements by examining <em>other elements</em> 345declared in the manifest file, specifically, 346<code><uses-permission></code> elements.</p> 347 348<p>If an application requests hardware-related permissions, Google Play 349<em>assumes that the application uses the underlying hardware features and 350therefore requires those features</em>, even though there might be no 351corresponding to <code><uses-feature></code> declarations. For such 352permissions, Google Play adds the underlying hardware features to the 353metadata that it stores for the application and sets up filters for them.</p> 354 355<p>For example, if an application requests the <code>CAMERA</code> permission 356but does not declare a <code><uses-feature></code> element for 357<code>android.hardware.camera</code>, Google Play considers that the 358application requires a camera and should not be shown to users whose devices do 359not offer a camera.</p> 360 361<p>If you don't want Google Play to filter based on a specific implied 362feature, you can disable that behavior. To do so, declare the feature explicitly 363in a <code><uses-feature></code> element and include an 364<code>android:required="false"</code> attribute. For example, to disable 365filtering derived from the <code>CAMERA</code> permission, you would declare 366the feature as shown below.</p> 367 368<pre><uses-feature android:name="android.hardware.camera" android:required="false" /></pre> 369 370<p class="caution">It's important to understand that the permissions that you 371request in <code><uses-permission></code> elements can directly affect how 372Google Play filters your application. The reference section <a 373href="#permissions">Permissions that Imply Feature Requirements</a> lists the 374full set of permissions that imply feature requirements and 375therefore trigger filtering.</p> 376 377<h3 id="bt-permission-handling">Special handling for Bluetooth feature</h3> 378 379<p>Google Play applies slightly different rules than described above, when 380determining filtering for Bluetooth.</p> 381 382<p>If an application declares a Bluetooth permission in a 383<code><uses-permission></code> element, but does not explicitly declare 384the Bluetooth feature in a <code><uses-feature></code> element, Google 385Play checks the version(s) of the Android platform on which the application is 386designed to run, as specified in the <code><uses-sdk></code> element. </p> 387 388<p>As shown in the table below, Google Play enables filtering for the 389Bluetooth feature only if the application declares its lowest or targeted 390platform as Android 2.0 (API level 5) or higher. However, note that Google 391Play applies the normal rules for filtering when the application explicitly 392declares the Bluetooth feature in a <code><uses-feature></code> element. 393</p> 394 395<p class="caption"><strong>Table 1.</strong> How Google Play determines the 396Bluetooth feature requirement for an application that requests a Bluetooth 397permission but does not declare the Bluetooth feature in a 398<code><uses-feature></code> element.</p> 399 400<table style="margin-top:1em;"> 401<tr> 402<th><nobr>If <code>minSdkVersion</code> is ...</nobr></th> 403<th><nobr>or <code>targetSdkVersion</code> is</nobr></th> 404<th>Result</th> 405</tr> 406<tr> 407<td><nobr><=4 (or uses-sdk is not declared)</nobr></td> 408<td><=4</td> 409<td>Google Play <em>will not</em> filter the application from any devices 410based on their reported support for the <code>android.hardware.bluetooth</code> 411feature.</td> 412</tr> 413<tr> 414<td><=4</td> 415<td>>=5</td> 416<td rowspan="2">Google Play filters the application from any devices that 417do not support the <code>android.hardware.bluetooth</code> feature (including 418older releases).</td> 419</tr> 420<tr> 421<td>>=5</td> 422<td>>=5</td> 423</tr> 424</table> 425 426<p>The examples below illustrate the different filtering effects, based on how 427Google Play handles the Bluetooth feature. </p> 428 429<dl> 430<dt>In first example, an application that is designed to run on older API levels 431declares a Bluetooth permission, but does not declare the Bluetooth feature in a 432<code><uses-feature></code> element.</dt> 433<dd><em>Result:</em> Google Play does not filter the application from any device.</dd> 434</dl> 435 436<pre><manifest ...> 437 <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 438 <uses-sdk android:minSdkVersion="3" /> 439 ... 440</manifest></pre> 441 442<dl> 443<dt>In the second example, below, the same application also declares a target 444API level of "5". </dt> 445<dd><em>Result:</em> Google Play now assumes that the feature is required and 446will filter the application from all devices that do not report Bluetooth support, 447including devices running older versions of the platform. </dd> 448</dl> 449 450<pre><manifest ...> 451 <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 452 <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="5" /> 453 ... 454</manifest></pre> 455 456<dl> 457<dt>Here the same application now specifically declares the Bluetooth feature.</dt> 458<dd><em>Result:</em> Identical to the previous example (filtering is applied).</dd> 459</dl> 460 461<pre><manifest ...> 462 <uses-feature android:name="android.hardware.bluetooth" /> 463 <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 464 <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="5" /> 465 ... 466</manifest></pre> 467 468<dl> 469<dt>Finally, in the case below, the same application adds an 470<code>android:required="false"</code> attribute.</dt> 471<dd><em>Result:</em> Google Play disables filtering based on Bluetooth 472feature support, for all devices.</dd> 473</dl> 474 475<pre><manifest ...> 476 <uses-feature android:name="android.hardware.bluetooth" android:required="false" /> 477 <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 478 <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="5" /> 479 ... 480</manifest></pre> 481 482 483 484<h3 id="testing">Testing the features required by your application</h3> 485 486<p>You can use the <code>aapt</code> tool, included in the Android SDK, to 487determine how Google Play will filter your application, based on its declared 488features and permissions. To do so, run <code>aapt</code> with the <code>dump 489badging</code> command. This causes <code>aapt</code> to parse your 490application's manifest and apply the same rules as used by Google Play to 491determine the features that your application requires. </p> 492 493<p>To use the tool, follow these steps: </p> 494 495<ol> 496<li>First, build and export your application as an unsigned <code>.apk</code>. 497If you are developing in Android Studio, build your application with Gradle: 498<ol TYPE=a> 499<li>Open the project and select <strong>Run > Edit Configurations</strong>. 500<li>Select the plus sign near the top-left corner of the <strong>Run/Debug 501Configurations</strong> window. 502<li>Select <strong>Gradle.</strong> 503<li>Enter <code>Unsigned APK</code> in <strong>Name</strong>. 504<li>Choose your module from the <strong>Gradle project</strong> section. 505<li>Enter <code>assemble</code> in <strong>Tasks</strong>. 506<li>Select <strong>OK</strong> to complete the new configuration. 507<li>Make sure the <strong>Unsigned APK</strong> run configuration is selected 508in the toolbar and select <strong>Run > Run 'Unsigned APK'</strong>.</li> 509</ol> 510You can find your unsigned <code>.apk</code> in the 511<code><<em>ProjectName</em>>/app/build/outputs/apk/</code> directory. 512 513<li>Next, locate the <code>aapt</code> tool, if it is not already in your PATH. 514If you are using SDK Tools r8 or higher, you can find <code>aapt</code> in the 515<code><<em>SDK</em>>/build-tools/<<em>tools version number</em>></code> 516directory. 517<p class="note"><strong>Note:</strong> You must use the version of 518<code>aapt</code> that is provided for the latest Build-Tools component available. If 519you do not have the latest Build-Tools component, download it using the <a 520href="{@docRoot}studio/intro/update.html">Android SDK Manager</a>. 521</p></li> 522<li>Run <code>aapt</code> using this syntax: </li> 523</ol> 524 525<pre>$ aapt dump badging <<em>path_to_exported_.apk</em>></pre> 526 527<p>Here's an example of the command output for the second Bluetooth example, above: </p> 528 529<pre>$ ./aapt dump badging BTExample.apk 530package: name='com.example.android.btexample' versionCode='' versionName='' 531<strong>uses-permission:'android.permission.BLUETOOTH_ADMIN'</strong> 532<strong>uses-feature:'android.hardware.bluetooth'</strong> 533sdkVersion:'3' 534targetSdkVersion:'5' 535application: label='BT Example' icon='res/drawable/app_bt_ex.png' 536launchable activity name='com.example.android.btexample.MyActivity'label='' icon='' 537uses-feature:'android.hardware.touchscreen' 538main 539supports-screens: 'small' 'normal' 'large' 540locales: '--_--' 541densities: '160' 542</pre> 543 544<h2 id="features-reference"> 545 Features Reference 546</h2> 547 548<p> 549 The following sections provide reference information about hardware features, 550 software features, and sets of permissions that imply specific feature 551 requirements. 552</p> 553 554<h3 id="hw-features"> 555 Hardware features 556</h3> 557 558<p> 559 This section presents the hardware features supported by the most current 560 platform release. To indicate that your app uses or requires a hardware 561 feature, declare the corresponding value (beginning with 562 <code>"android.hardware"</code>) in an <code>android:name</code> attribute. 563 Each time you declare a hardware feature, use a separate 564 <code><uses-feature></code> element. 565</p> 566 567<h4 id="audio-hw-features"> 568 Audio hardware features 569</h4> 570 571<dl> 572 <dt> 573 <code>android.hardware.audio.low_latency</code> 574 </dt> 575 576 <dd> 577 The app uses the device's low-latency audio pipeline, which reduces lag and 578 delays when processing sound input or output. 579 </dd> 580 581 <dt> 582 <code>android.hardware.audio.output</code> 583 </dt> 584 585 <dd> 586 The app transmits sound using the device's speakers, audio jack, Bluetooth 587 streaming capabilities, or a similar mechanism. 588 </dd> 589 590 <dt> 591 <code>android.hardware.audio.pro</code> 592 </dt> 593 594 <dd> 595 The app uses the device's high-end audio functionality and performance 596 capabilities. 597 </dd> 598 599 <dt> 600 <code>android.hardware.microphone</code> 601 </dt> 602 603 <dd> 604 The app records audio using the device's microphone. 605 </dd> 606</dl> 607 608<h4 id="bluetooth-hw-features"> 609 Bluetooth hardware features 610</h4> 611 612<dl> 613 <dt> 614 <code>android.hardware.bluetooth</code> 615 </dt> 616 617 <dd> 618 The app uses the device's Bluetooth features, usually to communicate with 619 other Bluetooth-enabled devices. 620 </dd> 621 622 <dt> 623 <code>android.hardware.bluetooth_le</code> 624 </dt> 625 626 <dd> 627 The app uses the device's Bluetooth Low Energy radio features. 628 </dd> 629</dl> 630 631<h4 id="camera-hw-features"> 632 Camera hardware features 633</h4> 634 635<dl> 636 <dt> 637 <code>android.hardware.camera</code> 638 </dt> 639 640 <dd> 641 The app uses the device's back-facing camera. Devices with only a 642 front-facing camera do not list this feature, so use the 643 <code>android.hardware.camera.any</code> feature instead if your app can 644 communicate with any camera, regardless of which direction the camera 645 faces. 646 </dd> 647 648 <dt> 649 <code>android.hardware.camera.any</code> 650 </dt> 651 652 <dd> 653 The app uses one of the device's cameras, or an external camera that the 654 user connects to the device. Use this value instead of 655 <code>android.hardware.camera</code> if your app does not require the 656 camera to be a back-facing one. 657 </dd> 658 659 <dt> 660 <code>android.hardware.camera.autofocus</code> 661 </dt> 662 663 <dd> 664 <p> 665 The app uses the autofocus feature that the device's camera supports. 666 </p> 667 668 <p> 669 By using this feature, an app implies that it also uses the 670 <code>android.hardware.camera</code> feature, unless this parent feature 671 is declared with <code>android:required="false"</code>. 672 </p> 673 </dd> 674 675 <dt> 676 <code>android.hardware.camera.capability.manual_post_processing</code> 677 </dt> 678 679 <dd> 680 <p> 681 The app uses the <code>MANUAL_POST_PROCESSING</code> feature that the 682 device's camera supports. 683 </p> 684 685 <p> 686 This feature allows your app to override the camera's auto white balance 687 functionality. Use <code>android.colorCorrection.transform</code>, 688 <code>android.colorCorrection.gains</code>, and an 689 <code>android.colorCorrection.mode</code> of 690 <code>TRANSFORM_MATRIX</code>. 691 </p> 692 </dd> 693 694 <dt> 695 <code>android.hardware.camera.capability.manual_sensor</code> 696 </dt> 697 698 <dd> 699 <p> 700 The app uses the <code>MANUAL_SENSOR</code> feature that the device's 701 camera supports. 702 </p> 703 704 <p> 705 This feature implies support for auto-exposure locking 706 (<code>android.control.aeLock</code>), which allows the camera's exposure 707 time and sensitivity to remain fixed at specific values. 708 </p> 709 </dd> 710 711 <dt> 712 <code>android.hardware.camera.capability.raw</code> 713 </dt> 714 715 <dd> 716 <p> 717 The app uses the <code>RAW</code> feature that the device's camera 718 supports. 719 </p> 720 721 <p> 722 This feature implies that the device can save DNG (raw) files and that 723 the device's camera provides the DNG-related metadata necessary for your 724 app to process these raw images directly. 725 </p> 726 </dd> 727 728 <dt> 729 <code>android.hardware.camera.external</code> 730 </dt> 731 732 <dd> 733 The app communicates with an external camera that the user connects to the 734 device. This feature does not guarantee, however, that the external camera 735 is available for your app to use. 736 </dd> 737 738 <dt> 739 <code>android.hardware.camera.flash</code> 740 </dt> 741 742 <dd> 743 <p> 744 The app uses the flash feature that the device's camera supports. 745 </p> 746 747 <p> 748 By using this feature, an app implies that it also uses the 749 <code>android.hardware.camera</code> feature, unless this parent feature 750 is declared with <code>android:required="false"</code>. 751 </p> 752 </dd> 753 754 <dt> 755 <code>android.hardware.camera.front</code> 756 </dt> 757 758 <dd> 759 <p> 760 The app uses the device's front-facing camera. 761 </p> 762 763 <p> 764 By using this feature, an app implies that it also uses the 765 <code>android.hardware.camera</code> feature, unless this parent feature 766 is declared with <code>android:required="false"</code>. 767 </p> 768 </dd> 769 770 <dt> 771 <code>android.hardware.camera.level.full</code> 772 </dt> 773 774 <dd> 775 The app uses the <code>FULL</code>-level image-capturing support that at 776 least one of the device's cameras provides. Cameras with <code>FULL</code> 777 support provide burst-capture capabilities, per-frame control, and manual 778 post-processing control. 779 </dd> 780</dl> 781 782<h4 id="device-ui-hw-features"> 783 Device UI hardware features 784</h4> 785 786<dl> 787 <dt> 788 <code>android.hardware.type.automotive</code> 789 </dt> 790 791 <dd> 792 <p> 793 The app is designed to show its UI on a set of screens inside a vehicle. 794 The user interacts with the app using hard buttons, touch, rotary 795 controllers, and mouse-like interfaces. The vehicle's screens usually 796 appear in the center console or the instrument cluster of a vehicle. These 797 screens usually have limited size and resolution. 798 </p> 799 800 <p class="note"> 801 <strong>Note: </strong>It's important to keep in mind that, since the user 802 is driving while using this type of app UI, the app must minimize driver 803 distraction. 804 </p> 805 </dd> 806 807 <dt> 808 <code>android.hardware.type.television</code> 809 </dt> 810 811 <dd> 812 <p> 813 (Deprecated; use <a href="#media-sw-features"> 814 <code>android.software.leanback</code></a> instead.) 815 </p> 816 817 <p> 818 The app is designed to show its UI on a television. This feature defines 819 "television" to be a typical living room television experience: displayed 820 on a big screen, where the user is sitting far away and the dominant form 821 of input is something like a d-pad, and generally not using a mouse, 822 pointer, or touch device. 823 </p> 824 </dd> 825 826 <dt> 827 <code>android.hardware.type.watch</code> 828 </dt> 829 830 <dd> 831 The app is designed to show its UI on a watch. A watch is worn on the body, 832 such as on the wrist. The user is very close to the device while 833 interacting with it. 834 </dd> 835</dl> 836 837<h4 id="fingerprint-hw-features"> 838 Fingerprint hardware features 839</h4> 840 841<dl> 842 <dt> 843 <code>android.hardware.fingerprint</code> 844 </dt> 845 846 <dd> 847 The app reads fingerprints using the device's biometric hardware. 848 </dd> 849</dl> 850 851<h4 id="gamepad-hw-features"> 852 Gamepad hardware features 853</h4> 854 855<dl> 856 <dt> 857 <code>android.hardware.gamepad</code> 858 </dt> 859 860 <dd> 861 The app captures game controller input, either from the device itself or 862 from a connected gamepad. 863 </dd> 864</dl> 865 866<h4 id="infrared-hw-features"> 867 Infrared hardware features 868</h4> 869 870<dl> 871 <dt> 872 <code>android.hardware.consumerir</code> 873 </dt> 874 875 <dd> 876 The app uses the device's infrared (IR) capabilities, usually to 877 communicate with other consumer IR devices. 878 </dd> 879</dl> 880 881<h4 id="location-hw-features"> 882 Location hardware features 883</h4> 884 885<dl> 886 <dt> 887 <code>android.hardware.location</code> 888 </dt> 889 890 <dd> 891 The app uses one or more features on the device for determining location, 892 such as GPS location, network location, or cell location. 893 </dd> 894 895 <dt> 896 <code>android.hardware.location.gps</code> 897 </dt> 898 899 <dd> 900 <p> 901 The app uses precise location coordinates obtained from a Global 902 Positioning System (GPS) receiver on the device. 903 </p> 904 905 <p> 906 By using this feature, an app implies that it also uses the 907 <code>android.hardware.location</code> feature, unless this parent 908 feature is declared with the attribute 909 <code>android:required="false"</code>. 910 </p> 911 </dd> 912 913 <dt> 914 <code>android.hardware.location.network</code> 915 </dt> 916 917 <dd> 918 <p> 919 The app uses coarse location coordinates obtained from a network-based 920 geolocation system supported on the device. 921 </p> 922 923 <p> 924 By using this feature, an app implies that it also uses the 925 <code>android.hardware.location</code> feature, unless this parent 926 feature is declared with the attribute 927 <code>android:required="false"</code>. 928 </p> 929 </dd> 930</dl> 931 932<h4 id="nfc-hw-features"> 933 NFC hardware features 934</h4> 935 936<dl> 937 <dt> 938 <code>android.hardware.nfc</code> 939 </dt> 940 941 <dd> 942 The app uses the device's Near-Field Communication (NFC) radio features. 943 </dd> 944 945 <dt> 946 <code>android.hardware.nfc.hce</code> 947 </dt> 948 949 <dd> 950 <p> 951 (Deprecated.) 952 </p> 953 954 <p> 955 The app uses NFC card emulation that is hosted on the device. 956 </p> 957 </dd> 958</dl> 959 960<h4 id="opengl-es-hw-features"> 961 OpenGL ES hardware features 962</h4> 963 964<dl> 965 <dt> 966 <code>android.hardware.opengles.aep</code> 967 </dt> 968 969 <dd> 970 The app uses the <a href= 971 "http://www.khronos.org/registry/gles/extensions/ANDROID/ANDROID_extension_pack_es31a.txt" 972 class="external-link">OpenGL ES Android Extension Pack</a>that is installed 973 on the device. 974 </dd> 975</dl> 976 977<h4 id="sensor-hw-features"> 978 Sensor hardware features 979</h4> 980 981<dl> 982 <dt> 983 <code>android.hardware.sensor.accelerometer</code> 984 </dt> 985 986 <dd> 987 The app uses motion readings from the device's accelerometer to detect 988 the device's current orientation. For example, an app could use 989 accelerometer readings to determine when to switch between portrait and 990 landscape orientations. 991 </dd> 992 993 <dt> 994 <code>android.hardware.sensor.ambient_temperature</code> 995 </dt> 996 997 <dd> 998 The app uses the device's ambient (environmental) temperature sensor. For 999 example, a weather app could report indoor or outdoor temperature. 1000 </dd> 1001 1002 <dt> 1003 <code>android.hardware.sensor.barometer</code> 1004 </dt> 1005 1006 <dd> 1007 The app uses the device's barometer. For example, a weather app could 1008 report air pressure. 1009 </dd> 1010 1011 <dt> 1012 <code>android.hardware.sensor.compass</code> 1013 </dt> 1014 1015 <dd> 1016 The app uses the device's magnetometer (compass). For example, a navigation 1017 app could show the current direction a user faces. 1018 </dd> 1019 1020 <dt> 1021 <code>android.hardware.sensor.gyroscope</code> 1022 </dt> 1023 1024 <dd> 1025 The app uses the device's gyroscope to detect rotation and twist, creating 1026 a six-axis orientation system. By using this sensor, an app can detect more 1027 smoothly whether it needs to switch between portrait and landscape 1028 orientations. 1029 </dd> 1030 1031 <dt> 1032 <code>android.hardware.sensor.hifi_sensors</code> 1033 </dt> 1034 1035 <dd> 1036 The app uses the device's high fidelity (Hi-Fi) sensors. For example, a 1037 gaming app could detect the user's high-precision movements. 1038 </dd> 1039 1040 <dt> 1041 <code>android.hardware.sensor.heartrate</code> 1042 </dt> 1043 1044 <dd> 1045 The app uses the device's heart rate monitor. For example, a fitness app 1046 could report trends in a user's heart rate over time. 1047 </dd> 1048 1049 <dt> 1050 <code>android.hardware.sensor.heartrate.ecg</code> 1051 </dt> 1052 1053 <dd> 1054 The app uses the device's elcardiogram (ECG) heart rate sensor. For 1055 example, a fitness app could report more detailed information about a 1056 user's heart rate. 1057 </dd> 1058 1059 <dt> 1060 <code>android.hardware.sensor.light</code> 1061 </dt> 1062 1063 <dd> 1064 The app uses the device's light sensor. For example, an app could display 1065 one of two different color schemes based on the ambient lighting 1066 conditions. 1067 </dd> 1068 1069 <dt> 1070 <code>android.hardware.sensor.proximity</code> 1071 </dt> 1072 1073 <dd> 1074 The app uses the device's proximity sensor. For example, a telephony app 1075 could turn off the device's screen when the app detects that the user is 1076 holding the device close to their body. 1077 </dd> 1078 1079 <dt> 1080 <code>android.hardware.sensor.relative_humidity</code> 1081 </dt> 1082 1083 <dd> 1084 The app uses the device's relative humidity sensor. For example, a weather 1085 app could use the humidity to calculate and report the current dewpoint. 1086 </dd> 1087 1088 <dt> 1089 <code>android.hardware.sensor.stepcounter</code> 1090 </dt> 1091 1092 <dd> 1093 The app uses the device's step counter. For example, a fitness app could 1094 report the number of steps a user needs to take to achieve their daily step 1095 count goal. 1096 </dd> 1097 1098 <dt> 1099 <code>android.hardware.sensor.stepdetector</code> 1100 </dt> 1101 1102 <dd> 1103 The app uses the device's step detector. For example, a fitness app could 1104 use the time interval between steps to infer the type of exercise that the 1105 user is doing. 1106 </dd> 1107</dl> 1108 1109<h4 id="screen-hw-features"> 1110 Screen hardware features 1111</h4> 1112 1113<dl> 1114 <dt> 1115 <code>android.hardware.screen.landscape</code> 1116 </dt> 1117 1118 <dt> 1119 <code>android.hardware.screen.portrait</code> 1120 </dt> 1121 1122 <dd> 1123 <p> 1124 The app requires the device to use the portrait or landscape orientation. 1125 If your app supports both orientations, then you don't need to declare 1126 either feature. 1127 </p> 1128 1129 <p> 1130 For example, if your app requires portrait orientation, you should 1131 declare the following feature so that only the devices that support 1132 portrait orientation (always or by user choice) can run your app: 1133 </p> 1134 <pre><uses-feature android:name="android.hardware.screen.portrait" /></pre> 1135 1136 <p> 1137 Both orientations are assumed not required by default, so your app may be 1138 installed on devices that support one or both orientations. However, if 1139 any of your activities request that they run in a specific orientation, 1140 using the <a href= 1141 "{@docRoot}guide/topics/manifest/activity-element.html#screen">{@code 1142 android:screenOrientation}</a> attribute, then this declaration implies 1143 that your app requires that orientation. For example, if you declare 1144 <a href= 1145 "{@docRoot}guide/topics/manifest/activity-element.html#screen">{@code 1146 android:screenOrientation}</a> with either {@code "landscape"}, {@code 1147 "reverseLandscape"}, or {@code "sensorLandscape"}, then your app will be 1148 available only on devices that support landscape orientation. 1149 </p> 1150 1151 <p> 1152 As a best practice, you should still declare your requirement for this 1153 orientation using a {@code <uses-feature>} element. If you declare 1154 an orientation for your activity using <a href= 1155 "{@docRoot}guide/topics/manifest/activity-element.html#screen">{@code 1156 android:screenOrientation}</a>, but don't actually require it, you can 1157 disable the requirement by declaring the orientation with a {@code 1158 <uses-feature>} element and include {@code 1159 android:required="false"}. 1160 </p> 1161 1162 <p> 1163 For backward compatibility, any device running Android 3.1 (API level 12) 1164 or lower supports both landscape and portrait orientations. 1165 </p> 1166 </dd> 1167</dl> 1168 1169<h4 id="telephony-hw-features"> 1170 Telephony hardware features 1171</h4> 1172 1173<dl> 1174 <dt> 1175 <code>android.hardware.telephony</code> 1176 </dt> 1177 1178 <dd> 1179 The app uses the device's telephony features, such as telephony radio with 1180 data communication services. 1181 </dd> 1182 1183 <dt> 1184 <code>android.hardware.telephony.cdma</code> 1185 </dt> 1186 1187 <dd> 1188 <p> 1189 The app uses the Code Division Multiple Access (CDMA) telephony radio 1190 system. 1191 </p> 1192 1193 <p> 1194 By using this feature, an app implies that it also uses the 1195 <code>android.hardware.telephony</code> feature, unless this parent 1196 feature is declared with <code>android:required="false"</code>. 1197 </p> 1198 </dd> 1199 1200 <dt> 1201 <code>android.hardware.telephony.gsm</code> 1202 </dt> 1203 1204 <dd> 1205 <p> 1206 The app uses the Global System for Mobile Communications (GSM) telephony 1207 radio system. 1208 </p> 1209 1210 <p> 1211 By using this feature, an app implies that it also uses the 1212 <code>android.hardware.telephony</code> feature, unless this parent 1213 feature is declared with <code>android:required="false"</code>. 1214 </p> 1215 </dd> 1216</dl> 1217 1218<h4 id="touchscreen-hw-features"> 1219 Touchscreen hardware features 1220</h4> 1221 1222<dl> 1223 <dt> 1224 <code>android.hardware.faketouch</code> 1225 </dt> 1226 1227 <dd> 1228 <p> 1229 The app uses basic touch interaction events, such as tapping and 1230 dragging. 1231 </p> 1232 1233 <p> 1234 By default, your app requires this feature. This feature indicates that the app is 1235 compatible with a device only if that device emulates a touchscreen 1236 ("fake touch" interface) or has an actual touchscreen. 1237 </p> 1238 1239 <p> 1240 A device that offers a fake touch interface provides a user input system 1241 that emulates a subset of a touchscreen's capabilities. For example, a 1242 mouse or remote control could drive an on-screen cursor. If your app 1243 requires basic point and click interaction (in other words, it won't work 1244 with only a d-pad controller), you should declare this feature or simply 1245 avoid declaring any {@code android.hardware.touchscreen.*} features. Because 1246 this is the minimum level of touch interaction, you can also use an app 1247 that declares this feature on devices that offer more complex touch 1248 interfaces. 1249 </p> 1250 </dd> 1251 1252 <dt> 1253 <code>android.hardware.faketouch.multitouch.distinct</code> 1254 </dt> 1255 1256 <dd> 1257 <p> 1258 The app tracks two or more distinct "fingers" on a fake touch interface. 1259 This is a superset of the <code>android.hardware.faketouch</code> 1260 feature. When declared as required, this feature indicates that the app 1261 is compatible with a device only if that device emulates distinct 1262 tracking of two or more fingers or has an actual touchscreen. 1263 </p> 1264 1265 <p> 1266 Unlike the distinct multitouch defined by {@code 1267 android.hardware.touchscreen.multitouch.distinct}, input devices that 1268 support distinct multitouch with a fake touch interface don't support all 1269 two-finger gestures because the input in transformed to cursor movement 1270 on the screen. That is, single-finger gestures on such a device move a 1271 cursor, two-finger swipes cause single-finger touch events to occur, and 1272 other two-finger gestures trigger the corresponding two-finger touch 1273 events. 1274 </p> 1275 1276 <p> 1277 A device that provides a two-finger touch trackpad for cursor movement 1278 can support this feature. 1279 </p> 1280 </dd> 1281 1282 <dt> 1283 <code>android.hardware.faketouch.multitouch.jazzhand</code> 1284 </dt> 1285 1286 <dd> 1287 <p> 1288 The app tracks five or more distinct "fingers" on a fake touch interface. 1289 This is a superset of the <code>android.hardware.faketouch</code> 1290 feature. When declared as required, this feature indicates that the app 1291 is compatible with a device only if that device emulates distinct 1292 tracking of five or more fingers or has an actual touchscreen. 1293 </p> 1294 1295 <p> 1296 Unlike the distinct multitouch defined by {@code 1297 android.hardware.touchscreen.multitouch.jazzhand}, input devices that 1298 support jazzhand multitouch with a fake touch interface don't support all 1299 five-finger gestures because the input in transformed to cursor movement 1300 on the screen. That is, single-finger gestures on such a device move a 1301 cursor, multi-finger gestures cause single-finger touch events to occur, 1302 and other multi-finger gestures trigger the corresponding multi-finger 1303 touch events. 1304 </p> 1305 1306 <p> 1307 A device that provides a five-finger touch trackpad for cursor movement 1308 can support this feature. 1309 </p> 1310 </dd> 1311 1312 <dt> 1313 <code>android.hardware.touchscreen</code> 1314 </dt> 1315 1316 <dd> 1317 <p> 1318 The app uses the device's touchscreen capabilities for gestures that are 1319 more interactive than basic touch events, such as a fling. This is a 1320 superset of the <code>android.hardware.faketouch</code> feature. 1321 </p> 1322 1323 <p> 1324 If your app in fact requires a touch interface (to perform more advanced 1325 touch gestures such as fling), then you must explicitly declare this feature 1326 or any advanced touchscreen features. 1327 </p> 1328 1329 <p> 1330 If you require more complex touch interaction, such as multi-finger 1331 gestures, you should declare that your app uses advanced touchscreen 1332 features. 1333 </p> 1334 </dd> 1335 1336 <dt> 1337 <code>android.hardware.touchscreen.multitouch</code> 1338 </dt> 1339 1340 <dd> 1341 <p> 1342 The app uses the device's basic two-point multitouch capabilities, such 1343 as for pinch gestures, but the app does not need to track touches 1344 independently. This is a superset of the 1345 <code>android.hardware.touchscreen</code> feature. 1346 </p> 1347 1348 <p> 1349 By using this feature, an app implies that it also uses the 1350 <code>android.hardware.touchscreen</code> feature, unless this parent 1351 feature is declared with <code>android:required="false"</code>. 1352 </p> 1353 </dd> 1354 1355 <dt> 1356 <code>android.hardware.touchscreen.multitouch.distinct</code> 1357 </dt> 1358 1359 <dd> 1360 <p> 1361 The app uses the device's advanced multitouch capabilities for tracking 1362 two or more points independently. This feature is a superset of the 1363 <code>android.hardware.touchscreen.multitouch</code> feature. 1364 </p> 1365 1366 <p> 1367 By using this feature, an app implies that it also uses the 1368 <code>android.hardware.touchscreen.multitouch</code> feature, unless this 1369 parent feature is declared with <code>android:required="false"</code>. 1370 </p> 1371 </dd> 1372 1373 <dt> 1374 <code>android.hardware.touchscreen.multitouch.jazzhand</code> 1375 </dt> 1376 1377 <dd> 1378 <p> 1379 The app uses the device's advanced multitouch capabilities for tracking 1380 five or more points independently. This feature is a superset of the 1381 <code>android.hardware.touchscreen.multitouch</code> feature. 1382 </p> 1383 1384 <p> 1385 By using this feature, an app implies that it also uses the 1386 <code>android.hardware.touchscreen.multitouch</code> feature, unless this 1387 parent feature is declared with <code>android:required="false"</code>. 1388 </p> 1389 </dd> 1390</dl> 1391 1392<h4 id="usb-hw-features"> 1393 USB hardware features 1394</h4> 1395 1396<dl> 1397 <dt> 1398 <code>android.hardware.usb.accessory</code> 1399 </dt> 1400 1401 <dd> 1402 The app behaves as the USB device and connects to USB hosts. 1403 </dd> 1404 1405 <dt> 1406 <code>android.hardware.usb.host</code> 1407 </dt> 1408 1409 <dd> 1410 The app uses the USB accessories that are connected to the device. The 1411 device serves as the USB host. 1412 </dd> 1413</dl> 1414 1415<h4 id="wi-fi-hw-features"> 1416 Wi-Fi hardware features 1417</h4> 1418 1419<dl> 1420 <dt> 1421 <code>android.hardware.wifi</code> 1422 </dt> 1423 1424 <dd> 1425 The app uses 802.11 networking (Wi-Fi) features on the device. 1426 </dd> 1427 1428 <dt> 1429 <code>android.hardware.wifi.direct</code> 1430 </dt> 1431 1432 <dd> 1433 The app uses the Wi-Fi Direct networking features on the device. 1434 </dd> 1435</dl> 1436 1437<h3 id="sw-features"> 1438 Software features 1439</h3> 1440 1441<p> 1442 This section presents the software features supported by the most current 1443 platform release. To indicate that your app uses or requires a software 1444 feature, declare the corresponding value (beginning with 1445 <code>"android.software"</code>) in an <code>android:name</code> attribute. 1446 Each time you declare a software feature, use a separate 1447 <code><uses-feature></code> element. 1448</p> 1449 1450<h4 id="communication-sw-features"> 1451 Communication software features 1452</h4> 1453 1454<dl> 1455 <dt> 1456 <code>android.software.sip</code> 1457 </dt> 1458 1459 <dd> 1460 The app uses Session Initiation Protocol (SIP) services. By using SIP, the 1461 app can support internet telephony operations, such as video conferencing 1462 and instant messaging. 1463 </dd> 1464 1465 <dt> 1466 <code>android.software.sip.voip</code> 1467 </dt> 1468 1469 <dd> 1470 <p> 1471 The app uses SIP-based Voice Over Internet Protocol (VoIP) services. By 1472 using VoIP, the app can support real-time internet telephony operations, 1473 such as two-way video conferencing. 1474 </p> 1475 1476 <p> 1477 By using this feature, an app implies that it also uses the 1478 <code>android.software.sip</code> feature, unless this parent feature is 1479 declared with <code>android:required="false"</code>. 1480 </p> 1481 </dd> 1482 1483 <dt> 1484 <code>android.software.webview</code> 1485 </dt> 1486 1487 <dd> 1488 The app displays content from the internet. 1489 </dd> 1490</dl> 1491 1492<h4 id="custom-input-sw-features"> 1493 Custom input software features 1494</h4> 1495 1496<dl> 1497 <dt> 1498 <code>android.software.input_methods</code> 1499 </dt> 1500 1501 <dd> 1502 The app uses a new input method, which the developer defines in an <a href= 1503 "{@docRoot}reference/android/inputmethodservice/InputMethodService.html">{@code 1504 InputMethodService}</a>. 1505 </dd> 1506</dl> 1507 1508<h4 id="device-management-sw-features"> 1509 Device management software features 1510</h4> 1511 1512<dl> 1513 <dt> 1514 <code>android.software.backup</code> 1515 </dt> 1516 1517 <dd> 1518 The app includes logic to handle a backup and restore operation. 1519 </dd> 1520 1521 <dt> 1522 <code>android.software.device_admin</code> 1523 </dt> 1524 1525 <dd> 1526 The app uses device administrators to enforce a device policy. 1527 </dd> 1528 1529 <dt> 1530 <code>android.software.managed_users</code> 1531 </dt> 1532 1533 <dd> 1534 The app supports secondary users and managed profiles. 1535 </dd> 1536 1537 <dt> 1538 <code>android.software.securely_removes_users</code> 1539 </dt> 1540 1541 <dd> 1542 The app can <strong>permanently</strong> remove users and their associated 1543 data. 1544 </dd> 1545 1546 <dt> 1547 <code>android.software.verified_boot</code> 1548 </dt> 1549 1550 <dd> 1551 The app includes logic to handle results from the device's verified boot 1552 feature, which detects whether the device's configuration changes during a 1553 restart operation. 1554 </dd> 1555</dl> 1556 1557<h4 id="media-sw-features"> 1558 Media software features 1559</h4> 1560 1561<dl> 1562 <dt> 1563 <code>android.software.midi</code> 1564 </dt> 1565 1566 <dd> 1567 The app connects to musical instruments or outputs sound using the Musical 1568 Instrument Digital Interface (MIDI) protocol. 1569 </dd> 1570 1571 <dt> 1572 <code>android.software.print</code> 1573 </dt> 1574 1575 <dd> 1576 The app includes commands for printing documents displayed on the device. 1577 </dd> 1578 1579 <dt> 1580 <code>android.software.leanback</code> 1581 </dt> 1582 1583 <dd> 1584 The app presents a UI that is designed for viewing on a large screen, such 1585 as a television. 1586 </dd> 1587 1588 <dt> 1589 <code>android.software.live_tv</code> 1590 </dt> 1591 1592 <dd> 1593 The app streams live television programs. 1594 </dd> 1595</dl> 1596 1597<h4 id="screen-interface-sw-features"> 1598 Screen interface software features 1599</h4> 1600 1601<dl> 1602 <dt> 1603 <code>android.software.app_widgets</code> 1604 </dt> 1605 1606 <dd> 1607 The app uses or provides App Widgets and should be installed only on 1608 devices that include a Home screen or similar location where users can 1609 embed App Widgets. 1610 </dd> 1611 1612 <dt> 1613 <code>android.software.home_screen</code> 1614 </dt> 1615 1616 <dd> 1617 The app behaves as a replacement to the device's Home screen. 1618 </dd> 1619 1620 <dt> 1621 <code>android.software.live_wallpaper</code> 1622 </dt> 1623 1624 <dd> 1625 The app uses or provides wallpapers that include animation. 1626 </dd> 1627</dl> 1628 1629<h3 id="permissions"> 1630 Permissions that Imply Feature Requirements 1631</h3> 1632 1633<p> 1634 Some of the hardware and software feature constants were made available to 1635 applications after the corresponding API; for example, the 1636 <code>android.hardware.bluetooth</code> feature was added in Android 2.2 (API 1637 level 8), but the Bluetooth API that it refers to was added in Android 2.0 1638 (API level 5). Because of this, some apps were able to use the API before 1639 they had the ability to declare that they require the API using the 1640 <code><uses-feature></code> system. 1641</p> 1642 1643<p> 1644 To prevent those apps from being made available unintentionally, Google Play 1645 assumes that certain hardware-related permissions indicate that the 1646 underlying hardware features are required by default. For instance, 1647 applications that use Bluetooth must request the <code>BLUETOOTH</code> 1648 permission in a <code><uses-permission></code> element — for legacy 1649 apps, Google Play assumes that the permission declaration means that the 1650 underlying <code>android.hardware.bluetooth</code> feature is required by the 1651 application and sets up filtering based on that feature. Table 2 lists 1652 permissions that imply feature requirements equivalent to those declared in 1653 <code><uses-feature></code> elements. 1654</p> 1655 1656<p> 1657 Note that <code><uses-feature></code> declarations, including any 1658 declared <code>android:required</code> attribute, always take precedence over 1659 features implied by the permissions in table 2. For any of these permissions, 1660 you can disable filtering based on the implied feature by explicitly 1661 declaring the implied feature explicitly, in a 1662 <code><uses-feature></code> element, with an 1663 <code>android:required="false"</code> attribute. For example, to disable any 1664 filtering based on the <code>CAMERA</code> permission, you would add this 1665 <code><uses-feature></code> declaration to the manifest file: 1666</p> 1667 1668<pre><uses-feature android:name="android.hardware.camera" android:required="false" /></pre> 1669 1670<p class="caution"> 1671 <strong>Caution:</strong> If your app targets Android 5.0 (API level 21) or 1672 higher and uses the <code>ACCESS_COARSE_LOCATION</code> or 1673 <code>ACCESS_FINE_LOCATION</code> permission in order to receive location 1674 updates from the network or a GPS, respectively, you must also explicitly 1675 declare that your app uses the <code>android.hardware.location.network</code> 1676 or <code>android.hardware.location.gps</code> hardware features. 1677</p> 1678 1679<p class="table-caption" id="permissions-features"> 1680 <strong>Table 2. </strong>Device permissions that imply device hardware use. 1681</p> 1682<table> 1683 <tr> 1684 <th>Category</th> 1685 <th>This Permission...</th> 1686 <th>...Implies This Feature Requirement</th> 1687 <!-- <th>Comments</th> --> 1688 </tr> 1689 1690 1691<tr> 1692 <td rowspan="2">Bluetooth</td> 1693 <td><code>BLUETOOTH</code></td> 1694 <td><code>android.hardware.bluetooth</code> 1695<p>(See <a href="#bt-permission-handling">Special handling for Bluetooth feature</a> for details.)</p></td> 1696<!-- <td></td> --> 1697</tr> 1698<tr> 1699 <td><code>BLUETOOTH_ADMIN</code></td> 1700 <td><code>android.hardware.bluetooth</code></td> 1701<!-- <td></td> --> 1702</tr> 1703 1704<tr> 1705 <td>Camera</td> 1706 <td><code>CAMERA</code></td> 1707 <td><code>android.hardware.camera</code> <em>and</em> 1708<br><code>android.hardware.camera.autofocus</code></td> 1709<!-- <td></td> --> 1710</tr> 1711 1712<tr> 1713 <td rowspan="5">Location</td> 1714 <td><code>ACCESS_MOCK_LOCATION</code></td> 1715 <td><code>android.hardware.location</code></td> 1716<!-- <td></td> --> 1717</tr> 1718<tr> 1719 <td><code>ACCESS_LOCATION_EXTRA_COMMANDS</code></td> 1720 <td><code>android.hardware.location</code></td> 1721<!-- <td></td> --> 1722</tr> 1723<tr> 1724 <td><code>INSTALL_LOCATION_PROVIDER</code></td> 1725 <td><code>android.hardware.location</code></td> 1726<!-- <td></td> --> 1727</tr> 1728<tr> 1729 <td><code>ACCESS_COARSE_LOCATION</code></td> 1730 <td> 1731 <p> 1732 <code>android.hardware.location</code> 1733 </p> 1734 <p> 1735 <code>android.hardware.location.network</code> 1736 (Only when target API level is 20 or lower.) 1737 </p> 1738 </td> 1739<!-- <td></td> --> 1740</tr> 1741<tr> 1742 <td><code>ACCESS_FINE_LOCATION</code></td> 1743 <td> 1744 <p> 1745 <code>android.hardware.location</code> 1746 </p> 1747 <p> 1748 <code>android.hardware.location.gps</code> 1749 (Only when target API level is 20 or lower.) 1750 </p> 1751 </td> 1752 1753<!-- <td></td> --> 1754</tr> 1755 1756<tr> 1757 <td>Microphone</td> 1758 <td><code>RECORD_AUDIO</code></td> 1759 <td><code>android.hardware.microphone</code></td> 1760<!-- <td></td> --> 1761</tr> 1762 1763<tr> 1764 <td rowspan="11">Telephony</td> 1765 <td><code>CALL_PHONE</code></td> 1766 <td><code>android.hardware.telephony</code></td> 1767<!-- <td></td> --> 1768</tr> 1769<tr> 1770 <td><code>CALL_PRIVILEGED</code></td> 1771 <td><code>android.hardware.telephony</code></td> 1772<!-- <td></td> --> 1773</tr> 1774 1775<tr> 1776 <td><code>MODIFY_PHONE_STATE</code></td> 1777 <td><code>android.hardware.telephony</code></td> 1778<!-- <td></td> --> 1779</tr> 1780<tr> 1781 <td><code>PROCESS_OUTGOING_CALLS</code></td> 1782 <td><code>android.hardware.telephony</code></td> 1783<!-- <td></td> --> 1784</tr> 1785<tr> 1786 <td><code>READ_SMS</code></td> 1787 <td><code>android.hardware.telephony</code></td> 1788<!-- <td></td> --> 1789</tr> 1790<tr> 1791 <td><code>RECEIVE_SMS</code></td> 1792 <td><code>android.hardware.telephony</code></td> 1793<!-- <td></td> --> 1794</tr> 1795<tr> 1796 <td><code>RECEIVE_MMS</code></td> 1797 <td><code>android.hardware.telephony</code></td> 1798<!-- <td></td> --> 1799</tr> 1800<tr> 1801 <td><code>RECEIVE_WAP_PUSH</code></td> 1802 <td><code>android.hardware.telephony</code></td> 1803<!-- <td></td> --> 1804</tr> 1805<tr> 1806 <td><code>SEND_SMS</code></td> 1807 <td><code>android.hardware.telephony</code></td> 1808<!-- <td></td> --> 1809</tr> 1810<tr> 1811 <td><code>WRITE_APN_SETTINGS</code></td> 1812 <td><code>android.hardware.telephony</code></td> 1813<!-- <td></td> --> 1814</tr> 1815<tr> 1816 <td><code>WRITE_SMS</code></td> 1817 <td><code>android.hardware.telephony</code></td> 1818<!-- <td></td> --> 1819</tr> 1820 1821<tr> 1822 <td rowspan="3">Wi-Fi</td> 1823 <td><code>ACCESS_WIFI_STATE</code></td> 1824 <td><code>android.hardware.wifi</code></td> 1825<!-- <td></td> --> 1826</tr> 1827<tr> 1828 <td><code>CHANGE_WIFI_STATE</code></td> 1829 <td><code>android.hardware.wifi</code></td> 1830<!-- <td></td> --> 1831</tr> 1832<tr> 1833 <td><code>CHANGE_WIFI_MULTICAST_STATE</code></td> 1834 <td><code>android.hardware.wifi</code></td> 1835<!-- <td></td> --> 1836</tr> 1837</table> 1838