• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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>&lt;uses-feature&gt;</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">&lt;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>" /&gt;</pre>
58</dd>
59
60<dt>contained in:</dt>
61<dd><code><a
62href="{@docRoot}guide/topics/manifest/manifest-element.html">&lt;manifest&gt;</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>&lt;uses-feature&gt;</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>&lt;uses-feature&gt;</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>&lt;uses-feature&gt;</code>
84element, so if your application requires multiple features, it would declare
85multiple <code>&lt;uses-feature&gt;</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&lt;uses-feature android:name="android.hardware.bluetooth" />
91&lt;uses-feature android:name="android.hardware.camera" />
92</pre>
93
94<p>In general, you should always make sure to declare
95<code>&lt;uses-feature&gt;</code> elements for all of the features that your
96application requires.</p>
97
98<p>Declared <code>&lt;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>&lt;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>&lt;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>&lt;uses-permission&gt;</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 &mdash; an application declares features in
232<code>&lt;uses-feature&gt;</code> elements in its manifest <br/>with...</li>
233<li>Features available on the device, in hardware or software &mdash;
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>&lt;uses-feature&gt;</code> elements and evaluates them in combination
253with other elements, in some cases, such as <code>&lt;uses-sdk&gt;</code> and
254<code>&lt;uses-permission&gt;</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>&lt;uses-feature&gt;</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>&lt;uses-feature&gt;</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>&lt;uses-feature android:name="android.hardware.camera" android:required="true" /&gt;</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>&lt;uses-feature android:name="android.hardware.camera" android:required="false" /&gt;</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>&lt;uses-feature&gt;</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>&lt;uses-feature&gt;</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>&lt;uses-feature&gt;</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>&lt;uses-feature&gt;</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>&lt;uses-permission&gt;</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>&lt;uses-feature&gt;</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>&lt;uses-feature&gt;</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>&lt;uses-feature&gt;</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>&lt;uses-feature android:name="android.hardware.camera" android:required="false" /&gt;</pre>
369
370<p class="caution">It's important to understand that the permissions that you
371request in <code>&lt;uses-permission&gt;</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>&lt;uses-permission&gt;</code> element, but does not explicitly declare
384the Bluetooth feature in a <code>&lt;uses-feature&gt;</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>&lt;uses-sdk&gt;</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>&lt;uses-feature&gt;</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>&lt;uses-feature&gt;</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>&lt;=4 (or uses-sdk is not declared)</nobr></td>
408<td>&lt;=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>&lt;=4</td>
415<td>&gt;=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>&gt;=5</td>
422<td>&gt;=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>&lt;uses-feature&gt;</code> element.</dt>
433<dd><em>Result:</em> Google Play does not filter the application from any device.</dd>
434</dl>
435
436<pre>&lt;manifest ...>
437    &lt;uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
438    &lt;uses-sdk android:minSdkVersion="3" />
439    ...
440&lt;/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>&lt;manifest ...>
451    &lt;uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
452    &lt;uses-sdk android:minSdkVersion="3" android:targetSdkVersion="5" />
453    ...
454&lt;/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>&lt;manifest ...>
462    &lt;uses-feature android:name="android.hardware.bluetooth" />
463    &lt;uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
464    &lt;uses-sdk android:minSdkVersion="3" android:targetSdkVersion="5" />
465    ...
466&lt;/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>&lt;manifest ...>
476    &lt;uses-feature android:name="android.hardware.bluetooth" android:required="false" />
477    &lt;uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
478    &lt;uses-sdk android:minSdkVersion="3" android:targetSdkVersion="5" />
479    ...
480&lt;/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>&lt;<em>ProjectName</em>&gt;/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>&lt;<em>SDK</em>&gt;/build-tools/&lt;<em>tools version number</em>&gt;</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 &lt;<em>path_to_exported_.apk</em>&gt;</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>&lt;uses-feature&gt;</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>&lt;uses-feature android:name="android.hardware.screen.portrait" /&gt;</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>&lt;uses-feature&gt;</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>&lt;uses-feature&gt;</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>&lt;uses-permission&gt;</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>&lt;uses-feature&gt;</code> elements.
1654</p>
1655
1656<p>
1657  Note that <code>&lt;uses-feature&gt;</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>&lt;uses-feature&gt;</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>&lt;uses-feature&gt;</code> declaration to the manifest file:
1666</p>
1667
1668<pre>&lt;uses-feature android:name="android.hardware.camera" android:required="false" /&gt;</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