page.title=&lt;uses-feature&gt;
@jd:body

<dl class="xml">

<dt>syntax:</dt>
<dd>
<pre class="stx">&lt;uses-feature android:<a href="#glEsVersion">glEsVersion</a>="<em>integer</em>"
              android:<a href="#name">name</a>="<em>string</em>"
              android:<a href="#required">required</a>=["true" | "false"] /&gt;</pre>
</dd>

<dt>contained in:</dt>
<dd><code><a
href="{@docRoot}guide/topics/manifest/manifest-element.html">&lt;manifest&gt;</a></code></dd>

 <div class="sidebox-wrapper"> 
  <img id="rule" src="{@docRoot}assets/images/grad-rule-qv.png"> 
  <div id="qv-sub-rule"> 
    <img src="{@docRoot}assets/images/icon_market.jpg" style="float:left;margin:0;padding:0;"> 
    <p style="color:#669999;">Android Market and &lt;uses-feature&gt; elements</p> 
    <p>Android Market filters the applications that are visible to users, so
that users can see and download only those applications that are compatible with their
devices. One of the ways Market filters applications is by feature compatibility.</p>

<p style="margin-top:1em;">To do this, Market checks the
<code>&lt;uses-feature&gt;</code> elements in each application's manifest, to
establish the app's feature needs. Market then shows or hides the application to
each user, based on a comparison with the features available on the user's
device. For more information, see <a
href="{@docRoot}guide/appendix/market-filters.html">Market Filters</a>.</p>

<p style="margin-top:1em;">By specifying the features your application requires,
you enable Android Market to present your application only to users whose
devices meet the application's feature requirements, rather than presenting it
to all users. </p>
</div>
</div>

<dt>description:</dt>
<dd>This element declares a specific feature used by the application. Android
provides some features that may not be equally supported by all Android devices.
In a manner similar to the <a
href="uses-sdk-element.html">{@code &lt;uses-sdk>}</a> element, this element
allows an application to specify which device-variable features it uses. For
example, an application might specify that it requires a camera with auto-focus
capabilities.</p>

<p>Declaring a {@code &lt;uses-feature>} element is informational only, meaning
that the Android system itself does not check for matching feature support on
the device before installing an application. However, note that other services
(such as Android Market) or applications may check your application's 
{@code &lt;uses-feature>} declarations as part of handling or interacting 
with your application. For this reason, it's very important that you declare all of
the features (from the list below) that your application uses. </p>

<p>For some features, there may exist a specfic attribute that allows you to define
a version of the feature, such as the version of Open GL used (declared with
<a href="#glEsVersion">{@code glEsVersion}</a>). Other features that either do or do not
exist for a device, such as a camera, are declared using the
<a href="#name">{@code name}</a> attribute.</p>

<p>Any software or hardware features that may vary among Android-powered devices
will be listed on this page among the attributes below. If you see any features
here that you use in your application, you should include a
{@code &lt;uses-feature>} element for each one. For example, if your
application uses the device camera, then you should include the following in
your {@code AndroidManifest.xml}:</p>

<pre>
&lt;uses-feature android:name="android.hardware.camera" />
</pre>

<p>If you declare {@code android.hardware.camera} this way, then your application is considered
compatible with all devices that include a camera. If your application also uses auto-focus
features, then you also need to include a
{@code &lt;uses-feature>} element that declares the {@code android.hardware.camera.autofocus}
feature. Also note that you must still request the {@link android.Manifest.permission#CAMERA
CAMERA} permission. Requesting the permission grants your application access to the
appropriate hardware and software, while declaring the features used by
your application ensures proper device compatibility.</p>

<p>Although the {@code &lt;uses-feature>} element is only activated for devices running 
API Level 4 or higher, it is safe to include this for applications that declare 
a <a href="uses-sdk-element.html#min">{@code minSdkVersion}</a> 
of "3" or lower. Devices running older versions of the platform 
will simply ignore this element, but newer devices will recognize it and enforce 
installation restrictions based on whether the device supports the feature.</p>

<p class="note"><strong>Note:</strong>
For each feature required by your application, you must include a new {@code
&lt;uses-feature>} element. Multiple features cannot be declared in one 
instance of this element.</p>

</dd> 


<dt>attributes:</dt>

<dd>
<dl class="attr">
  <dt><a name="glEsVersion"></a>{@code android:glEsVersion}</dt>
  <dd>The OpenGL ES version required by the application. The higher 16 bits
represent the major number and the lower 16 bits represent the minor number. For
example, to specify OpenGL ES version 2.0, you would set the value as
"0x00020000". To specify OpenGL ES 2.1, if/when such a version were made
available, you would set the value as "0x00020001".

  <p>An application should specify at most one <code>android:glEsVersion</code>
attribute in its manifest. If it specifies more than one, the
<code>android:glEsVersion</code> with the numerically highest value is used and
any other values are ignored.</p>

  <p>If an application does not specify an <code>android:glEsVersion</code>
attribute, then it is assumed that the application requires only OpenGL ES 1.0,
which is supported by all Android-powered devices.</p>

  <p>An application can assume that if a platform supports a given OpenGL ES
