Home | History | Annotate | Download | only in sdk
      1 page.title=Android 3.1 Platform
      2 sdk.platform.version=3.1
      3 sdk.platform.apiLevel=12
      4 @jd:body
      5 
      6 <div id="qv-wrapper">
      7 <div id="qv">
      8 
      9 <h2>In this document</h2>
     10 <ol>
     11   <li><a href="#relnotes">Revisions</a></li>
     12   <li><a href="#api">API Overview</a></li>
     13   <li><a href="#api-level">API Level</a></li>
     14   <li><a href="#apps">Built-in Applications</a></li>
     15   <li><a href="#locs">Locales</a></li>
     16   <li><a href="#skins">Emulator Skins</a></li>
     17 </ol>
     18 
     19 <h2>Reference</h2>
     20 <ol>
     21 <li><a
     22 href="{@docRoot}sdk/api_diff/12/changes.html">API
     23 Differences Report &raquo;</a> </li>
     24 </ol>
     25 
     26 <h2>See Also</h2>
     27 <ol>
     28   <li><a href="{@docRoot}guide/practices/optimizing-for-3.0.html">Optimizing
     29 Apps for Android 3.x</a></li>
     30 </ol>
     31 
     32 </div>
     33 </div>
     34 
     35 
     36 <p><em>API Level:</em>&nbsp;<strong>{@sdkPlatformApiLevel}</strong></p>
     37 
     38 <p>For developers, the Android {@sdkPlatformVersion} platform is available as a
     39 downloadable component for the Android SDK. The downloadable platform includes
     40 an Android library and system image, as well as a set of emulator skins and
     41 more. The downloadable platform includes no external libraries.</p>
     42 
     43 <p>To get started developing or testing against Android {@sdkPlatformVersion},
     44 use the Android SDK Manager to download the platform into your SDK. For more
     45 information, see <a href="{@docRoot}sdk/adding-components.html">Adding SDK
     46 Components</a>. If you are new to Android, <a
     47 href="{@docRoot}sdk/index.html">download the SDK Starter Package</a> first.</p>
     48 
     49 <p>For a high-level introduction to Android {@sdkPlatformVersion}, see the <a
     50 href="{@docRoot}sdk/android-{@sdkPlatformVersion}-highlights.html">Platform
     51 Highlights</a>.</p>
     52 
     53 <p class="note"><strong>Reminder:</strong> If you've already published an
     54 Android application, please test and optimize your application on Android 3.0
     55 and Android 3.1 as soon as possible. You should do so to be sure your
     56 application provides the best experience possible on the latest Android-powered
     57 devices. For information about what you can do, read <a
     58 href="{@docRoot}guide/practices/optimizing-for-3.0.html">Optimizing Apps for
     59 Android 3.0</a>.</p>
     60 
     61 
     62 <h2 id="relnotes">Revisions</h2>
     63 
     64 <p>To determine what revision of the Android {@sdkPlatformVersion} platform you
     65 have installed, refer to the "Installed Packages" listing in the Android SDK and
     66 AVD Manager.</p>
     67 
     68 
     69 <div class="toggle-content opened" style="padding-left:1em;">
     70 
     71 <p><a href="#" onclick="return toggleContent(this)">
     72   <img src="{@docRoot}assets/images/triangle-opened.png"
     73 class="toggle-content-img" alt="" />
     74   Android {@sdkPlatformVersion}, Revision 3</a> <em>(July 2011)</em>
     75 </a></p>
     76 
     77 <div class="toggle-content-toggleme" style="padding-left:2em;">
     78 
     79 <dl>
     80 <dt>Dependencies:</dt>
     81 <dd>
     82 <p>Requires <a href="{@docRoot}sdk/tools-notes.html">SDK Tools r12</a> or
     83 higher.</p>
     84 </dd>
     85 <dt>Notes:</dt>
     86 <dd>
     87 <p>Improvements to the platform's rendering library to support the visual layout editor in the ADT
     88 Eclipse plugin. This revision allows for more drawing features in ADT and fixes several
     89 bugs in the previous rendering library. It also unlocks several editor features that were added in
     90 ADT 12.</p>
     91 </dd>
     92 </dl>
     93 
     94 </div>
     95 </div>
     96 
     97 
     98 <div class="toggle-content closed" style="padding-left:1em;">
     99 
    100 <p><a href="#" onclick="return toggleContent(this)">
    101   <img src="{@docRoot}assets/images/triangle-closed.png"
    102 class="toggle-content-img" alt="" />
    103   Android {@sdkPlatformVersion}, Revision 2</a> <em>(May 2011)</em>
    104 </a></p>
    105 
    106 <div class="toggle-content-toggleme" style="padding-left:2em;">
    107 
    108 <dl>
    109 <dt>Dependencies:</dt>
    110 <dd>
    111 <p>Requires <a href="{@docRoot}sdk/tools-notes.html">SDK Tools r11</a> or
    112 higher.</p>
    113 </dd>
    114 <dt>Notes:</dt>
    115 <dd>
    116 <p>Fixes an issue with the visual layout editor rendering library that prevented Android 3.1 from
    117 running in ADT.</p>
    118 </dd>
    119 </dl>
    120 
    121 </div>
    122 </div>
    123 
    124 
    125 <div class="toggle-content closed" style="padding-left:1em;">
    126 
    127 <p><a href="#" onclick="return toggleContent(this)">
    128   <img src="{@docRoot}assets/images/triangle-closed.png"
    129 class="toggle-content-img" alt="" />
    130   Android {@sdkPlatformVersion}, Revision 1</a> <em>(May 2011)</em>
    131 </a></p>
    132 
    133 <div class="toggle-content-toggleme" style="padding-left:2em;">
    134 
    135 <dl>
    136 <dt>Dependencies:</dt>
    137 <dd>
    138 <p>Requires <a href="{@docRoot}sdk/tools-notes.html">SDK Tools r11</a> or
    139 higher.</p>
    140 </dd>
    141 </dl>
    142 
    143 </div>
    144 </div>
    145 
    146 
    147 <h2 id="#api" style="margin-top:1.5em;">API Overview</h2>
    148 
    149 <p>The sections below provide a technical overview of what's new for developers
    150 in Android 3.1, including new features and changes in the framework API since
    151 the previous version.</p>
    152 
    153 <h3 id="usb">USB APIs</h3>
    154 
    155 <p>Android 3.1 introduces powerful new APIs for
    156 integrating connected peripherals with applications running on the platform.
    157 The APIs are based on a USB (Universal Serial Bus) stack and services that are
    158 built into the platform, including support for both USB host and device
    159 interactions. Using the APIs, developers can create applications that are able to
    160 discover, communicate with, and manage a variety of device types connected over
    161 USB. </p>
    162 
    163 <p>The stack and APIs distinguish two basic types of USB hardware, based on
    164 whether the Android-powered device is acting as host or the external hardware
    165 is acting as host: </p>
    166 
    167 <ul>
    168 <li>A <em>USB device</em> is a piece of connected hardware that depends on the
    169 Android-powered device to serve as host. For example, most input devices, mice,
    170 and joysticks are USB devices, as are many cameras, hubs, and so on.</li>
    171 <li>A <em>USB accessory</em> is a piece of connected hardware that has a USB
    172 host controller, provides power, and is designed to communicate with
    173 Android-powered devices over USB, A variety of peripherals can connect as
    174 accessories, from robotics controllers to musical equipment, exercise bicycles,
    175 and more.</li>
    176 </ul>
    177 
    178 <p>For both types &mdash; USB devices and USB accessories &mdash; the
    179 platform's USB APIs support discovery by intent broadcast when attached or
    180 detached, as well as standard interfaces, endpoints, and transfer modes
    181 (control, bulk, and interrupt).</p>
    182 
    183 <p>The USB APIs are available in the package {@link android.hardware.usb}. The
    184 central class is {@link android.hardware.usb.UsbManager}, which provides
    185 helper methods for identifying and communicating with
    186 both USB devices and USB accessories. Applications can acquire an instance of
    187 {@link android.hardware.usb.UsbManager} and then query for the list of attached
    188 devices or accessories and then communicate with or manage them.
    189 {@link android.hardware.usb.UsbManager} also declares intent actions that the
    190 system broadcasts, to announce when a USB device or accessory is attached or
    191 detached.</p>
    192 
    193 <p>Other classes include:</p>
    194 
    195 <ul>
    196 <li>{@link android.hardware.usb.UsbDevice}, a class representing external
    197 hardware connected as a USB device (with the Android-powered device acting as
    198 host).</li>
    199 <li>{@link android.hardware.usb.UsbAccessory}, representing external hardware
    200 connected as the USB host (with the Android-powered device acting as a USB
    201 device).</li>
    202 <li>{@link android.hardware.usb.UsbInterface} and {@link
    203 android.hardware.usb.UsbEndpoint}, which provide access to standard USB
    204 interfaces and endpoints for a device.</li>
    205 <li>{@link android.hardware.usb.UsbDeviceConnection} and {@link
    206 android.hardware.usb.UsbRequest}, for sending and receiving data and control
    207 messages to or from a USB device, sychronously and asynchronously.
    208 <li>{@link android.hardware.usb.UsbConstants}, which provides constants for
    209 declaring endpoint types, device classes, and so on.</li>
    210 </ul>
    211 
    212 <p>Note that although the USB stack is built into the platform, actual support
    213 for USB host and open accessory modes on specific devices is determined by
    214 their manufacturers. In particular, host mode relies on appropriate USB
    215 controller hardware in the Android-powered device. </p>
    216 
    217 <p>Additionally, developers can request filtering on Android Market, such that
    218 their applications are not availabe to users whose devices do not provide the
    219 appropriate USB support. To request filtering, add one or both of the elements
    220 below to the application manifest, as appropriate: </p>
    221 
    222 <ul>
    223 <li>If the application should only be visible to devices that support USB
    224 host mode (connection of USB devices), declare this element:
    225   <p style="margin-left:1.5em;"><code>&lt;uses-feature
    226   android:name="android.hardware.usb.host"
    227   android:required="true"&gt;</code></p>
    228 </li>
    229 <li>If the application should only be visible to devices that support USB
    230 accessories (connection of USB hosts), declare this element:
    231   <p style="margin-left:1.5em;"><code>&lt;uses-feature
    232   android:name="android.hardware.usb.accessory"
    233   android:required="true"&gt;</code></p>
    234 </li>
    235 </ul>
    236 
    237 <p>For complete information about how to develop applications that interact with
    238 USB accessories, please see the
    239 <a href="{@docRoot}guide/topics/usb/index.html">developer documentation</a>.</p>
    240 
    241 <p class="note">To look at sample applications that use the USB host API, see <a
    242 href="{@docRoot}resources/samples/USB/AdbTest/index.html">ADB Test</a> and <a
    243 href="{@docRoot}resources/samples/USB/MissileLauncher/index.html">Missile
    244 Launcher</a></p>
    245 
    246 <h3>MTP/PTP API</h3>
    247 
    248 <p>Android 3.1 exposes a new MTP API that lets applications interact directly
    249 with connected cameras and other PTP devices. The new API makes it easy for an
    250 application to receive notifications when devices are attached and removed,
    251 manage files and storage on those devices, and transfer files and metadata to
    252 and from them. The MTP API implements the PTP (Picture Transfer Protocol) subset
    253 of the MTP (Media Transfer Protocol) specification.</p>
    254 
    255 <p>The MTP API is available in the {@link android.mtp} package and provides
    256 these classes: </p>
    257 
    258 <ul>
    259   <li>The {@link android.mtp.MtpDevice} encapsulates an MTP device that is
    260 connected over the USB host bus. An application can instantiate an object of
    261 this type and then use its methods to get information about the device and
    262 objects stored on it, as well as opening the connection and transferring data.
    263 Some of the methods include:
    264     <ul>
    265       <li>{@link android.mtp.MtpDevice#getObjectHandles(int, int, int)
    266 getObjectHandles()} returns a list of handles for all objects on the device that
    267 match a specified format and parent. To get information about an object, an
    268 application can pass a handle to {@link android.mtp.MtpDevice#getObjectInfo(int)
    269 getObjectInfo()}.</li>
    270       <li>{@link android.mtp.MtpDevice#importFile(int, java.lang.String)
    271 importFile()} lets an application copy data for an object to a file in external
    272 storage. This call may block for an arbitrary amount of time depending on the
    273 size of the data and speed of the devices, so should be made from a spearate
    274 thread.</li>
    275       <li>{@link
    276 android.mtp.MtpDevice#open(android.hardware.usb.UsbDeviceConnection) open()}
    277 lets an application open a connected MTP/PTP device. </li>
    278       <li>{@link android.mtp.MtpDevice#getThumbnail(int) getThumbnail()} returns
    279 the thumbnail of the object as a byte array. </li>
    280     </ul>
    281   </li>
    282   <li>{@link android.mtp.MtpStorageInfo} holds information about about a storage
    283 unit on an MTP device, corresponding to the StorageInfo Dataset described in
    284 section 5.2.2 of the MTP  specification. Methods in the class let an application
    285 get a storage units description string, free space, maximum storage capacity,
    286 storage ID, and volume identifier.</li>
    287   <li>{@link android.mtp.MtpDeviceInfo}  holds information about an MTP device
    288 corresponding to the DeviceInfo Dataset described in section 5.1.1 of the MTP
    289 specification. Methods in the class let applications get a devices
    290 manufacturer, model, serial number, and version.</li>
    291   <li>{@link android.mtp.MtpObjectInfo} holds information about an object stored
    292 on an MTP device, corresponding to the ObjectInfo Dataset described in section
    293 5.3.1 of the MTP specification. Methods in the class let applications get an
    294 objects size, data format, association type, creation date, and thumbnail
    295 information.</li>
    296   <li>{@link android.mtp.MtpConstants} provides constants for declaring MTP file
    297 format codes, association type, and protection status.</li>
    298 </ul>
    299 
    300 <h3 id="motionevents">Support for new input devices and motion events</h3>
    301 
    302 <p>Android 3.1 extends the input subsystem to support new input devices and new
    303 types of motion events, across all views and windows. Developers can build on
    304 these capabilities to let users interact with their applications using mice,
    305 trackballs, joysticks, gamepads, and other devices, in addition to keyboards and
    306 touchscreens. </p>
    307 
    308 <p>For handling mouse, scrollwheel, and trackball input, the platform supports
    309 two new motion event actions:</p>
    310 <ul>
    311 <li>{@link android.view.MotionEvent#ACTION_SCROLL}, which describes the pointer
    312 location at which a non-touch scroll motion, such as from a mouse scroll wheel,
    313 took place. In the MotionEvent, the value of the {@link
    314 android.view.MotionEvent#AXIS_HSCROLL} and {@link
    315 android.view.MotionEvent#AXIS_VSCROLL} axes specify the relative scroll
    316 movement. </li>
    317 <li>{@link android.view.MotionEvent#ACTION_HOVER_MOVE}, reports the current
    318 position of the mouse when no buttons are pressed, as well as any intermediate
    319 points since the last <code>HOVER_MOVE</code> event. Hover enter and exit
    320 notifications are not yet supported.</li>
    321 </ul>
    322 
    323 <p>To support joysticks and gamepads, the {@link android.view.InputDevice} class
    324 includes these new input device sources:</p>
    325 <ul>
    326 <li>{@link android.view.InputDevice#SOURCE_CLASS_JOYSTICK} &mdash; the source
    327 device has joystick axes.</li>
    328 <li>{@link android.view.InputDevice#SOURCE_CLASS_BUTTON} &mdash; the source
    329 device has buttons or keys.</li>
    330 <li>{@link android.view.InputDevice#SOURCE_GAMEPAD}  &mdash;  the source device
    331 has gamepad buttons such as {@link android.view.KeyEvent#KEYCODE_BUTTON_A}
    332 or {@link android.view.KeyEvent#KEYCODE_BUTTON_B}. Implies
    333 {@link android.view.InputDevice#SOURCE_CLASS_BUTTON}</li>
    334 <li>{@link android.view.InputDevice#SOURCE_JOYSTICK} &mdash; the source device
    335 has joystick axes.  Implies SOURCE_CLASS_JOYSTICK.</li>
    336 </ul>
    337 
    338 <p>To describe motion events from these new sources, as well as those from mice
    339 and trackballs, the platform now defines axis codes on {@link
    340 android.view.MotionEvent}, similar to how it defines key codes on {@link
    341 android.view.KeyEvent}. New axis codes for joysticks
    342 and game controllers include
    343 {@link android.view.MotionEvent#AXIS_HAT_X}, {@link
    344 android.view.MotionEvent#AXIS_HAT_Y}, {@link
    345 android.view.MotionEvent#AXIS_RTRIGGER}, {@link
    346 android.view.MotionEvent#AXIS_ORIENTATION}, {@link
    347 android.view.MotionEvent#AXIS_THROTTLE}, and many others. 
    348 Existing {@link android.view.MotionEvent} axes are represented by {@link
    349 android.view.MotionEvent#AXIS_X}, {@link android.view.MotionEvent#AXIS_Y},
    350 {@link android.view.MotionEvent#AXIS_PRESSURE}, {@link
    351 android.view.MotionEvent#AXIS_SIZE}, {@link
    352 android.view.MotionEvent#AXIS_TOUCH_MAJOR}, {@link
    353 android.view.MotionEvent#AXIS_TOUCH_MINOR}, {@link
    354 android.view.MotionEvent#AXIS_TOOL_MAJOR}, {@link
    355 android.view.MotionEvent#AXIS_TOOL_MINOR}, and {@link
    356 android.view.MotionEvent#AXIS_ORIENTATION}.</p>
    357 
    358 <p>Additionally, {@link android.view.MotionEvent} defines a number of generic
    359 axis codes that are used when the framework does not know how to map a
    360 particular axis. Specific devices can use the generic axis codes to pass custom
    361 motion data to applications. For a full list of axes and their intended
    362 interpretations, see the {@link android.view.MotionEvent} class documentation.
    363 </p>
    364 
    365 <p>The platform provides motion events to applications in batches, so a single
    366 event may contain a current position and multiple so-called historical movements.
    367 Applications should use {@link android.view.MotionEvent#getHistorySize()} to get
    368 the number of historical samples, then retrieve and process all historical
    369 samples in order using {@link
    370 android.view.MotionEvent#getHistoricalAxisValue(int, int, int)
    371 getHistoricalAxisValue()}.  After that, applications should process the current
    372 sample using {@link android.view.MotionEvent#getAxisValue(int) getAxisValue()}.
    373 </p>
    374 
    375 <p>Some axes can be retrieved using special accessor methods.  For example,
    376 instead of calling {@link android.view.MotionEvent#getAxisValue(int)
    377 getAxisValue()}, applications can call {@link android.view.MotionEvent#getX(int)
    378 getX()}.  Axes that have built-in accessors include {@link
    379 android.view.MotionEvent#AXIS_X}, {@link android.view.MotionEvent#AXIS_Y},
    380 {@link android.view.MotionEvent#AXIS_PRESSURE}, {@link
    381 android.view.MotionEvent#AXIS_SIZE}, {@link
    382 android.view.MotionEvent#AXIS_TOUCH_MAJOR}, {@link
    383 android.view.MotionEvent#AXIS_TOUCH_MINOR}, {@link
    384 android.view.MotionEvent#AXIS_TOOL_MAJOR}, {@link
    385 android.view.MotionEvent#AXIS_TOOL_MINOR}, and {@link
    386 android.view.MotionEvent#AXIS_ORIENTATION}.</p>
    387 
    388 <p>Each input device has a unique, system-assigned ID and may also provide
    389 multiple sources. When a device provides multiple sources, more than one source
    390 can provide axis data using the same axis. For example, a touch event coming
    391 from the touch source uses the X axis for screen position data, while a joystick
    392 event coming from the joystick source will use the X axis for the stick position
    393 instead. For this reason, it's important for applications to interpret axis
    394 values according to the source from which they originate. When handling a motion
    395 event, applications should use methods on the {@link android.view.InputDevice}
    396 class to determine the axes supported by a device or source. Specifically,
    397 applications can use {@link android.view.InputDevice#getMotionRanges()
    398 getMotionRanges()} to query for all axes of a device or all axes of a given
    399 source of the device. In both cases, the range information for axes returned in
    400 the {@link android.view.InputDevice.MotionRange} object specifies the source for
    401 each axis value.</p>
    402 
    403 <p>Finally, since the motion events from joysticks, gamepads, mice, and
    404 trackballs are not touch events, the platform adds a new callback method for
    405 passing them to a {@link android.view.View} as "generic" motion events.
    406 Specifically, it reports the non-touch motion events to 
    407 {@link android.view.View}s through a call to {@link
    408 android.view.View#onGenericMotionEvent(android.view.MotionEvent)
    409 onGenericMotionEvent()}, rather than to {@link
    410 android.view.View#onTouchEvent(android.view.MotionEvent)
    411 onTouchEvent()}.</p>
    412 
    413 <p>The platform dispatches generic motion events differently, depending on the
    414 event source class. {@link android.view.InputDevice#SOURCE_CLASS_POINTER} events
    415 go to the {@link android.view.View} under the pointer, similar to how touch
    416 events work.  All others go to the currently focused {@link android.view.View}.
    417 For example, this means a {@link android.view.View} must take focus in order to
    418 receive joystick events. If needed, applications can handle these events at the
    419 level of Activity or Dialog by implementing {@link
    420 android.view.View#onGenericMotionEvent(android.view.MotionEvent)
    421 onGenericMotionEvent()} there instead.</p>
    422 
    423 <p class="note">To look at a sample application that uses joystick motion
    424 events, see <a
    425 href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/view/
    426 GameControllerInput.html">GameControllerInput</a> and <a
    427 href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/view/
    428 GameView.html">GameView</a>.</p>
    429 
    430 <h3>RTP API</h3>
    431 
    432 <p>Android 3.1 exposes an API to its built-in RTP (Real-time Transport Protocol)
    433 stack, which applications can use to manage on-demand or interactive data
    434 streaming. In particular, apps that provide VOIP, push-to-talk, conferencing,
    435 and audio streaming can use the API to initiate sessions and transmit or receive
    436 data streams over any available network.</p>
    437 
    438 <p>The RTP API is available in the {@link android.net.rtp} package. Classes
    439 include: </p>
    440 <ul>
    441 <li>{@link android.net.rtp.RtpStream}, the base class of streams that send and
    442 receive network packets with media payloads over RTP.</li>
    443 <li>{@link android.net.rtp.AudioStream}, a subclass of {@link
    444 android.net.rtp.RtpStream} that carries audio payloads over RTP.</li>
    445 <li>{@link android.net.rtp.AudioGroup}, a local audio hub for managing and
    446 mixing the device speaker, microphone, and {@link android.net.rtp.AudioStream}.</li>
    447 <li>{@link android.net.rtp.AudioCodec}, which holds a collection of codecs that
    448 you define for an {@link android.net.rtp.AudioStream}.</li>
    449 </ul>
    450 
    451 <p>To support audio conferencing and similar usages, an application instantiates
    452 two classes as endpoints for the stream:</p>
    453 
    454 <ul>
    455 <li>{@link android.net.rtp.AudioStream} specifies a remote endpoint and consists
    456 of network mapping and a configured {@link android.net.rtp.AudioCodec}.</li>
    457 <li>{@link android.net.rtp.AudioGroup} represents the local endpoint for one
    458 or more {@link android.net.rtp.AudioStream}s. The {@link android.net.rtp.AudioGroup} mixes
    459 all the {@link android.net.rtp.AudioStream}s and optionally interacts with the device
    460 speaker and the microphone at the same time.</li>
    461 </ul>
    462 
    463 <p>The simplest usage involves a single remote endpoint and local endpoint.
    464 For more complex usages, please refer to the limitations described for
    465 {@link android.net.rtp.AudioGroup}.</p>
    466 
    467 <p>To use the RTP API, applications must request permission from the user by
    468 declaring <code>&lt;uses-permission
    469 android:name="android.permission.INTERNET"&gt;</code>
    470 in their manifest files. To acquire the device microphone, the <code>&lt;uses-permission
    471 android:name="android.permission.RECORD_AUDIO"&gt;</code> permission is also required.</p>
    472 
    473 <h3 id="resizewidgets">Resizable app widgets</h3>
    474 
    475 <p>Starting in Android 3.1, developers can make their homescreen widgets
    476 resizeable &mdash; horizontally, vertically, or on both axes. Users touch-hold a
    477 widget to show its resize handles, then drag the horizontal and/or vertical
    478 handles to change the size on the layout grid. </p>
    479 
    480 <p>Developers can make any Home screen widget resizeable by defining a
    481 <code>resizeMode</code> attribute in the widget's {@link
    482 android.appwidget.AppWidgetProviderInfo} metadata. Values for the
    483 <code>resizeMode</code> attribute include "horizontal", "vertical", and "none".
    484 To declare a widget as resizeable horizontally and vertically, supply the value
    485 "horizontal|vertical".
    486 
    487 <p>Here's an example: </p>
    488 
    489 <pre>&lt;appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    490     android:minWidth="294dp"
    491     android:minHeight="72dp"
    492     android:updatePeriodMillis="86400000"
    493     android:previewImage="@drawable/preview"
    494     android:initialLayout="@layout/example_appwidget"
    495     android:configure="com.example.android.ExampleAppWidgetConfigure"
    496     android:resizeMode="horizontal|vertical" >
    497 &lt;/appwidget-provider></pre>
    498 
    499 <p>For more information about Home screen widgets, see the <a
    500 href="{@docRoot}guide/topics/appwidgets/index.html">App Widgets</a>
    501 documentation.</p>
    502 
    503 <h3 id="animation" style="margin-top:1.25em;">Animation framework</h3>
    504 
    505 <ul>
    506 <li>New ViewPropertyAnimator class
    507   <ul>
    508     <li>A new {@link android.view.ViewPropertyAnimator} class provides a
    509 convenient
    510 way for developers to animate select properties on {@link android.view.View} objects. The class
    511 automaties and optimizes the animation of the properties and makes it easier to
    512 manage multiple simulataneous animations on a {@link android.view.View} object.
    513 <p>Using the {@link android.view.ViewPropertyAnimator} is straightforward. To animate properties for
    514 a {@link android.view.View}, call {@link android.view.View#animate()} to
    515 construct a {@link android.view.ViewPropertyAnimator} object for that {@link android.view.View}. Use the
    516 methods on the {@link android.view.ViewPropertyAnimator} to specify what property to
    517 animate and how to animate it. For example, to fade the {@link android.view.View} to transparent,
    518 call <code>alpha(0);</code>. The {@link android.view.ViewPropertyAnimator} object
    519 handles the details of configuring the underlying {@link
    520 android.animation.Animator} class and starting it, then rendering the
    521 animation.</p></li>
    522   </ul>
    523 </li>
    524 <li>Animation background color
    525   <ul>
    526     <li>New {@link android.view.animation.Animation#getBackgroundColor()} and
    527     {@link android.view.animation.Animation#setBackgroundColor(int)} methods let
    528     you get/set the background color behind animations, for window animations
    529 only. Currently the background must be black, with any desired alpha level.</li>
    530   </ul>
    531 </li>
    532 <li>Getting animated fraction from <code>ViewAnimator</code>
    533   <ul>
    534     <li>A new {@link android.animation.ValueAnimator#getAnimatedFraction()}
    535 method
    536 lets you get the current animation fraction &mdash; the elapsed/interpolated
    537 fraction used in the most recent frame update &mdash; from a {@link
    538 android.animation.ValueAnimator}.</li>
    539   </ul>
    540 </li>
    541 </ul>
    542 
    543 <h3 "ui">UI framework</h3>
    544 <ul>
    545 <li>Forced rendering of a layer
    546   <ul>
    547     <li>A new {@link android.view.View#buildLayer()} method lets an application
    548 force a View's layer to be created and the View rendered into it immediately.
    549 For example, an application could use this method to render a View into its
    550 layer before starting an animation. If the View is complex, rendering it into
    551 the layer before starting the animation will avoid skipping frames.</li>
    552   </ul>
    553 </li>
    554 <li>Camera distance
    555   <ul>
    556     <li>Applications can use a new method
    557 {@link android.view.View#setCameraDistance(float)} to set the distance from the
    558 camera
    559 to a View. This gives applications improved control over 3D transformations of
    560 the View, such as rotations. </li>
    561   </ul>
    562 </li>
    563 <li>Getting a calendar view from a DatePicker
    564   <ul>
    565     <li>A new {@link android.widget.DatePicker#getCalendarView()} method
    566     lets you get a {@link android.widget.CalendarView} from a {@link
    567 android.widget.DatePicker}
    568     instance.</li>
    569   </ul>
    570 </li>
    571 <li>Getting callbacks when views are detached
    572   <ul>
    573     <li>A new {@link android.view.View.OnAttachStateChangeListener} lets you
    574 receive
    575 callbacks when a View is attached or detached from its window. Use {@link
    576 android.view.View#addOnAttachStateChangeListener(android.view.View.OnAttachStateChangeListener) addOnAttachStateChangeListener()}
    577 to add a listener and {@link
    578 android.view.View#removeOnAttachStateChangeListener(android.view.View.OnAttachStateChangeListener) addOnAttachStateChangeListener()} to remove it.</li>
    579   </ul>
    580 </li>
    581 <li>Fragment breadcrumb listener, new onInflate() signature
    582   <ul>
    583     <li>A new method, {@link
    584 android.app.FragmentBreadCrumbs#setOnBreadCrumbClickListener(android.app.FragmentBreadCrumbs.OnBreadCrumbClickListener) setOnBreadCrumbClickListener()},
    585 provides a hook to let
    586 applications intercept fragment-breadcrumb clicks and take any action needed
    587 before going to the backstack entry or fragment that was clicked. </li>
    588     <li>In the {@link android.app.Fragment} class, {@link
    589 android.app.Fragment#onInflate(android.util.AttributeSet, android.os.Bundle)
    590 onInflate(attrs, savedInstanceState)} is deprecated. Please use {@link
    591 android.app.Fragment#onInflate(android.app.Activity, android.util.AttributeSet,
    592 android.os.Bundle) onInflate(activity, attrs, savedInstanceState)} instead.</li>
    593   </ul>
    594 </li>
    595 <li>Display search result in new tab
    596   <ul>
    597     <li>An {@link android.app.SearchManager#EXTRA_NEW_SEARCH} data key for {@link
    598 android.content.Intent#ACTION_WEB_SEARCH} intents lets you open a search in a
    599 new browser tab, rather than in an existing one.</li>
    600   </ul>
    601 </li>
    602 
    603 <li>Drawable text cursor
    604   <ul>
    605 <li>You can now specify a drawable to use as the text cursor using the new
    606 resource attribute {@link android.R.attr#textCursorDrawable}.</li>
    607   </ul>
    608 </li>
    609 <li>Setting displayed child in remote views
    610   <ul>
    611     <li>A new convenience method, {@link
    612 android.widget.RemoteViews#setDisplayedChild(int, int) setDisplayedChild(viewId,
    613 childIndex)}, is available in {@link android.widget.RemoteViews} subclasses, to
    614 let you set the child displayed in {@link android.widget.ViewAnimator} and
    615 {@link android.widget.AdapterViewAnimator} subclasses such as {@link
    616 android.widget.AdapterViewFlipper}, {@link android.widget.StackView}, {@link
    617 android.widget.ViewFlipper}, and {@link android.widget.ViewSwitcher}.</li>
    618   </ul>
    619 </li>
    620 <li>Generic keys for gamepads and other input devices
    621   <ul>
    622     <li>{@link android.view.KeyEvent} adds a range of generic keycodes to
    623     accommodate gamepad buttons. The class also adds
    624     {@link android.view.KeyEvent#isGamepadButton(int)} and several other
    625     helper methods for working with keycodes.</li>
    626   </ul>
    627 </li>
    628 </ul>
    629 
    630 <h3 id="graphics" style="margin-top:1.3em;">Graphics</h3>
    631 
    632 <ul>
    633 <li>Helpers for managing bitmaps
    634   <ul>
    635   <li>{@link android.graphics.Bitmap#setHasAlpha(boolean)} lets an app indicate that
    636 all of the pixels in a Bitmap are known to be opaque (false) or that some of the
    637 pixels may contain non-opaque alpha values (true). Note, for some configs (such
    638 as RGB_565) this call is ignored, since it does not support per-pixel alpha
    639 values. This is meant as a drawing hint, as in some cases a bitmap that is known
    640 to be opaque can take a faster drawing case than one that may have non-opaque
    641 per-pixel alpha values. </li>
    642   <li>{@link android.graphics.Bitmap#getByteCount()} gets a Bitmap's size in
    643 bytes.</li>
    644   <li>{@link android.graphics.Bitmap#getGenerationId()} lets an application find
    645 out whether a Bitmap has been modified, such as for caching.</li>
    646   <li>{@link android.graphics.Bitmap#sameAs(android.graphics.Bitmap)} determines
    647 whether a given Bitmap differs from the current Bitmap, in dimension,
    648 configuration, or pixel data. </li>
    649   </ul>
    650 </li>
    651 <li>Setting camera location and rotation
    652   <ul>
    653   <li>{@link android.graphics.Camera} adds two new methods {@link
    654 android.graphics.Camera#rotate(float, float, float) rotate()} and {@link
    655 android.graphics.Camera#setLocation(float, float, float) setLocation()} for
    656 control of the
    657 camera's location, for 3D transformations.</li>
    658 </ul>
    659 </li>
    660 </ul>
    661 
    662 <h3 id="network" style="margin-top:1.25em;">Network</h3>
    663 
    664 <ul>
    665 <li>High-performance Wi-Fi lock
    666   <ul>
    667     <li>A new high-performance Wi-Fi lock lets applications maintain
    668 high-performance Wi-Fi connections even when the device screen is off.
    669 Applications that stream music, video, or voice for long periods can acquire the
    670 high-performance Wi-Fi lock to ensure streaming performance even when the screen
    671 is off. Because it uses more power, applications should acquire the
    672 high-performance Wi-Fi when there is a need for a long-running active
    673 connection.
    674 <p>To create a high-performance lock, pass {@link
    675 android.net.wifi.WifiManager#WIFI_MODE_FULL_HIGH_PERF} as the lock mode in a
    676 call to {@link android.net.wifi.WifiManager#createWifiLock(int,
    677 java.lang.String) createWifiLock()}.</p></li>
    678   </ul>
    679 </li>
    680 <li>More traffic stats
    681   <ul>
    682     <li>Applications can now access statistics about more types of network usage
    683 using new methods in {@link android.net.TrafficStats}. Applications can use the
    684 methods to get UDP stats, packet count, TCP transmit/receive payload bytes and
    685 segments for a given UID.</li>
    686   </ul>
    687 </li>
    688 <li>SIP auth username
    689   <ul>
    690     <li>Applications can now get and set the SIP auth username for a profile
    691 using
    692 the new methods {@link android.net.sip.SipProfile#getAuthUserName()
    693 getAuthUserName()} and {@link
    694 android.net.sip.SipProfile.Builder#setAuthUserName(java.lang.String)
    695 setAuthUserName()}.</li>
    696   </ul>
    697 </li>
    698 </ul>
    699 
    700 
    701 <h3 id="download" style="margin-top:1.25em;">Download Manager</h3>
    702 <ul>
    703 <li>Handling of completed downloads
    704   <ul>
    705     <li>Applications can now initiate downloads that notify users only on
    706 completion. To initiate this type of download, applications pass {@link
    707 android.app.DownloadManager.Request#VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION}
    708 in the {@link
    709 android.app.DownloadManager.Request#setNotificationVisibility(int)
    710 setNotificationVisibility()} method of
    711 the a request object.</li>
    712     <li>A new method, {@link
    713 android.app.DownloadManager#addCompletedDownload(java.lang.String,
    714 java.lang.String, boolean, java.lang.String, java.lang.String, long, boolean)
    715 addCompletedDownload()}, lets an application add a file to the
    716 downloads database, so that it can be managed by the Downloads application.</li>
    717   </ul>
    718 </li>
    719 <li>Show downloads sorted by size
    720   <ul>
    721     <li>Applications can start the Downloads application in sort-by-size mode by
    722 adding the new extra {@link
    723 android.app.DownloadManager#INTENT_EXTRAS_SORT_BY_SIZE} to an {@link
    724 android.app.DownloadManager#ACTION_VIEW_DOWNLOADS} intent.</li>
    725     </ul>
    726 </li>
    727 </ul>
    728 
    729 <h3 id="ime" style="margin-top:1.25em;">IME framework</h3>
    730 
    731 <ul>
    732 <li>Getting an input method's extra value key
    733   <ul><li>The {@link android.view.inputmethod.InputMethodSubtype} adds the
    734 method
    735 {@link
    736 android.view.inputmethod.InputMethodSubtype#containsExtraValueKey(java.lang.String) containsExtraValueKey()} to check whether an ExtraValue string is stored
    737 for the subtype and
    738 the method {@link
    739 android.view.inputmethod.InputMethodSubtype#getExtraValueOf(java.lang.String)
    740 getExtraValueOf()} to extract a specific key value from the ExtraValue hashmap.
    741 </li>
    742   </ul>
    743 </li>
    744 </ul>
    745 
    746 <h3 id="media" style="margin-top:1.25em;">Media</h3>
    747 
    748 <ul>
    749 <li>New streaming audio formats
    750   <ul>
    751     <li>The media framework adds built-in support for raw ADTS AAC content, for
    752 improved streaming audio, as well as support for FLAC audio, for highest quality
    753 (lossless) compressed audio content. See the <a
    754 href="{@docRoot}guide/appendix/media-formats.html">Supported Media Formats</a>
    755 document for more information.</p></li>
    756   </ul>
    757 </li>
    758 </ul>
    759 
    760 <h3 id="launchcontrols" style="margin-top:1.25em;">Launch controls on stopped
    761 applications</h3>
    762 
    763 <p>Starting from Android 3.1, the system's package manager keeps track of
    764 applications that are in a stopped state and provides a means of controlling
    765 their launch from background processes and other applications.</p>
    766 
    767 <p>Note that an application's stopped state is not the same as an Activity's
    768 stopped state. The system manages those two stopped states separately.</p>
    769 
    770 <p>The platform defines two new intent flags that let a sender specify
    771 whether the Intent should be allowed to activate components in stopped
    772 application.</p>
    773 
    774 <ul>
    775 <li>{@link android.content.Intent#FLAG_INCLUDE_STOPPED_PACKAGES} &mdash;
    776 Include intent filters of stopped applications in the list of potential targets
    777 to resolve against. </li>
    778 <li>{@link android.content.Intent#FLAG_EXCLUDE_STOPPED_PACKAGES} &mdash;
    779 Exclude intent filters of stopped applications from the list of potential
    780 targets.</li>
    781 </ul>
    782 
    783 <p>When neither or both of these flags is defined in an intent, the default
    784 behavior is to include filters of stopped applications in the list of
    785 potential targets.</p>
    786 
    787 <p>Note that the system adds {@link
    788 android.content.Intent#FLAG_EXCLUDE_STOPPED_PACKAGES} <em>to all broadcast
    789 intents</em>. It does this to prevent broadcasts from background services from
    790 inadvertently or unnecessarily launching components of stoppped applications.
    791 A background service or application can override this behavior by adding the
    792 {@link android.content.Intent#FLAG_INCLUDE_STOPPED_PACKAGES} flag to broadcast
    793 intents that should be allowed to activate stopped applications.</p>
    794 
    795 <p>Applications are in a stopped state when they are first installed but are not
    796 yet launched and when they are manually stopped by the user (in Manage
    797 Applications).</p>
    798 
    799 <h3 id="installnotification">Notification of application first launch and upgrade</h3>
    800 
    801 <p>The platform adds improved notification of application first launch and
    802 upgrades through two new intent actions:</p>
    803 
    804 <ul>
    805 <li>{@link android.content.Intent#ACTION_PACKAGE_FIRST_LAUNCH} &mdash; Sent to
    806 the installer package of an application when that application is first launched
    807 (that is, the first time it is moved out of a stopped state). The data
    808 contains the name of the package. </li>
    809 
    810 <li>{@link android.content.Intent#ACTION_MY_PACKAGE_REPLACED} &mdash; Notifies
    811 an application that it was updated, with a new version was installed over
    812 an existing version.  This is only sent to the application that was replaced. It
    813 does not contain any additional data. To receive it, declare an intent filter
    814 for this action. You can use the intent to trigger code that helps get your
    815 application back in proper running shape after an upgrade.
    816 
    817 <p>This intent is sent directly to the application, but only if the application
    818 was upgraded while it was in started state (not in a stopped state).</p></li>
    819 
    820 </ul>
    821 
    822 <h3 id="other">Core utilities</h3>
    823 
    824 <ul>
    825 <li>LRU cache
    826   <ul>
    827     <li>A new {@link android.util.LruCache} class lets your applications benefit
    828 from efficient caching. Applications can use the class to reduce the time spent
    829 computing or downloading data from the network, while maintaining a sensible
    830 memory footprint for the cached data.{@link android.util.LruCache} is a cache
    831 that holds strong references to a limited number of values. Each time a value is
    832 accessed, it is moved to the head of a queue. When a value is added to a full
    833 cache, the value at the end of that queue is evicted and may become eligible for
    834 garbage collection.</li>
    835   </ul>
    836 </li>
    837 <li>File descriptor as <code>int</code>
    838   <ul>
    839     <li>You can now get the native file descriptor int for a {@link
    840 android.os.ParcelFileDescriptor} using either of the new methods {@link
    841 android.os.ParcelFileDescriptor#getFd()} or {@link
    842 android.os.ParcelFileDescriptor#detachFd()}. </li>
    843   </ul>
    844 </li>
    845 </ul>
    846 
    847 
    848 
    849 
    850 
    851 
    852 <h3 id="webkit" style="margin-top:1.25em;">WebKit</h3>
    853 
    854 <ul>
    855 
    856 <li>File scheme cookies
    857   <ul>
    858     <li>The {@link android.webkit.CookieManager} now supports cookies that use
    859 the
    860 <code>file:</code> URI scheme. You can use {@link
    861 android.webkit.CookieManager#setAcceptFileSchemeCookies(boolean)
    862 setAcceptFileSchemeCookies()} to
    863 enable/disable support for file scheme cookies, before constructing an instance
    864 of <code>WebView</code> or <code>CookieManager</code>. In a
    865 <code>CookieManager</code> instance, you can check whether file scheme cookies
    866 is enabled by calling {@link
    867 android.webkit.CookieManager#allowFileSchemeCookies()}.</li>
    868   </ul>
    869 </li>
    870 <li>Notification of login request
    871   <ul>
    872   <li>To support the browser autologin features introduced in Android 3.0, the
    873 new
    874 method {@link
    875 android.webkit.WebViewClient#onReceivedLoginRequest(android.webkit.WebView,java.lang.String, java.lang.String, java.lang.String) onReceivedLoginRequest()}
    876 notifies the host
    877 application that an autologin request for the user was processed. </li>
    878   </ul>
    879 </li>
    880 <li>Removed classes and interfaces
    881   <ul>
    882     <li>Several classes and interfaces were removed from the public API, after
    883 previously being in deprecated state. See the <a
    884 href="{@docRoot}sdk/api_diff/{@sdkPlatformApiLevel}/changes.html">API
    885 Differences Report</a> for more information.</p></li>
    886   </ul>
    887   </li>
    888 </ul>
    889 
    890 
    891 
    892 <h3 id="browser" style="margin-top:1.25em;">Browser</h3>
    893 
    894 <p>The Browser application adds the following features to support web
    895 applications:</p>
    896 
    897 <ul>
    898 <li>Support for inline playback of video embedded in HTML5
    899 <code>&lt;video&gt;</code> tag. Playback is hardware-accelerated where possible.
    900 </li>
    901 <li>Layer support for fixed position elements for all sites (mobile and
    902 desktop).</li>
    903 </ul>
    904 
    905 
    906 
    907 
    908 
    909 <h3 id="features">New feature constants</h3>
    910 
    911 <p>The platform adds new hardware feature constants that developers can declare
    912 in their application manifests, to inform external entities such as Android
    913 Market of the application's requirement for new hardware capabilities supported
    914 in this version of the platform. Developers declare these and other feature
    915 constants in <a
    916 href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code
    917 &lt;uses-feature&gt;}</a> manifest elements.
    918 
    919 <ul>
    920   <li>{@link android.content.pm.PackageManager#FEATURE_USB_ACCESSORY
    921 android.hardware.usb.accessory} &mdash; The application uses the <a href="#usb">USB
    922 API</a> to communicate with external hardware devices connected over USB and
    923 function as hosts.</li>
    924   <li>{@link android.content.pm.PackageManager#FEATURE_USB_HOST
    925 android.hardware.usb.host} &mdash; The application uses the <a href="#usb">USB API</a>
    926 to communicate with external hardware devices connected over USB and function as
    927 devices.</li>
    928 </ul>
    929 
    930 <p>Android Market filters applications based on features declared in <a
    931 href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code
    932 &lt;uses-feature&gt;}</a> manifest elements. For more information about
    933 declaring features in an application manifest, read <a
    934 href="{docRoot}guide/appendix/market-filters.html">Android Market
    935 Filters</a>.</p>
    936 
    937 
    938 
    939 <h3 id="api-diff">API Differences Report</h3>
    940 
    941 <p>For a detailed view of all API changes in Android {@sdkPlatformVersion} (API
    942 Level
    943 {@sdkPlatformApiLevel}), see the <a
    944 href="{@docRoot}sdk/api_diff/{@sdkPlatformApiLevel}/changes.html">API
    945 Differences Report</a>.</p>
    946 
    947 
    948 
    949 
    950 
    951 <h2 id="api-level">API Level</h2>
    952 
    953 <p>The Android {@sdkPlatformVersion} platform delivers an updated version of
    954 the framework API. The Android {@sdkPlatformVersion} API
    955 is assigned an integer identifier &mdash;
    956 <strong>{@sdkPlatformApiLevel}</strong> &mdash; that is
    957 stored in the system itself. This identifier, called the "API Level", allows the
    958 system to correctly determine whether an application is compatible with
    959 the system, prior to installing the application. </p>
    960 
    961 <p>To use APIs introduced in Android {@sdkPlatformVersion} in your application,
    962 you need compile the application against the Android library that is provided in
    963 the Android {@sdkPlatformVersion} SDK platform. Depending on your needs, you
    964 might
    965 also need to add an <code>android:minSdkVersion="{@sdkPlatformApiLevel}"</code>
    966 attribute to the <code>&lt;uses-sdk&gt;</code> element in the application's
    967 manifest.</p>
    968 
    969 <p>For more information about how to use API Level, see the <a
    970 href="{@docRoot}guide/appendix/api-levels.html">API Levels</a> document. </p>
    971 
    972 
    973 <h2 id="apps">Built-in Applications</h2>
    974 
    975 <p>The system image included in the downloadable platform provides these
    976 built-in applications:</p>
    977 
    978 <table style="border:0;padding-bottom:0;margin-bottom:0;">
    979 <tr>
    980 <td style="border:0;padding-bottom:0;margin-bottom:0;">
    981 <ul>
    982 <li>API Demos</li>
    983 <li>Browser</li>
    984 <li>Calculator</li>
    985 <li>Camera</li>
    986 <li>Clock</li>
    987 <li>Contacts</li>
    988 <li>Custom Locale</li>
    989 <li>Dev Tools</li>
    990 <li>Downloads</li>
    991 <li>Email</li>
    992 </ul>
    993 </td>
    994 <td style="border:0;padding-bottom:0;margin-bottom:0;padding-left:5em;">
    995 <ul>
    996 <li>Gallery</li>
    997 <li>Gestures Builder</li>
    998 <li>Messaging</li>
    999 <li>Music</li>
   1000 <li>Search</li>
   1001 <li>Settings</li>
   1002 <li>Spare Parts</li>
   1003 <li>Speech Recorder</li>
   1004 <li>Widget Preview</li>
   1005 </ul>
   1006 </td>
   1007 </tr>
   1008 </table>
   1009 
   1010 
   1011 <h2 id="locs" style="margin-top:.75em;">Locales</h2>
   1012 
   1013 <p>The system image included in the downloadable SDK platform provides a variety
   1014 of
   1015 built-in locales. In some cases, region-specific strings are available for the
   1016 locales. In other cases, a default version of the language is used. The
   1017 languages that are available in the Android 3.0 system
   1018 image are listed below (with <em>language</em>_<em>country/region</em> locale
   1019 descriptor).</p>
   1020 
   1021 <table style="border:0;padding-bottom:0;margin-bottom:0;">
   1022 <tr>
   1023 <td style="border:0;padding-bottom:0;margin-bottom:0;">
   1024 <ul>
   1025 <li>Arabic, Egypt (ar_EG)</li>
   1026 <li>Arabic, Israel (ar_IL)</li>
   1027 <li>Bulgarian, Bulgaria (bg_BG)</li>
   1028 <li>Catalan, Spain (ca_ES)</li>
   1029 <li>Czech, Czech Republic (cs_CZ)</li>
   1030 <li>Danish, Denmark(da_DK)</li>
   1031 <li>German, Austria (de_AT)</li>
   1032 <li>German, Switzerland (de_CH)</li>
   1033 <li>German, Germany (de_DE)</li>
   1034 <li>German, Liechtenstein (de_LI)</li>
   1035 <li>Greek, Greece (el_GR)</li>
   1036 <li>English, Australia (en_AU)</li>
   1037 <li>English, Canada (en_CA)</li>
   1038 <li>English, Britain (en_GB)</li>
   1039 <li>English, Ireland (en_IE)</li>
   1040 <li>English, India (en_IN)</li>
   1041 <li>English, New Zealand (en_NZ)</li>
   1042 <li>English, Singapore(en_SG)</li>
   1043 <li>English, US (en_US)</li>
   1044 <li>English, Zimbabwe (en_ZA)</li>
   1045 <li>Spanish (es_ES)</li>
   1046 <li>Spanish, US (es_US)</li>
   1047 <li>Finnish, Finland (fi_FI)</li>
   1048 <li>French, Belgium (fr_BE)</li>
   1049 <li>French, Canada (fr_CA)</li>
   1050 <li>French, Switzerland (fr_CH)</li>
   1051 <li>French, France (fr_FR)</li>
   1052 <li>Hebrew, Israel (he_IL)</li>
   1053 <li>Hindi, India (hi_IN)</li>
   1054 </ul>
   1055 </td>
   1056 <td style="border:0;padding-bottom:0;margin-bottom:0;padding-left:5em;">
   1057 <li>Croatian, Croatia (hr_HR)</li>
   1058 <li>Hungarian, Hungary (hu_HU)</li>
   1059 <li>Indonesian, Indonesia (id_ID)</li>
   1060 <li>Italian, Switzerland (it_CH)</li>
   1061 <li>Italian, Italy (it_IT)</li>
   1062 <li>Japanese (ja_JP)</li>
   1063 <li>Korean (ko_KR)</li>
   1064 <li>Lithuanian, Lithuania (lt_LT)</li>
   1065 <li>Latvian, Latvia (lv_LV)</li>
   1066 <li>Norwegian bokml, Norway (nb_NO)</li>
   1067 <li>Dutch, Belgium (nl_BE)</li>
   1068 <li>Dutch, Netherlands (nl_NL)</li>
   1069 <li>Polish (pl_PL)</li>
   1070 <li>Portuguese, Brazil (pt_BR)</li>
   1071 <li>Portuguese, Portugal (pt_PT)</li>
   1072 <li>Romanian, Romania (ro_RO)</li>
   1073 <li>Russian (ru_RU)</li></li>
   1074 <li>Slovak, Slovakia (sk_SK)</li>
   1075 <li>Slovenian, Slovenia (sl_SI)</li>
   1076 <li>Serbian (sr_RS)</li>
   1077 <li>Swedish, Sweden (sv_SE)</li>
   1078 <li>Thai, Thailand (th_TH)</li>
   1079 <li>Tagalog, Philippines (tl_PH)</li>
   1080 <li>Turkish, Turkey (tr_TR)</li>
   1081 <li>Ukrainian, Ukraine (uk_UA)</li>
   1082 <li>Vietnamese, Vietnam (vi_VN)</li>
   1083 <li>Chinese, PRC (zh_CN)</li>
   1084 <li>Chinese, Taiwan (zh_TW)</li>
   1085 </td>
   1086 </tr>
   1087 </table>
   1088 
   1089 <p class="note"><strong>Note:</strong> The Android platform may support more
   1090 locales than are included in the SDK system image. All of the supported locales
   1091 are available in the <a href="http://source.android.com/">Android Open Source
   1092 Project</a>.</p>
   1093 
   1094 <h2 id="skins">Emulator Skins</h2>
   1095 
   1096 <p>The downloadable platform includes the following emulator skin:</p>
   1097 
   1098 <ul>
   1099   <li>
   1100     WXGA (1280x800, medium density, xlarge screen)
   1101   </li>
   1102 </ul>
   1103 
   1104 <p>For more information about how to develop an application that displays
   1105 and functions properly on all Android-powered devices, see <a
   1106 href="{@docRoot}guide/practices/screens_support.html">Supporting Multiple
   1107 Screens</a>.</p>