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