version, it also supports all numerically lower OpenGL ES versions. Therefore,
an application that requires both OpenGL ES 1.0 and OpenGL ES 2.0 must specify
that it requires OpenGL ES 2.0.</p>

  <p>An application that can work with any of several OpenGL ES versions should
only specify the numerically lowest version of OpenGL ES that it requires. (It
can check at run-time whether a higher level of OpenGL ES is available.)</p>
  </dd>

  <dt><a name="name"></a>{@code android:name}</dt>
  <dd>The name of a feature required by the application. 
  The value must be one of the following accepted strings:

  <table>
    <tr> 
       <th>Feature</th>
       <th>Attribute Value</th> 
       <th>Description</th> 
    </tr><tr>
       <td rowspan="2">Camera</td>
       <td>{@code android.hardware.camera}</td>
       <td>The application requires a camera.</td> 
    </tr><tr>
       <td colspan="2">
         <strong>Note:</strong> Any application that requests the 
         {@link android.Manifest.permission#CAMERA} permission but does <em>not</em>
         declare any camera features with the {@code &lt;uses-feature>} element will be assumed
         to use all camera features (auto-focus and flash). Thus, the application will not
         be compatible with devices that do not support all camera features. Please use
         {@code &lt;uses-feature>} to declare only the camera features that your
         application does need. For instance, if you request the
         {@link android.Manifest.permission#CAMERA} permission, but you do not need auto-focus or
          flash, then declare only the {@code android.hardware.camera} feature&mdash;the other
          camera features that you do not request will no longer be assumed as required.
       </td>
    </tr><tr>
      <td>Camera auto-focus</td>
      <td>{@code android.hardware.camera.autofocus}</td>
      <td>The application requires a camera with auto-focus capability.
       As a prerequisite, {@code android.hardware.camera} must also be declared
       with a separate {@code &lt;uses-feature>} element.
      </td>
    </tr><tr>
      <td>Camera flash</td>
      <td>{@code android.hardware.camera.flash}</td>
      <td>The application requires a camera with a flash.
        As a prerequisite, both {@code android.hardware.camera} and {@code
        android.hardware.camera.autofocus} must also be declared
        with separate {@code &lt;uses-feature>} elements.
      </td>
    </tr><tr>
      <td>Light sensor</td>
      <td>{@code android.hardware.sensor.light}</td>
      <td>The application requires a device with a light sensor.
      </td>
    </tr><tr>
      <td>Live Wallpaper</td>
      <td>{@code android.software.live_wallpaper}</td>
      <td>The application uses or provides Live Wallpapers and should be installed only on devices that support Live Wallpapers.
      </td>
    </tr><tr>
      <td>Proximity sensor</td>
      <td>{@code android.hardware.sensor.proximity}</td>
      <td>The application requires a device with a proximity sensor.
      </td>
    </tr><tr>
      <td>Multitouch screen</td>
      <td>{@code android.hardware.touchscreen.multitouch}</td>
      <td>The application requires a device that supports multitouch.
      </td>
    </tr><tr>
      <td>Telephony</td>
      <td>{@code android.hardware.telephony}</td>
      <td>The application requires a device that includes a telephony radio with data
         communication services.
      </td>
    </tr><tr>
      <td>CDMA telephony</td>
      <td>{@code android.hardware.telephony.cdma}</td>
      <td>The application requires a device that includes a CDMA telephony radio. As a
        prerequisite, {@code android.hardware.telephony} must also be declared
        with a separate {@code &lt;uses-feature>} element.
      </td>
    </tr><tr>
      <td>GSM telephony</td>
      <td>{@code android.hardware.telephony.gsm}</td>
      <td>The application requires a device that includes a GSM telephony radio. As a
        prerequisite, {@code android.hardware.telephony} must also be declared
        with a separate {@code &lt;uses-feature>} element.
      </td>
    </tr>
  </table>
  </dd>

  <dt><a name="required"></a>{@code android:required}</dt>  <!-- added in api level 5 -->
  <dd>Indicates whether the feature is required by the application. This is
    {@code true} by default. <strong>You should not use this attribute for most cases.</strong>
    </p>

    <p>The only situation in which you should set this attribute {@code false} is when your
    application requests the {@link android.Manifest.permission#CAMERA} permission, but will degrade
    gracefully and perform without failure if the device does not have a camera. In this situation,
    you must declare the {@code android.hardware.camera} feature and set the {@code required}
    attribute {@code false}. This is necessary because the {@link
    android.Manifest.permission#CAMERA} permission will automatically turn on the requirement for
    all camera features. So if your application uses this permission but is still compatible with
    devices without a camera, then you must set the {@code required} attribute {@code false} for
    {@code android.hardware.camera} or else it will not install on devices without a camera. Note
    that, while the permission will enable the requirement for <em>all</em> camera features, you
    only need to off the requirement for the basic camera feature.</p>

  </dd>

</dl>
</dd>

<!-- ##api level indication## -->
<dt>introduced in:</dt>
<dd>API Level 4</dd>

<dt>see also:</dt>
<dd>
  <ul>
    <li>{@link android.content.pm.ConfigurationInfo}</li>
  </ul>
</dd>

</dl>
