Scott Main | 71d4b28 | 2009-08-13 12:45:31 -0700 | [diff] [blame] | 1 | page.title=<uses-feature> |
Joe Fernandez | 33baa5a | 2013-11-14 11:41:19 -0800 | [diff] [blame] | 2 | page.tags=filtering,features,google play filters,permissions |
Scott Main | 71d4b28 | 2009-08-13 12:45:31 -0700 | [diff] [blame] | 3 | @jd:body |
| 4 | |
Scott Main | c0bf19a | 2011-05-06 16:38:02 -0700 | [diff] [blame] | 5 | <div id="qv-wrapper"> |
| 6 | <div id="qv"> |
| 7 | |
| 8 | |
| 9 | <h2>In this document</h2> |
| 10 | <ol> |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 11 | <li><a href="#market-feature-filtering">Google Play and Feature-Based Filtering</a> |
Scott Main | c0bf19a | 2011-05-06 16:38:02 -0700 | [diff] [blame] | 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 | |
Dirk Dougherty | 95b528e | 2010-01-22 16:52:34 -0800 | [diff] [blame] | 30 | <div class="sidebox-wrapper"> |
Dirk Dougherty | 2b286bb | 2012-11-29 17:25:09 -0800 | [diff] [blame] | 31 | <div class="sidebox"> |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 32 | <img src="{@docRoot}assets/images/icon_play.png" style="float:left;margin:0;padding:0;"> |
Dirk Dougherty | 2b286bb | 2012-11-29 17:25:09 -0800 | [diff] [blame] | 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 it's hardware and software feature requirements. </p> |
Dirk Dougherty | 95b528e | 2010-01-22 16:52:34 -0800 | [diff] [blame] | 37 | |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 38 | <p style="margin-top:1em;">By specifying the features that your application requires, |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 39 | you enable Google Play to present your application only to users whose |
Dirk Dougherty | 95b528e | 2010-01-22 16:52:34 -0800 | [diff] [blame] | 40 | devices meet the application's feature requirements, rather than presenting it |
| 41 | to all users. </p> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 42 | |
Dirk Dougherty | 2b286bb | 2012-11-29 17:25:09 -0800 | [diff] [blame] | 43 | <p>For important information about how |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 44 | Google Play uses features as the basis for filtering, please read <a |
| 45 | href="#market-feature-filtering">Google Play and Feature-Based Filtering</a>, |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 46 | below.</p> |
Dirk Dougherty | 95b528e | 2010-01-22 16:52:34 -0800 | [diff] [blame] | 47 | </div> |
| 48 | </div> |
| 49 | |
Dirk Dougherty | 2b286bb | 2012-11-29 17:25:09 -0800 | [diff] [blame] | 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 |
| 62 | href="{@docRoot}guide/topics/manifest/manifest-element.html"><manifest></a></code></dd> |
| 63 | |
Scott Main | 71d4b28 | 2009-08-13 12:45:31 -0700 | [diff] [blame] | 64 | <dt>description:</dt> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 65 | <dd>Declares a single hardware or software feature that is used by the |
| 66 | application. |
Scott Main | 71d4b28 | 2009-08-13 12:45:31 -0700 | [diff] [blame] | 67 | |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 68 | <p>The purpose of a <code><uses-feature></code> declaration is to inform |
| 69 | any external entity of the set of hardware and software features on which your |
| 70 | application depends. The element offers a <code>required</code> attribute that |
| 71 | lets you specify whether your application requires and cannot function without |
| 72 | the declared feature, or whether it prefers to have the feature but can function |
| 73 | without it. Because feature support can vary across Android devices, the |
| 74 | <code><uses-feature></code> element serves an important role in letting an |
| 75 | application describe the device-variable features that it uses.</p> |
| 76 | |
| 77 | <p>The set of available features that your application declares corresponds to |
| 78 | the set of feature constants made available by the Android {@link |
| 79 | android.content.pm.PackageManager}, which are listed for |
| 80 | convenience in the <a href="#features-reference">Features Reference</a> tables |
| 81 | at the bottom of this document. |
| 82 | |
| 83 | <p>You must specify each feature in a separate <code><uses-feature></code> |
| 84 | element, so if your application requires multiple features, it would declare |
| 85 | multiple <code><uses-feature></code> elements. For example, an application |
| 86 | that requires both Bluetooth and camera features in the device would declare |
| 87 | these 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 |
| 96 | application requires.</p> |
| 97 | |
| 98 | <p>Declared <code><uses-feature></code> elements are informational only, meaning |
Dirk Dougherty | 95b528e | 2010-01-22 16:52:34 -0800 | [diff] [blame] | 99 | that the Android system itself does not check for matching feature support on |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 100 | the device before installing an application. However, other services |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 101 | (such as Google Play) or applications may check your application's |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 102 | <code><uses-feature></code> declarations as part of handling or interacting |
Dirk Dougherty | 95b528e | 2010-01-22 16:52:34 -0800 | [diff] [blame] | 103 | with your application. For this reason, it's very important that you declare all of |
| 104 | the features (from the list below) that your application uses. </p> |
Scott Main | c6747d0 | 2009-09-01 14:10:06 -0700 | [diff] [blame] | 105 | |
Scott Main | c351ab4 | 2011-08-05 17:13:46 -0700 | [diff] [blame] | 106 | <p>For some features, there may exist a specific attribute that allows you to define |
Scott Main | c6747d0 | 2009-09-01 14:10:06 -0700 | [diff] [blame] | 107 | a version of the feature, such as the version of Open GL used (declared with |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 108 | <a href="#glEsVersion"><code>glEsVersion</code></a>). Other features that either do or do not |
Scott Main | 0b91635 | 2009-12-17 18:01:04 -0800 | [diff] [blame] | 109 | exist for a device, such as a camera, are declared using the |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 110 | <a href="#name"><code>name</code></a> attribute.</p> |
Scott Main | c6747d0 | 2009-09-01 14:10:06 -0700 | [diff] [blame] | 111 | |
Scott Main | c6747d0 | 2009-09-01 14:10:06 -0700 | [diff] [blame] | 112 | |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 113 | <p>Although the <code><uses-feature></code> element is only activated for |
| 114 | devices running API Level 4 or higher, it is recommended to include these |
| 115 | elements for all applications, even if the <a href="uses-sdk-element.html#min"><code>minSdkVersion</code></a> |
| 116 | is "3" or lower. Devices running older versions of the platform will simply |
| 117 | ignore the element.</p> |
Scott Main | c6747d0 | 2009-09-01 14:10:06 -0700 | [diff] [blame] | 118 | |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 119 | <p class="note"><strong>Note:</strong> When declaring a feature, remember |
| 120 | that you must also request permissions as appropriate. For example, you must |
| 121 | still request the {@link android.Manifest.permission#CAMERA} |
| 122 | permission before your application can access the camera API. Requesting the |
| 123 | permission grants your application access to the appropriate hardware and |
| 124 | software, while declaring the features used by your application ensures proper |
| 125 | device compatibility.</p> |
Scott Main | c6747d0 | 2009-09-01 14:10:06 -0700 | [diff] [blame] | 126 | |
Scott Main | 71d4b28 | 2009-08-13 12:45:31 -0700 | [diff] [blame] | 127 | </dd> |
| 128 | |
| 129 | |
| 130 | <dt>attributes:</dt> |
| 131 | |
| 132 | <dd> |
Scott Main | 0b91635 | 2009-12-17 18:01:04 -0800 | [diff] [blame] | 133 | <dl class="attr"> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 134 | |
| 135 | <dt><a name="name"></a><code>android:name</code></dt> |
| 136 | <dd>Specifies a single hardware or software feature used by the application, |
| 137 | as a descriptor string. Valid descriptor values are listed in the <a |
| 138 | href="#hw-features">Hardware features</a> and <a href="#sw-features">Software |
quddusc | be64abc | 2013-12-20 15:12:58 -0800 | [diff] [blame] | 139 | features</a> tables, below. Descriptor string values are case-sensitive.</dd> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 140 | |
| 141 | <dt><a name="required"></a><code>android:required</code></dt> <!-- added in api level 5 --> |
| 142 | <dd>Boolean value that indicates whether the application requires |
| 143 | the feature specified in <code>android:name</code>. |
| 144 | |
| 145 | <ul> |
| 146 | <li>When you declare <code>"android:required="true"</code> for a feature, |
| 147 | you are specifying that the application <em>cannot function, or is not |
| 148 | designed to function</em>, when the specified feature is not present on the |
| 149 | device. </li> |
| 150 | |
| 151 | <li>When you declare <code>"android:required="false"</code> for a feature, it |
| 152 | means that the application <em>prefers to use the feature</em> if present on |
| 153 | the device, but that it <em>is designed to function without the specified |
| 154 | feature</em>, if necessary. </li> |
| 155 | |
| 156 | </ul> |
| 157 | |
| 158 | <p>The default value for <code>android:required</code> if not declared is |
| 159 | <code>"true"</code>.</p> |
| 160 | </dd> |
| 161 | |
| 162 | <dt><a name="glEsVersion"></a><code>android:glEsVersion</code></dt> |
Dirk Dougherty | 95b528e | 2010-01-22 16:52:34 -0800 | [diff] [blame] | 163 | <dd>The OpenGL ES version required by the application. The higher 16 bits |
| 164 | represent the major number and the lower 16 bits represent the minor number. For |
| 165 | example, to specify OpenGL ES version 2.0, you would set the value as |
Scott Main | 7b60431 | 2013-08-06 13:07:34 -0700 | [diff] [blame] | 166 | "0x00020000", or to specify OpenGL ES 3.0, you would set the value as "0x00030000". |
Dirk Dougherty | 95b528e | 2010-01-22 16:52:34 -0800 | [diff] [blame] | 167 | |
| 168 | <p>An application should specify at most one <code>android:glEsVersion</code> |
| 169 | attribute in its manifest. If it specifies more than one, the |
| 170 | <code>android:glEsVersion</code> with the numerically highest value is used and |
| 171 | any other values are ignored.</p> |
| 172 | |
| 173 | <p>If an application does not specify an <code>android:glEsVersion</code> |
| 174 | attribute, then it is assumed that the application requires only OpenGL ES 1.0, |
| 175 | which is supported by all Android-powered devices.</p> |
| 176 | |
| 177 | <p>An application can assume that if a platform supports a given OpenGL ES |
| 178 | version, it also supports all numerically lower OpenGL ES versions. Therefore, |
| 179 | an application that requires both OpenGL ES 1.0 and OpenGL ES 2.0 must specify |
| 180 | that it requires OpenGL ES 2.0.</p> |
| 181 | |
| 182 | <p>An application that can work with any of several OpenGL ES versions should |
| 183 | only specify the numerically lowest version of OpenGL ES that it requires. (It |
| 184 | can check at run-time whether a higher level of OpenGL ES is available.)</p> |
Scott Main | 7b60431 | 2013-08-06 13:07:34 -0700 | [diff] [blame] | 185 | |
| 186 | <p>For more information about using OpenGL ES, including how to check the supported OpenGL ES |
| 187 | version at runtime, see the <a href="{@docRoot}guide/topics/graphics/opengl.html">OpenGL ES</a> |
| 188 | API guide.</p> |
Scott Main | 71d4b28 | 2009-08-13 12:45:31 -0700 | [diff] [blame] | 189 | </dd> |
Scott Main | 71d4b28 | 2009-08-13 12:45:31 -0700 | [diff] [blame] | 190 | |
Scott Main | 05902f0 | 2009-08-29 14:41:57 -0700 | [diff] [blame] | 191 | </dl> |
| 192 | </dd> |
| 193 | |
Scott Main | 71d4b28 | 2009-08-13 12:45:31 -0700 | [diff] [blame] | 194 | <!-- ##api level indication## --> |
| 195 | <dt>introduced in:</dt> |
| 196 | <dd>API Level 4</dd> |
| 197 | |
| 198 | <dt>see also:</dt> |
| 199 | <dd> |
| 200 | <ul> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 201 | <li>{@link android.content.pm.PackageManager}</li> |
| 202 | <li>{@link android.content.pm.FeatureInfo}</li> |
Scott Main | 71d4b28 | 2009-08-13 12:45:31 -0700 | [diff] [blame] | 203 | <li>{@link android.content.pm.ConfigurationInfo}</li> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 204 | <li><a href="{@docRoot}guide/topics/manifest/uses-permission-element.html"><code><uses-permission></code></a></li> |
Dirk Dougherty | 2b286bb | 2012-11-29 17:25:09 -0800 | [diff] [blame] | 205 | <li><a href="{@docRoot}google/play/filters.html">Filters on Google Play</a></li> |
Scott Main | 71d4b28 | 2009-08-13 12:45:31 -0700 | [diff] [blame] | 206 | </ul> |
| 207 | </dd> |
| 208 | |
| 209 | </dl> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 210 | |
| 211 | |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 212 | <h2 id="market-feature-filtering">Google Play and Feature-Based Filtering</h2> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 213 | |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 214 | <p>Google Play filters the applications that are visible to users, so that |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 215 | users can see and download only those applications that are compatible with |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 216 | their devices. One of the ways it filters applications is by feature |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 217 | compatibility.</p> |
| 218 | |
| 219 | <p>To determine an application's feature compatibility with a given user's |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 220 | device, Google Play compares:</p> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 221 | |
| 222 | <ul> |
| 223 | <li>Features required by the application — an application declares features in |
| 224 | <code><uses-feature></code> elements in its manifest <br/>with...</li> |
| 225 | <li>Features available on the device, in hardware or software — |
| 226 | a device reports the features it supports as read-only system properties.</li> |
| 227 | </ul> |
| 228 | |
| 229 | <p>To ensure an accurate comparison of features, the Android Package Manager |
| 230 | provides a shared set of feature constants that both applications and devices |
| 231 | use to declare feature requirements and support. The available feature constants |
| 232 | are listed in the <a href="#features-reference">Features Reference</a> tables at |
| 233 | the bottom of this document, and in the class documentation for {@link |
| 234 | android.content.pm.PackageManager}.</p> |
| 235 | |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 236 | <p>When the user launches Google Play, the application queries the |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 237 | Package Manager for the list of features available on the device by calling |
| 238 | {@link android.content.pm.PackageManager#getSystemAvailableFeatures()}. The |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 239 | Store application then passes the features list up to Google Play |
| 240 | when establishing the session for the user.</p> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 241 | |
Dirk Dougherty | aca4a77 | 2012-09-04 18:09:08 -0700 | [diff] [blame] | 242 | <p>Each time you upload an application to the Google Play Developer Console, |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 243 | Google Play scans the application's manifest file. It looks for |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 244 | <code><uses-feature></code> elements and evaluates them in combination |
| 245 | with other elements, in some cases, such as <code><uses-sdk></code> and |
| 246 | <code><uses-permission></code> elements. After establishing the |
| 247 | application's set of required features, it stores that list internally as |
| 248 | metadata associated with the application <code>.apk</code> and the application |
| 249 | version. </p> |
| 250 | |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 251 | <p>When a user searches or browses for applications using the Google Play |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 252 | application, the service compares the features needed by each application with |
| 253 | the features available on the user's device. If all of an application's required |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 254 | features are present on the device, Google Play allows the user to see the |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 255 | application and potentially download it. If any required feature is not |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 256 | supported by the device, Google Play filters the application so that it is |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 257 | not visible to the user and not available for download. </p> |
| 258 | |
| 259 | <p>Because the features you declare in <code><uses-feature></code> |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 260 | elements directly affect how Google Play filters your application, it's |
| 261 | important to understand how Google Play evaluates the application's manifest |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 262 | and establishes the set of required features. The sections below provide more |
| 263 | information. </p> |
| 264 | |
| 265 | <h3 id="declared">Filtering based on explicitly declared features</h3> |
| 266 | |
| 267 | <p>An explicitly declared feature is one that your application declares in a |
| 268 | <code><uses-feature></code> element. The feature declaration can include |
| 269 | an <code>android:required=["true" | "false"]</code> attribute (if you are |
| 270 | compiling against API level 5 or higher), which lets you specify whether the |
| 271 | application absolutely requires the feature and cannot function properly without |
| 272 | it (<code>"true"</code>), or whether the application prefers to use the feature |
| 273 | if available, but is designed to run without it (<code>"false"</code>).</p> |
| 274 | |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 275 | <p>Google Play handles explicitly declared features in this way: </p> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 276 | |
| 277 | <ul> |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 278 | <li>If a feature is explicitly declared as being required, Google Play adds |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 279 | the feature to the list of required features for the application. It then |
| 280 | filters the application from users on devices that do not provide that feature. |
| 281 | For example: |
| 282 | <pre><uses-feature android:name="android.hardware.camera" android:required="true" /></pre></li> |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 283 | <li>If a feature is explicitly declared as <em>not</em> being required, Google |
| 284 | Play <em>does not</em> add the feature to the list of required features. For |
Scott Main | c351ab4 | 2011-08-05 17:13:46 -0700 | [diff] [blame] | 285 | that reason, an explicitly declared non-required feature is never considered when |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 286 | filtering the application. Even if the device does not provide the declared |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 287 | feature, Google Play will still consider the application compatible with the |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 288 | device and will show it to the user, unless other filtering rules apply. For |
| 289 | example: |
| 290 | <pre><uses-feature android:name="android.hardware.camera" android:required="false" /></pre></li> |
| 291 | <li>If a feature is explicitly declared, but without an |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 292 | <code>android:required</code> attribute, Google Play assumes that the feature |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 293 | is required and sets up filtering on it. </li> |
| 294 | </ul> |
| 295 | |
| 296 | <p>In general, if your application is designed to run on Android 1.6 and earlier |
| 297 | versions, the <code>android:required</code> attribute is not available in the |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 298 | API and Google Play assumes that any and all |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 299 | <code><uses-feature></code> declarations are required. </p> |
| 300 | |
| 301 | <p class="note"><strong>Note:</strong> By declaring a feature explicitly and |
| 302 | including an <code>android:required="false"</code> attribute, you can |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 303 | effectively disable all filtering on Google Play for the specified feature. |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 304 | </p> |
| 305 | |
| 306 | |
| 307 | <h3 id="implicit">Filtering based on implicit features</h3> |
| 308 | |
| 309 | <p>An <em>implicit</em> feature is one that an application requires in order to |
| 310 | function properly, but which is <em>not</em> declared in a |
| 311 | <code><uses-feature></code> element in the manifest file. Strictly |
| 312 | speaking, every application should <em>always</em> declare all features that it |
| 313 | uses or requires, so the absence of a declaration for a feature used by an |
| 314 | application should be considered an error. However, as a safeguard for users and |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 315 | developers, Google Play looks for implicit features in each application and |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 316 | sets up filters for those features, just as it would do for an explicitly |
| 317 | declared feature. </p> |
| 318 | |
| 319 | <p>An application might require a feature but not declare it because: </p> |
| 320 | |
| 321 | <ul> |
| 322 | <li>The application was compiled against an older version of the Android library |
| 323 | (Android 1.5 or earlier) and the <code><uses-feature></code> element was |
| 324 | not available.</li> |
| 325 | <li>The developer incorrectly assumed that the feature would be present on all |
| 326 | devices and a declaration was unnecessary.</li> |
| 327 | <li>The developer omitted the feature declaration accidentally.</li> |
| 328 | <li>The developer declared the feature explicitly, but the declaration was not |
| 329 | valid. For example, a spelling error in the <code><uses-feature></code> |
| 330 | element name or an unrecognized string value for the |
| 331 | <code>android:name</code> attribute would invalidate the feature declaration. |
| 332 | </li> |
| 333 | </ul> |
| 334 | |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 335 | <p>To account for the cases above, Google Play attempts to discover an |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 336 | application's implied feature requirements by examining <em>other elements</em> |
| 337 | declared in the manifest file, specifically, |
| 338 | <code><uses-permission></code> elements.</p> |
| 339 | |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 340 | <p>If an application requests hardware-related permissions, Google Play |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 341 | <em>assumes that the application uses the underlying hardware features and |
| 342 | therefore requires those features</em>, even though there might be no |
| 343 | corresponding to <code><uses-feature></code> declarations. For such |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 344 | permissions, Google Play adds the underlying hardware features to the |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 345 | metadata that it stores for the application and sets up filters for them.</p> |
| 346 | |
| 347 | <p>For example, if an application requests the <code>CAMERA</code> permission |
| 348 | but does not declare a <code><uses-feature></code> element for |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 349 | <code>android.hardware.camera</code>, Google Play considers that the |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 350 | application requires a camera and should not be shown to users whose devices do |
| 351 | not offer a camera.</p> |
| 352 | |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 353 | <p>If you don't want Google Play to filter based on a specific implied |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 354 | feature, you can disable that behavior. To do so, declare the feature explicitly |
| 355 | in a <code><uses-feature></code> element and include an |
| 356 | <code>android:required="false"</code> attribute. For example, to disable |
| 357 | filtering derived from the <code>CAMERA</code> permission, you would declare |
| 358 | the feature as shown below.</p> |
| 359 | |
| 360 | <pre><uses-feature android:name="android.hardware.camera" android:required="false" /></pre> |
| 361 | |
| 362 | <p class="caution">It's important to understand that the permissions that you |
| 363 | request in <code><uses-permission></code> elements can directly affect how |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 364 | Google Play filters your application. The reference section <a |
Scott Main | e912396 | 2010-12-06 16:19:32 -0800 | [diff] [blame] | 365 | href="#permissions">Permissions that Imply Feature Requirements</a>, |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 366 | below, lists the full set of permissions that imply feature requirements and |
| 367 | therefore trigger filtering.</p> |
| 368 | |
| 369 | <h3 id="bt-permission-handling">Special handling for Bluetooth feature</h3> |
| 370 | |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 371 | <p>Google Play applies slightly different rules than described above, when |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 372 | determining filtering for Bluetooth.</p> |
| 373 | |
| 374 | <p>If an application declares a Bluetooth permission in a |
| 375 | <code><uses-permission></code> element, but does not explicitly declare |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 376 | the Bluetooth feature in a <code><uses-feature></code> element, Google |
| 377 | Play checks the version(s) of the Android platform on which the application is |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 378 | designed to run, as specified in the <code><uses-sdk></code> element. </p> |
| 379 | |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 380 | <p>As shown in the table below, Google Play enables filtering for the |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 381 | Bluetooth feature only if the application declares its lowest or targeted |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 382 | platform as Android 2.0 (API level 5) or higher. However, note that Google |
| 383 | Play applies the normal rules for filtering when the application explicitly |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 384 | declares the Bluetooth feature in a <code><uses-feature></code> element. |
| 385 | </p> |
| 386 | |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 387 | <p class="caption"><strong>Table 1.</strong> How Google Play determines the |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 388 | Bluetooth feature requirement for an application that requests a Bluetooth |
| 389 | permission but does not declare the Bluetooth feature in a |
| 390 | <code><uses-feature></code> element.</p> |
| 391 | |
| 392 | <table style="margin-top:1em;"> |
| 393 | <tr> |
| 394 | <th><nobr>If <code>minSdkVersion</code> is ...</nobr></th> |
| 395 | <th><nobr>or <code>targetSdkVersion</code> is</nobr></th> |
| 396 | <th>Result</th> |
| 397 | </tr> |
| 398 | <tr> |
| 399 | <td><nobr><=4 (or uses-sdk is not declared)</nobr></td> |
| 400 | <td><=4</td> |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 401 | <td>Google Play <em>will not</em> filter the application from any devices |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 402 | based on their reported support for the <code>android.hardware.bluetooth</code> |
| 403 | feature.</td> |
| 404 | </tr> |
| 405 | <tr> |
| 406 | <td><=4</td> |
| 407 | <td>>=5</td> |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 408 | <td rowspan="2">Google Play filters the application from any devices that |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 409 | do not support the <code>android.hardware.bluetooth</code> feature (including |
| 410 | older releases).</td> |
| 411 | </tr> |
| 412 | <tr> |
| 413 | <td>>=5</td> |
| 414 | <td>>=5</td> |
| 415 | </tr> |
| 416 | </table> |
| 417 | |
| 418 | <p>The examples below illustrate the different filtering effects, based on how |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 419 | Google Play handles the Bluetooth feature. </p> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 420 | |
| 421 | <dl> |
| 422 | <dt>In first example, an application that is designed to run on older API levels |
| 423 | declares a Bluetooth permission, but does not declare the Bluetooth feature in a |
| 424 | <code><uses-feature></code> element.</dt> |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 425 | <dd><em>Result:</em> Google Play does not filter the application from any device.</dd> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 426 | </dl> |
| 427 | |
| 428 | <pre><manifest ...> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 429 | <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> |
| 430 | <uses-sdk android:minSdkVersion="3" /> |
Scott Main | b94df62 | 2010-12-02 15:43:02 -0800 | [diff] [blame] | 431 | ... |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 432 | </manifest></pre> |
| 433 | |
| 434 | <dl> |
| 435 | <dt>In the second example, below, the same application also declares a target |
| 436 | API level of "5". </dt> |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 437 | <dd><em>Result:</em> Google Play now assumes that the feature is required and |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 438 | will filter the application from all devices that do not report Bluetooth support, |
| 439 | including devices running older versions of the platform. </dd> |
| 440 | </dl> |
| 441 | |
| 442 | <pre><manifest ...> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 443 | <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> |
| 444 | <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="5" /> |
Scott Main | b94df62 | 2010-12-02 15:43:02 -0800 | [diff] [blame] | 445 | ... |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 446 | </manifest></pre> |
| 447 | |
| 448 | <dl> |
| 449 | <dt>Here the same application now specifically declares the Bluetooth feature.</dt> |
| 450 | <dd><em>Result:</em> Identical to the previous example (filtering is applied).</dd> |
| 451 | </dl> |
| 452 | |
| 453 | <pre><manifest ...> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 454 | <uses-feature android:name="android.hardware.bluetooth" /> |
| 455 | <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> |
| 456 | <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="5" /> |
Scott Main | b94df62 | 2010-12-02 15:43:02 -0800 | [diff] [blame] | 457 | ... |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 458 | </manifest></pre> |
| 459 | |
| 460 | <dl> |
| 461 | <dt>Finally, in the case below, the same application adds an |
| 462 | <code>android:required="false"</code> attribute.</dt> |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 463 | <dd><em>Result:</em> Google Play disables filtering based on Bluetooth |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 464 | feature support, for all devices.</dd> |
| 465 | </dl> |
| 466 | |
| 467 | <pre><manifest ...> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 468 | <uses-feature android:name="android.hardware.bluetooth" android:required="false" /> |
| 469 | <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> |
| 470 | <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="5" /> |
Scott Main | b94df62 | 2010-12-02 15:43:02 -0800 | [diff] [blame] | 471 | ... |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 472 | </manifest></pre> |
| 473 | |
| 474 | |
| 475 | |
Scott Main | c0bf19a | 2011-05-06 16:38:02 -0700 | [diff] [blame] | 476 | <h3 id="testing">Testing the features required by your application</h3> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 477 | |
| 478 | <p>You can use the <code>aapt</code> tool, included in the Android SDK, to |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 479 | determine how Google Play will filter your application, based on its declared |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 480 | features and permissions. To do so, run <code>aapt</code> with the <code>dump |
| 481 | badging</code> command. This causes <code>aapt</code> to parse your |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 482 | application's manifest and apply the same rules as used by Google Play to |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 483 | determine the features that your application requires. </p> |
| 484 | |
| 485 | <p>To use the tool, follow these steps: </p> |
| 486 | |
| 487 | <ol> |
| 488 | <li>First, build and export your application as an unsigned <code>.apk</code>. |
| 489 | If you are developing in Eclipse with ADT, right-click the project and select |
| 490 | <strong>Android Tools</strong> > <strong>Export Unsigned Application |
| 491 | Package</strong>. Select a destination filename and path and click |
| 492 | <strong>OK</strong>. </li> |
| 493 | <li>Next, locate the <code>aapt</code> tool, if it is not already in your PATH. |
Dirk Dougherty | fc1f5e2 | 2010-11-02 19:15:51 -0700 | [diff] [blame] | 494 | If you are using SDK Tools r8 or higher, you can find <code>aapt</code> in the |
| 495 | <code><<em>SDK</em>>/platform-tools/</code> directory. |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 496 | <p class="note"><strong>Note:</strong> You must use the version of |
Dirk Dougherty | fc1f5e2 | 2010-11-02 19:15:51 -0700 | [diff] [blame] | 497 | <code>aapt</code> that is provided for the latest Platform-Tools component available. If |
| 498 | you do not have the latest Platform-Tools component, download it using the <a |
Scott Main | 50e990c | 2012-06-21 17:14:39 -0700 | [diff] [blame] | 499 | href="{@docRoot}sdk/exploring.html">Android SDK Manager</a>. |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 500 | </p></li> |
| 501 | <li>Run <code>aapt</code> using this syntax: </li> |
| 502 | </ol> |
| 503 | |
| 504 | <pre>$ aapt dump badging <<em>path_to_exported_.apk</em>></pre> |
| 505 | |
| 506 | <p>Here's an example of the command output for the second Bluetooth example, above: </p> |
| 507 | |
| 508 | <pre>$ ./aapt dump badging BTExample.apk |
| 509 | package: name='com.example.android.btexample' versionCode='' versionName='' |
| 510 | <strong>uses-permission:'android.permission.BLUETOOTH_ADMIN'</strong> |
| 511 | <strong>uses-feature:'android.hardware.bluetooth'</strong> |
| 512 | sdkVersion:'3' |
| 513 | targetSdkVersion:'5' |
| 514 | application: label='BT Example' icon='res/drawable/app_bt_ex.png' |
| 515 | launchable activity name='com.example.android.btexample.MyActivity'label='' icon='' |
| 516 | uses-feature:'android.hardware.touchscreen' |
| 517 | main |
| 518 | supports-screens: 'small' 'normal' 'large' |
| 519 | locales: '--_--' |
| 520 | densities: '160' |
| 521 | </pre> |
| 522 | |
| 523 | |
| 524 | <h2 id=features-reference>Features Reference</h2> |
| 525 | |
| 526 | <p>The tables below provide reference information about hardware and software |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 527 | features and the permissions that can imply them on Google Play. </p> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 528 | |
| 529 | <h3 id="hw-features">Hardware features</h3> |
| 530 | |
| 531 | <p>The table below describes the hardware feature descriptors supported by the |
| 532 | most current platform release. To signal that your application uses or requires |
| 533 | a hardware feature, declare each value in a <code>android:name</code> attribute |
| 534 | in a separate <code><uses-feature></code> element. </p> |
| 535 | |
| 536 | <table> |
| 537 | <tr> |
| 538 | <th>Feature Type</th> |
| 539 | <th>Feature Descriptor</th> |
Scott Main | c0bf19a | 2011-05-06 16:38:02 -0700 | [diff] [blame] | 540 | <th style="min-width:170px">Description</th> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 541 | <th>Comments</th> |
| 542 | </tr> |
| 543 | <tr> |
Dirk Dougherty | fc1f5e2 | 2010-11-02 19:15:51 -0700 | [diff] [blame] | 544 | <td>Audio</td> |
| 545 | <td><code>android.hardware.audio.low_latency</td> |
| 546 | <td>The application uses a low-latency audio pipeline on the device and |
| 547 | is sensitive to delays or lag in sound input or output.</td> |
| 548 | <td> |
| 549 | </td> |
| 550 | </tr> |
| 551 | <tr> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 552 | <td>Bluetooth</td> |
| 553 | <td><code>android.hardware.bluetooth</td> |
| 554 | <td>The application uses Bluetooth radio features in the device.</td> |
Scott Main | d608d5e | 2013-08-26 12:31:09 -0700 | [diff] [blame] | 555 | <td>If your app uses Bluetooth Low Energy, also declare |
| 556 | {@code android.software.bluetooth_le}.</td> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 557 | </tr> |
| 558 | <tr> |
Eino-Ville Talvala | 72b4db1 | 2012-09-18 15:03:27 -0700 | [diff] [blame] | 559 | <td rowspan="5">Camera</td> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 560 | <td><code>android.hardware.camera</code></td> |
| 561 | <td>The application uses the device's camera. If the device supports |
| 562 | multiple cameras, the application uses the camera that facing |
| 563 | away from the screen.</td> |
| 564 | <td></td> |
| 565 | </tr> |
| 566 | <tr> |
| 567 | <td><code>android.hardware.camera.autofocus</code></td> |
| 568 | <td>Subfeature. The application uses the device camera's autofocus capability.</td> |
Scott Main | c0bf19a | 2011-05-06 16:38:02 -0700 | [diff] [blame] | 569 | <td rowspan="3">These subfeatures implicitly declare the |
| 570 | <code>android.hardware.camera</code> parent feature, unless declared with |
| 571 | <code>android:required="false"</code>.</td> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 572 | </tr> |
| 573 | <tr> |
| 574 | <td><code>android.hardware.camera.flash</code></td> |
| 575 | <td>Subfeature. The application uses the device camera's flash.</td> |
| 576 | </tr> |
Dirk Dougherty | fc1f5e2 | 2010-11-02 19:15:51 -0700 | [diff] [blame] | 577 | <tr> |
| 578 | <td><code>android.hardware.camera.front</code></td> |
| 579 | <td>Subfeature. The application uses a front-facing camera on the device.</td> |
| 580 | </tr> |
Eino-Ville Talvala | 72b4db1 | 2012-09-18 15:03:27 -0700 | [diff] [blame] | 581 | <tr> |
| 582 | <td><code>android.hardware.camera.any</code></td> |
| 583 | <td>The application uses at least one camera facing in any direction. Use this |
| 584 | in preference to <code>android.hardware.camera</code> if a back-facing camera is |
| 585 | not required.</td> |
| 586 | </tr> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 587 | |
| 588 | <tr> |
| 589 | <td rowspan="3">Location</td> |
| 590 | <td><code>android.hardware.location</code></td> |
| 591 | <td>The application uses one or more features on the device for determining |
| 592 | location, such as GPS location, network location, or cell location.</td> |
| 593 | <td></td> |
| 594 | </tr> |
| 595 | <tr> |
| 596 | <td><code>android.hardware.location.network</code></td> |
| 597 | <td>Subfeature. The application uses coarse location coordinates obtained from |
| 598 | a network-based geolocation system supported on the device.</td> |
Scott Main | c0bf19a | 2011-05-06 16:38:02 -0700 | [diff] [blame] | 599 | <td rowspan="2">These subfeatures implicitly declare the |
| 600 | <code>android.hardware.location</code> parent feature, unless declared with |
| 601 | <code>android:required="false"</code>. </td> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 602 | </tr> |
| 603 | <tr> |
| 604 | <td><code>android.hardware.location.gps</code></td> |
| 605 | <td>Subfeature. The application uses precise location coordinates obtained |
| 606 | from a Global Positioning System receiver on the device. </td> |
| 607 | </tr> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 608 | <tr> |
Dirk Dougherty | fc1f5e2 | 2010-11-02 19:15:51 -0700 | [diff] [blame] | 609 | <td>Microphone</td> |
| 610 | <td><code>android.hardware.microphone</code></td> |
| 611 | <td>The application uses a microphone on the device. |
| 612 | </td> |
| 613 | <td></td> |
| 614 | </tr> |
| 615 | <tr> |
Scott Main | c0bf19a | 2011-05-06 16:38:02 -0700 | [diff] [blame] | 616 | <td>NFC</td> |
Dirk Dougherty | fc1f5e2 | 2010-11-02 19:15:51 -0700 | [diff] [blame] | 617 | <td><code>android.hardware.nfc</td> |
Scott Main | c0bf19a | 2011-05-06 16:38:02 -0700 | [diff] [blame] | 618 | <td>The application uses Near Field Communications radio features in the device.</td> |
Dirk Dougherty | fc1f5e2 | 2010-11-02 19:15:51 -0700 | [diff] [blame] | 619 | <td></td> |
| 620 | </tr> |
| 621 | <tr> |
| 622 | <td rowspan="6">Sensors</td> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 623 | <td><code>android.hardware.sensor.accelerometer</code></td> |
| 624 | <td>The application uses motion readings from an accelerometer on the |
| 625 | device.</td> |
| 626 | <td></td> |
| 627 | </tr> |
| 628 | <tr> |
Dirk Dougherty | fc1f5e2 | 2010-11-02 19:15:51 -0700 | [diff] [blame] | 629 | <td><code>android.hardware.sensor.barometer</code></td> |
| 630 | <td>The application uses the device's barometer.</td> |
| 631 | <td></td> |
| 632 | </tr> |
| 633 | <tr> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 634 | <td><code>android.hardware.sensor.compass</code></td> |
| 635 | <td>The application uses directional readings from a magnetometer (compass) on |
| 636 | the device.</td> |
| 637 | <td></td> |
| 638 | </tr> |
| 639 | <tr> |
Dirk Dougherty | fc1f5e2 | 2010-11-02 19:15:51 -0700 | [diff] [blame] | 640 | <td><code>android.hardware.sensor.gyroscope</code></td> |
| 641 | <td>The application uses the device's gyroscope sensor.</td> |
| 642 | <td></td> |
| 643 | </tr> |
| 644 | <tr> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 645 | <td><code>android.hardware.sensor.light</code></td> |
| 646 | <td>The application uses the device's light sensor.</td> |
| 647 | <td></td> |
| 648 | </tr> |
| 649 | <tr> |
| 650 | <td><code>android.hardware.sensor.proximity</code></td> |
| 651 | <td>The application uses the device's proximity sensor.</td> |
| 652 | <td></td> |
| 653 | </tr> |
Scott Main | c351ab4 | 2011-08-05 17:13:46 -0700 | [diff] [blame] | 654 | |
| 655 | <tr> |
| 656 | <td rowspan="2">Screen</td> |
| 657 | <td><code>android.hardware.screen.landscape</code></td> |
| 658 | <td>The application requires landscape orientation.</td> |
| 659 | <td rowspan="2"> |
| 660 | <p>For example, if your app requires portrait orientation, you should declare |
| 661 | <code><uses-feature android:name="android.hardware.screen.portrait"/></code> so that only devices |
| 662 | that support portrait orientation (whether always or by user choice) can install your app. If your |
| 663 | application <em>supports</em> both orientations, then you don't need to declare either.</p> |
| 664 | <p>Both orientations are assumed <em>not required</em>, by default, so your app may be installed |
| 665 | on devices that support one or both orientations. However, if any of your activities request that |
| 666 | they run in a specific orientation, using the <a |
| 667 | href="{@docRoot}guide/topics/manifest/activity-element.html#screen">{@code |
| 668 | android:screenOrientation}</a> attribute, then this also declares that the application requires that |
| 669 | orientation. For example, if you declare <a |
| 670 | href="{@docRoot}guide/topics/manifest/activity-element.html#screen">{@code |
| 671 | android:screenOrientation}</a> with either {@code "landscape"}, {@code "reverseLandscape"}, or |
| 672 | {@code "sensorLandscape"}, then your application will be available only to devices that support |
| 673 | landscape orientation. As a best practice, you should still declare your requirement for this |
| 674 | orientation using a {@code <uses-feature>} element. If you declare an orientation for your |
| 675 | activity using <a href="{@docRoot}guide/topics/manifest/activity-element.html#screen">{@code |
| 676 | android:screenOrientation}</a>, but don't actually <em>require</em> it, you can disable the |
| 677 | requirement by declaring the orientation with a {@code <uses-feature>} element and include |
| 678 | {@code android:required="false"}.</p> |
| 679 | <p>For backwards compatibility, any device running a platform version that supports only API |
| 680 | level 12 or lower is assumed to support both landscape and portrait.</p> |
| 681 | </td> |
| 682 | </tr> |
| 683 | <tr> |
| 684 | <td><code>android.hardware.screen.portrait</code></td> |
| 685 | <td>The application requires portrait orientation.</td> |
| 686 | </tr> |
| 687 | |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 688 | <tr> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 689 | <td rowspan="3">Telephony</td> |
| 690 | <td><code>android.hardware.telephony</code></td> |
| 691 | <td>The application uses telephony features on the device, such as telephony |
| 692 | radio with data communication services.</td> |
| 693 | <td></td> |
| 694 | </tr> |
| 695 | <tr> |
| 696 | <td><code>android.hardware.telephony.cdma</code></td> |
| 697 | <td>Subfeature. The application uses CDMA telephony radio features on the |
| 698 | device. </td> |
Scott Main | c0bf19a | 2011-05-06 16:38:02 -0700 | [diff] [blame] | 699 | <td rowspan="2">These subfeatures implicitly declare the |
| 700 | <code>android.hardware.telephony</code> parent feature, unless declared with |
| 701 | <code>android:required="false"</code>. </td> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 702 | </tr> |
| 703 | <tr> |
| 704 | <td><code>android.hardware.telephony.gsm</code></td> |
| 705 | <td>Subfeature. The application uses GSM telephony radio features on the |
| 706 | device.</td> |
| 707 | </tr> |
| 708 | |
| 709 | <tr> |
Scott Main | 60dd520 | 2012-06-23 00:01:22 -0700 | [diff] [blame] | 710 | <td>Television</td> |
| 711 | <td><code>android.hardware.type.television</code></td> |
| 712 | <td>The application is designed for a television user experience.</td> |
Scott Main | e30d31c | 2013-01-07 15:54:30 -0800 | [diff] [blame] | 713 | <td>This feature defines "television" to be a typical living room television experience: |
Scott Main | 60dd520 | 2012-06-23 00:01:22 -0700 | [diff] [blame] | 714 | displayed on a big screen, where the user is sitting far away and the dominant form of |
Scott Main | e30d31c | 2013-01-07 15:54:30 -0800 | [diff] [blame] | 715 | input is something like a d-pad, and generally not through touch or a |
Scott Main | 60dd520 | 2012-06-23 00:01:22 -0700 | [diff] [blame] | 716 | mouse/pointer-device.</td> |
| 717 | </tr> |
| 718 | |
| 719 | <tr> |
Scott Main | c351ab4 | 2011-08-05 17:13:46 -0700 | [diff] [blame] | 720 | <td rowspan="7">Touchscreen</td> |
Scott Main | 6209b62 | 2011-02-14 12:09:50 -0800 | [diff] [blame] | 721 | <td><code>android.hardware.faketouch</code></td> |
| 722 | <td>The application uses basic touch interaction events, such as "click down", "click |
| 723 | up", and drag.</td> |
Scott Main | c351ab4 | 2011-08-05 17:13:46 -0700 | [diff] [blame] | 724 | <td><p>When declared as required, this indicates that the application is compatible with a device |
| 725 | only if it offers an emulated touchscreen ("fake touch" interface), or better. A device that offers |
| 726 | a fake touch interface provides a user input system that emulates a subset of touchscreen |
| 727 | capabilities. For example, a mouse or remote control that drives an on-screen cursor provides a fake |
| 728 | touch interface. If your application requires basic point and click interaction (in other |
| 729 | words, it won't work with <em>only</em> a d-pad controller), you should declare this feature. |
| 730 | Because this is the minimum level of touch interaction, your app will also be compatible with |
| 731 | devices that offer more complex touch interfaces.</p> |
Scott Main | e3373ff | 2011-08-04 14:09:34 -0700 | [diff] [blame] | 732 | <p class="note"><strong>Note:</strong> Because applications require the {@code |
| 733 | android.hardware.touchscreen} feature by default, if you want your application to be available to |
| 734 | devices that provide a fake touch interface, you must also explicitly declare that a touch screen is |
| 735 | <em>not</em> required by declaring {@code <uses-feature |
| 736 | android:name="android.hardware.touchscreen" <strong>android:required="false"</strong> |
| 737 | />}</p></td> |
Scott Main | 6209b62 | 2011-02-14 12:09:50 -0800 | [diff] [blame] | 738 | </tr> |
Scott Main | c351ab4 | 2011-08-05 17:13:46 -0700 | [diff] [blame] | 739 | |
| 740 | <tr> |
| 741 | <td><code>android.hardware.faketouch.multitouch.distinct</code></td> |
| 742 | <td>The application performs distinct tracking of two or more "fingers" on a fake touch |
| 743 | interface. This is a superset of the faketouch feature.</td> |
| 744 | <td><p>When declared as required, this indicates that the application is compatible with a device |
| 745 | only if it supports touch emulation for events that supports distinct tracking of two or more |
| 746 | fingers, or better.</p> |
| 747 | <p>Unlike the distinct multitouch defined by {@code |
| 748 | android.hardware.touchscreen.multitouch.distinct}, input devices that support distinct multi-touch |
| 749 | with a fake touch interface will not support all two-finger gestures, because the input is |
| 750 | being transformed to cursor movement on the screen. That is, single finger gestures on such a device |
| 751 | move a cursor; two-finger swipes will result in single-finger touch events; other two-finger |
| 752 | gestures will result in the corresponding two-finger touch event. An example device that supports |
| 753 | distinct multi-touch with a fake touch interface is one that provides a trackpad for cursor movement |
| 754 | which also supports two or more fingers.</p></td> |
| 755 | </tr> |
| 756 | |
| 757 | <tr> |
| 758 | <td><code>android.hardware.faketouch.multitouch.jazzhand</code></td> |
| 759 | <td>The application performs distinct tracking of five or more "fingers" on a fake touch |
| 760 | interface. This is a superset of the faketouch feature.</td> |
| 761 | <td><p>When declared as required, this indicates that the application is compatible with a device |
| 762 | only if it supports touch emulation for events that supports distinct tracking of five or more |
| 763 | fingers.</p> |
| 764 | <p>Unlike the distinct multitouch defined by {@code |
| 765 | android.hardware.touchscreen.multitouch.jazzhand}, input devices that support jazzhand multi-touch |
| 766 | with a fake touch interface will not support all five-finger gestures, because the input is being |
| 767 | transformed to cursor movement on the screen. That is, single finger gestures on such a device move |
| 768 | a cursor; multi-finger gestures will result in single-finger touch events; other multi-finger |
| 769 | gestures will result in the corresponding multi-finger touch event. An example device that supports |
| 770 | distinct multi-touch with a fake touch interface is one that provides a trackpad for cursor movement |
| 771 | which also supports five or more fingers.</p></td> |
| 772 | </tr> |
| 773 | |
Scott Main | 6209b62 | 2011-02-14 12:09:50 -0800 | [diff] [blame] | 774 | <tr> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 775 | <td><code>android.hardware.touchscreen</code></td> |
Scott Main | e3373ff | 2011-08-04 14:09:34 -0700 | [diff] [blame] | 776 | <td>The application uses touchscreen capabilities for gestures that are more interactive |
Scott Main | c351ab4 | 2011-08-05 17:13:46 -0700 | [diff] [blame] | 777 | than basic touch events, such as a fling. This is a superset of the basic faketouch feature.</td> |
| 778 | <td><p>By default, your application requires this. As such, your application is <em>not</em> |
| 779 | available to devices that provide only an emulated touch interface ("fake touch"), by default. If |
| 780 | you want your application available to devices that provide a fake touch interface (or even devices |
| 781 | that provide only a d-pad controller), you must explicitly declare that a touch screen is not |
| 782 | required, by declaring {@code android.hardware.touchscreen} with {@code android:required="false"}. |
| 783 | You should do so even if your application uses—but does not <em>require</em>—a real |
| 784 | touch screen interface.</p> |
| 785 | <p>If your application <em>does require</em> a touch interface (in order to perform touch |
Scott Main | e3373ff | 2011-08-04 14:09:34 -0700 | [diff] [blame] | 786 | gestures such as a fling), then you don't need to do anything, because this is required by default. |
| 787 | However, it's best if you explicitly declare all features used by your application, so you should |
| 788 | still declare this if your app uses it.</p> |
| 789 | <p>If you require more complex touch interaction, such as multi-finger gestures, you |
| 790 | should declare the advanced touch screen features below.</p></td> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 791 | </tr> |
| 792 | <tr> |
| 793 | <td><code>android.hardware.touchscreen.multitouch</code></td> |
Scott Main | 6209b62 | 2011-02-14 12:09:50 -0800 | [diff] [blame] | 794 | <td>The application uses basic two-point multitouch capabilities on the device |
| 795 | screen, such as for pinch gestures, but does not need to track touches independently. This |
Scott Main | c351ab4 | 2011-08-05 17:13:46 -0700 | [diff] [blame] | 796 | is a superset of touchscreen feature.</td> |
Scott Main | c0bf19a | 2011-05-06 16:38:02 -0700 | [diff] [blame] | 797 | <td>This implicitly declares the <code>android.hardware.touchscreen</code> parent feature, unless |
| 798 | declared with <code>android:required="false"</code>. </td> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 799 | </tr> |
| 800 | <tr> |
| 801 | <td><code>android.hardware.touchscreen.multitouch.distinct</code></td> |
| 802 | <td>Subfeature. The application uses advanced multipoint multitouch |
| 803 | capabilities on the device screen, such as for tracking two or more points fully |
Scott Main | c351ab4 | 2011-08-05 17:13:46 -0700 | [diff] [blame] | 804 | independently. This is a superset of multitouch feature.</td> |
Scott Main | c0bf19a | 2011-05-06 16:38:02 -0700 | [diff] [blame] | 805 | <td rowspan="2">This implicitly declares the <code>android.hardware.touchscreen.multitouch</code> |
| 806 | parent feature, unless declared with <code>android:required="false"</code>. </td> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 807 | </tr> |
Dirk Dougherty | fc1f5e2 | 2010-11-02 19:15:51 -0700 | [diff] [blame] | 808 | <tr> |
| 809 | <td><code>android.hardware.touchscreen.multitouch.jazzhand</code></td> |
Scott Main | 6209b62 | 2011-02-14 12:09:50 -0800 | [diff] [blame] | 810 | <td>The application uses advanced multipoint multitouch |
Dirk Dougherty | fc1f5e2 | 2010-11-02 19:15:51 -0700 | [diff] [blame] | 811 | capabilities on the device screen, for tracking up to five points fully |
Scott Main | c351ab4 | 2011-08-05 17:13:46 -0700 | [diff] [blame] | 812 | independently. This is a superset of distinct multitouch feature.</td> |
Dirk Dougherty | fc1f5e2 | 2010-11-02 19:15:51 -0700 | [diff] [blame] | 813 | </tr> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 814 | |
| 815 | <tr> |
Scott Main | c0bf19a | 2011-05-06 16:38:02 -0700 | [diff] [blame] | 816 | <td rowspan="2">USB</td> |
| 817 | <td><code>android.hardware.usb.host</code></td> |
| 818 | <td>The application uses USB host mode features (behaves as the host and connects to USB |
| 819 | devices).</td> |
| 820 | <td></td> |
| 821 | </tr> |
| 822 | |
| 823 | <tr> |
| 824 | <td><code>android.hardware.usb.accessory</code></td> |
| 825 | <td>The application uses USB accessory features (behaves as the USB device and connects to USB |
| 826 | hosts).</td> |
| 827 | <td></td> |
| 828 | </tr> |
| 829 | |
| 830 | <tr> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 831 | <td>Wifi</td> |
| 832 | <td><code>android.hardware.wifi</code></td> |
| 833 | <td>The application uses 802.11 networking (wifi) features on the device.</td> |
| 834 | <td></td> |
| 835 | </tr> |
| 836 | |
| 837 | </table> |
| 838 | |
| 839 | <h3 id="sw-features">Software features</h3> |
| 840 | |
| 841 | <p>The table below describes the software feature descriptors supported by the |
| 842 | most current platform release. To signal that your application uses or requires |
| 843 | a software feature, declare each value in a <code>android:name</code> attribute |
| 844 | in a separate <code><uses-feature></code> element. </p> |
| 845 | |
| 846 | |
| 847 | <table> |
Dirk Dougherty | 50f8445 | 2010-11-11 11:52:05 -0800 | [diff] [blame] | 848 | <tr> |
| 849 | <th>Feature</th> |
| 850 | <th>Attribute Value</th> |
| 851 | <th>Description</th> |
Scott Main | d608d5e | 2013-08-26 12:31:09 -0700 | [diff] [blame] | 852 | </tr> |
| 853 | <tr> |
| 854 | <td>App Widgets</td> |
| 855 | <td><code>android.software.app_widgets</code></td> |
| 856 | <td>The application uses or provides App Widgets and should be installed only on devices |
| 857 | that include a Home screen or similar location where users can embed App Widgets.</td> |
| 858 | </tr> |
| 859 | <tr> |
| 860 | <td>Bluetooth Low Energy</td> |
| 861 | <td><code>android.software.bluetooth_le</code></td> |
| 862 | <td><p>The application uses Bluetooth Low Energy APIs and should be installed only on devices |
| 863 | that are capable of communicating with other devices via Bluetooth Low Energy. |
| 864 | <p>This implicitly also declares the {@code android.hardware.bluetooth} feature.</td> |
| 865 | </tr> |
| 866 | <tr> |
| 867 | <td>Home Screen</td> |
| 868 | <td><code>android.software.home_screen</code></td> |
| 869 | <td>The application behaves as a Home screen replacement and should be installed only on |
| 870 | devices that support third-party Home screen apps.</td> |
| 871 | </tr> |
| 872 | <tr> |
| 873 | <td>Input Method</td> |
| 874 | <td><code>android.software.input_methods</code></td> |
| 875 | <td>The application provides a custom input method and should be installed only on devices that |
| 876 | support third-party input methods.</td> |
Dirk Dougherty | 50f8445 | 2010-11-11 11:52:05 -0800 | [diff] [blame] | 877 | </tr> |
| 878 | <tr> |
| 879 | <td>Live Wallpaper</td> |
| 880 | <td><code>android.software.live_wallpaper</code></td> |
Scott Main | d608d5e | 2013-08-26 12:31:09 -0700 | [diff] [blame] | 881 | <td>The application uses or provides Live Wallpapers and should be installed only on devices that |
| 882 | support Live Wallpapers.</td> |
Dirk Dougherty | 50f8445 | 2010-11-11 11:52:05 -0800 | [diff] [blame] | 883 | </tr> |
| 884 | <tr> |
| 885 | <td rowspan="2">SIP/VOIP</td> |
| 886 | <td><code>android.software.sip</code></td> |
Scott Main | d608d5e | 2013-08-26 12:31:09 -0700 | [diff] [blame] | 887 | <td>The application uses SIP service on the device and should be installed only on devices that |
| 888 | support SIP. |
Dirk Dougherty | 50f8445 | 2010-11-11 11:52:05 -0800 | [diff] [blame] | 889 | </td> |
Dirk Dougherty | 50f8445 | 2010-11-11 11:52:05 -0800 | [diff] [blame] | 890 | </tr> |
| 891 | <tr> |
| 892 | <td><code>android.software.sip.voip</code></td> |
Scott Main | d608d5e | 2013-08-26 12:31:09 -0700 | [diff] [blame] | 893 | <td><p>Subfeature. The application uses SIP-based VOIP service on the device. |
| 894 | <p>This subfeature implicitly declares the <code>android.software.sip</code> parent feature, |
Scott Main | c0bf19a | 2011-05-06 16:38:02 -0700 | [diff] [blame] | 895 | unless declared with <code>android:required="false"</code>.</td> |
Dirk Dougherty | 50f8445 | 2010-11-11 11:52:05 -0800 | [diff] [blame] | 896 | </tr> |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 897 | </table> |
| 898 | |
| 899 | |
| 900 | <h3 id="permissions">Permissions that Imply Feature Requirements</h3> |
| 901 | |
| 902 | <p>Some feature constants listed in the tables above were made available to |
| 903 | applications <em>after</em> the corresponding API; for example, the |
| 904 | <code>android.hardware.bluetooth</code> feature was added in Android 2.2 (API |
| 905 | level 8), but the bluetooth API that it refers to was added in Android 2.0 (API |
| 906 | level 5). Because of this, some apps were able to use the API before they had |
| 907 | the ability to declare that they require the API via the |
| 908 | <code><uses-feature></code> system. </p> |
| 909 | |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 910 | <p>To prevent those apps from being made available unintentionally, Google |
| 911 | Play assumes that certain hardware-related permissions indicate that the |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 912 | underlying hardware features are required by default. For instance, applications |
| 913 | that use Bluetooth must request the <code>BLUETOOTH</code> permission in a |
Dirk Dougherty | 4d7bc655 | 2012-01-27 17:56:49 -0800 | [diff] [blame] | 914 | <code><uses-permission></code> element — for legacy apps, Google |
| 915 | Play assumes that the permission declaration means that the underlying |
Dirk Dougherty | f1e134b | 2010-07-28 08:19:45 -0700 | [diff] [blame] | 916 | <code>android.hardware.bluetooth</code> feature is required by the application |
| 917 | and sets up filtering based on that feature. </p> |
| 918 | |
| 919 | <p>The table below lists permissions that imply feature requirements |
| 920 | equivalent to those declared in <code><uses-feature></code> elements. Note |
| 921 | that <code><uses-feature></code> declarations, including any declared |
| 922 | <code>android:required</code> attribute, always take precedence over features |
| 923 | implied by the permissions below. </p> |
| 924 | |
| 925 | <p>For any of the permissions below, you can disable filtering based on the |
| 926 | implied feature by explicitly declaring the implied feature explicitly, in a |
| 927 | <code><uses-feature></code> element, with an |
| 928 | <code>android:required="false"</code> attribute. For example, to disable any |
| 929 | filtering based on the <code>CAMERA</code> permission, you would add this |
| 930 | <code><uses-feature></code> declaration to the manifest file:</p> |
| 931 | |
| 932 | <pre><uses-feature android:name="android.hardware.camera" android:required="false" /></pre> |
| 933 | |
| 934 | <table id="permissions-features" > |
| 935 | <tr> |
| 936 | <th>Category</th> |
| 937 | <th>This Permission...</th> |
| 938 | <th>Implies This Feature Requirement</th> |
| 939 | <!-- <th>Comments</th> --> |
| 940 | </tr> |
| 941 | |
| 942 | |
| 943 | <tr> |
| 944 | <td rowspan="2">Bluetooth</td> |
| 945 | <td><code>BLUETOOTH</code></td> |
| 946 | <td><code>android.hardware.bluetooth</code> |
| 947 | <p>(See <a href="#bt-permission-handling">Special handling for Bluetooth feature</a> for details.)</p></td> |
| 948 | <!-- <td></td> --> |
| 949 | </tr> |
| 950 | <tr> |
| 951 | <td><code>BLUETOOTH_ADMIN</code></td> |
| 952 | <td><code>android.hardware.bluetooth</code></td> |
| 953 | <!-- <td></td> --> |
| 954 | </tr> |
| 955 | |
| 956 | <tr> |
| 957 | <td>Camera</td> |
| 958 | <td><code>CAMERA</code></td> |
| 959 | <td><code>android.hardware.camera</code> <em>and</em> |
| 960 | <br><code>android.hardware.camera.autofocus</code></td> |
| 961 | <!-- <td></td> --> |
| 962 | </tr> |
| 963 | |
| 964 | <tr> |
| 965 | <td rowspan="5">Location</td> |
| 966 | <td><code>ACCESS_MOCK_LOCATION</code></td> |
| 967 | <td><code>android.hardware.location</code></td> |
| 968 | <!-- <td></td> --> |
| 969 | </tr> |
| 970 | <tr> |
| 971 | <td><code>ACCESS_LOCATION_EXTRA_COMMANDS</code></td> |
| 972 | <td><code>android.hardware.location</code></td> |
| 973 | <!-- <td></td> --> |
| 974 | </tr> |
| 975 | <tr> |
| 976 | <td><code>INSTALL_LOCATION_PROVIDER</code></td> |
| 977 | <td><code>android.hardware.location</code></td> |
| 978 | <!-- <td></td> --> |
| 979 | </tr> |
| 980 | <tr> |
| 981 | <td><code>ACCESS_COARSE_LOCATION</code></td> |
| 982 | <td><code>android.hardware.location.network</code> <em>and</em> |
| 983 | <br><code>android.hardware.location</code></td> |
| 984 | <!-- <td></td> --> |
| 985 | </tr> |
| 986 | <tr> |
| 987 | <td><code>ACCESS_FINE_LOCATION</code></td> |
| 988 | <td><code>android.hardware.location.gps</code> <em>and</em> |
| 989 | <br><code>android.hardware.location</code></td> |
| 990 | <!-- <td></td> --> |
| 991 | </tr> |
| 992 | |
| 993 | <tr> |
| 994 | <td>Microphone</td> |
| 995 | <td><code>RECORD_AUDIO</code></td> |
| 996 | <td><code>android.hardware.microphone</code></td> |
| 997 | <!-- <td></td> --> |
| 998 | </tr> |
| 999 | |
| 1000 | <tr> |
| 1001 | <td rowspan="11">Telephony</td> |
| 1002 | <td><code>CALL_PHONE</code></td> |
| 1003 | <td><code>android.hardware.telephony</code></td> |
| 1004 | <!-- <td></td> --> |
| 1005 | </tr> |
| 1006 | <tr> |
| 1007 | <td><code>CALL_PRIVILEGED</code></td> |
| 1008 | <td><code>android.hardware.telephony</code></td> |
| 1009 | <!-- <td></td> --> |
| 1010 | </tr> |
| 1011 | |
| 1012 | <tr> |
| 1013 | <td><code>MODIFY_PHONE_STATE</code></td> |
| 1014 | <td><code>android.hardware.telephony</code></td> |
| 1015 | <!-- <td></td> --> |
| 1016 | </tr> |
| 1017 | <tr> |
| 1018 | <td><code>PROCESS_OUTGOING_CALLS</code></td> |
| 1019 | <td><code>android.hardware.telephony</code></td> |
| 1020 | <!-- <td></td> --> |
| 1021 | </tr> |
| 1022 | <tr> |
| 1023 | <td><code>READ_SMS</code></td> |
| 1024 | <td><code>android.hardware.telephony</code></td> |
| 1025 | <!-- <td></td> --> |
| 1026 | </tr> |
| 1027 | <tr> |
| 1028 | <td><code>RECEIVE_SMS</code></td> |
| 1029 | <td><code>android.hardware.telephony</code></td> |
| 1030 | <!-- <td></td> --> |
| 1031 | </tr> |
| 1032 | <tr> |
| 1033 | <td><code>RECEIVE_MMS</code></td> |
| 1034 | <td><code>android.hardware.telephony</code></td> |
| 1035 | <!-- <td></td> --> |
| 1036 | </tr> |
| 1037 | <tr> |
| 1038 | <td><code>RECEIVE_WAP_PUSH</code></td> |
| 1039 | <td><code>android.hardware.telephony</code></td> |
| 1040 | <!-- <td></td> --> |
| 1041 | </tr> |
| 1042 | <tr> |
| 1043 | <td><code>SEND_SMS</code></td> |
| 1044 | <td><code>android.hardware.telephony</code></td> |
| 1045 | <!-- <td></td> --> |
| 1046 | </tr> |
| 1047 | <tr> |
| 1048 | <td><code>WRITE_APN_SETTINGS</code></td> |
| 1049 | <td><code>android.hardware.telephony</code></td> |
| 1050 | <!-- <td></td> --> |
| 1051 | </tr> |
| 1052 | <tr> |
| 1053 | <td><code>WRITE_SMS</code></td> |
| 1054 | <td><code>android.hardware.telephony</code></td> |
| 1055 | <!-- <td></td> --> |
| 1056 | </tr> |
| 1057 | |
| 1058 | <tr> |
| 1059 | <td rowspan="3">Wifi</td> |
| 1060 | <td><code>ACCESS_WIFI_STATE</code></td> |
| 1061 | <td><code>android.hardware.wifi</code></td> |
| 1062 | <!-- <td></td> --> |
| 1063 | </tr> |
| 1064 | <tr> |
| 1065 | <td><code>CHANGE_WIFI_STATE</code></td> |
| 1066 | <td><code>android.hardware.wifi</code></td> |
| 1067 | <!-- <td></td> --> |
| 1068 | </tr> |
| 1069 | <tr> |
| 1070 | <td><code>CHANGE_WIFI_MULTICAST_STATE</code></td> |
| 1071 | <td><code>android.hardware.wifi</code></td> |
| 1072 | <!-- <td></td> --> |
| 1073 | </tr> |
Joe Fernandez | 33baa5a | 2013-11-14 11:41:19 -0800 | [diff] [blame] | 1074 | </table> |