blob: 9a9f02a37cfd01f7bdf2c2abe8be0f475f5769c3 [file] [log] [blame]
Scott Main1d6f70c2011-10-06 22:57:25 -07001page.title=Android 4.0 Platform
2sdk.platform.version=4.0
3sdk.platform.apiLevel=14
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>
Scott Maine1e9e932011-10-13 23:36:19 -070013 <li><a href="#Honeycomb">Previous APIs</a></li>
Scott Main1d6f70c2011-10-06 22:57:25 -070014 <li><a href="#api-diff">API Differences Report</a></li>
15 <li><a href="#api-level">API Level</a></li>
16 <li><a href="#apps">Built-in Applications</a></li>
17 <li><a href="#locs">Locales</a></li>
18 <li><a href="#skins">Emulator Skins</a></li>
19</ol>
20
21<h2>Reference</h2>
22<ol>
23<li><a
24href="{@docRoot}sdk/api_diff/14/changes.html">API
25Differences Report &raquo;</a> </li>
26</ol>
27
28</div>
29</div>
30
31
32<p><em>API Level:</em>&nbsp;<strong>{@sdkPlatformApiLevel}</strong></p>
33
34<p>Android 4.0 (Ice Cream Sandwich) is a major platform release that adds new
35capabilities for users and developers. The sections below provide an overview
36of the new features and developer APIs.</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 start 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
Scott Main1d6f70c2011-10-06 22:57:25 -070049<p class="note"><strong>Reminder:</strong> If you've already published an
50Android application, please test your application on Android {@sdkPlatformVersion} as
51soon as possible to be sure your application provides the best
52experience possible on the latest Android-powered devices.</p>
53
Scott Maine1e9e932011-10-13 23:36:19 -070054<p>For a high-level introduction to the new user and developer features in Android 4.0, see the
55<a href="http://developer.android.com/sdk/android-4.0-highlights.html">Platform Highlights</a>.</p>
56
Scott Main1d6f70c2011-10-06 22:57:25 -070057
58<h2 id="relnotes">Revisions</h2>
59
60<p>To determine what revision of the Android {@sdkPlatformVersion} platform you
61have installed, refer to the "Installed Packages" listing in the Android SDK Manager.</p>
62
63
64<div class="toggle-content opened" style="padding-left:1em;">
65
66 <p><a href="#" onclick="return toggleContent(this)">
67 <img src="{@docRoot}assets/images/triangle-opened.png"
68class="toggle-content-img" alt="" />
69 Android {@sdkPlatformVersion}, Revision 1</a> <em>(October 2011)</em>
70 </a></p>
71
72 <div class="toggle-content-toggleme" style="padding-left:2em;">
73
74<dl>
Scott Maine1e9e932011-10-13 23:36:19 -070075<dt>Initial release. SDK Tools r14 or higher is recommended.</dt>
Scott Main1d6f70c2011-10-06 22:57:25 -070076</dl>
77
78 </div>
79</div>
80
81
82<h2 id="api">API Overview</h2>
83
84<p>The sections below provide a technical overview of new APIs in Android 4.0.</p>
85
86<div class="toggle-content closed" style="padding-left:1em;">
87
88 <p><a href="#" onclick="return toggleContent(this)">
89 <img src="{@docRoot}assets/images/triangle-closed.png"
90class="toggle-content-img" alt="" />
91 <strong>Table of Contents</strong>
92 </a></p>
93
94 <div class="toggle-content-toggleme" style="padding-left:2em;">
95 <ol class="toc" style="margin-left:-1em">
Scott Maine1e9e932011-10-13 23:36:19 -070096 <li><a href="#Contacts">Contact Provider</a></li>
97 <li><a href="#Calendar">Calendar Provider</a></li>
98 <li><a href="#Voicemail">Voicemail Provider</a></li>
Scott Main1d6f70c2011-10-06 22:57:25 -070099 <li><a href="#Camera">Camera</a></li>
100 <li><a href="#Multimedia">Multimedia</a></li>
101 <li><a href="#Bluetooth">Bluetooth</a></li>
102 <li><a href="#AndroidBeam">Android Beam (NDEF Push with NFC)</a></li>
Scott Maine09743272011-10-14 11:25:46 -0700103 <li><a href="#WiFiDirect">Wi-Fi Direct</a></li>
104 <li><a href="#NetworkUsage">Network Usage</a></li>
Scott Maine1e9e932011-10-13 23:36:19 -0700105 <li><a href="#RenderScript">RenderScript</a></li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700106 <li><a href="#A11y">Accessibility</a></li>
107 <li><a href="#Enterprise">Enterprise</a></li>
Scott Maine1e9e932011-10-13 23:36:19 -0700108 <li><a href="#Sensors">Device Sensors</a></li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700109 <li><a href="#TTS">Text-to-speech Engines</a></li>
Scott Maine1e9e932011-10-13 23:36:19 -0700110 <li><a href="#SpellChecker">Spell Checker Services</a></li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700111 <li><a href="#ActionBar">Action Bar</a></li>
112 <li><a href="#UI">User Interface and Views</a></li>
113 <li><a href="#Properties">Properties</a></li>
114 <li><a href="#HwAccel">Hardware Acceleration</a></li>
115 <li><a href="#Jni">JNI Changes</a></li>
116 <li><a href="#WebKit">WebKit</a></li>
117 <li><a href="#Permissions">Permissions</a></li>
118 <li><a href="#DeviceFeatures">Device Features</a></li>
119 </ol>
120 </div>
121</div>
122
123
124
125
126
Scott Maine1e9e932011-10-13 23:36:19 -0700127<h3 id="Contacts">Contact Provider</h3>
Scott Main1d6f70c2011-10-06 22:57:25 -0700128
Scott Maine1e9e932011-10-13 23:36:19 -0700129<p>The contact APIs that are defined by the {@link android.provider.ContactsContract} provider have
130been extended to support new features such as a personal profile for the device owner, high
131resolution contact photos, and the ability for users to invite individual contacts to social
132networks that are installed on the device.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700133
134
135<h4>User Profile</h4>
136
137<p>Android now includes a personal profile that represents the device owner, as defined by the
Scott Maine1e9e932011-10-13 23:36:19 -0700138{@link android.provider.ContactsContract.Profile} table. Social apps that maintain a user identity
139can contribute to the user's profile data by creating a new {@link
Scott Main1d6f70c2011-10-06 22:57:25 -0700140android.provider.ContactsContract.RawContacts} entry within the {@link
141android.provider.ContactsContract.Profile}. That is, raw contacts that represent the device user do
142not belong in the traditional raw contacts table defined by the {@link
143android.provider.ContactsContract.RawContacts} Uri; instead, you must add a profile raw contact in
144the table at {@link android.provider.ContactsContract.Profile#CONTENT_RAW_CONTACTS_URI}. Raw
Scott Maine1e9e932011-10-13 23:36:19 -0700145contacts in this table are then aggregated into the single user-visible profile labeled "Me".</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700146
147<p>Adding a new raw contact for the profile requires the {@link
148android.Manifest.permission#WRITE_PROFILE} permission. Likewise, in order to read from the profile
149table, you must request the {@link android.Manifest.permission#READ_PROFILE} permission. However,
Scott Maine1e9e932011-10-13 23:36:19 -0700150most apps should need to read the user profile, even when contributing data to the
151profile. Reading the user profile is a sensitive permission and you should expect users to be
152skeptical of apps that request it.</p>
153
Scott Main1d6f70c2011-10-06 22:57:25 -0700154
155<h4>Large photos</h4>
156
157<p>Android now supports high resolution photos for contacts. Now, when you push a photo into a
Scott Maine1e9e932011-10-13 23:36:19 -0700158contact record, the system processes it into both a 96x96 thumbnail (as it has previously) and a
159256x256 "display photo" that's stored in a new file-based photo store (the exact dimensions that the
160system chooses may vary in the future). You can add a large photo to a contact by putting a large
161photo in the usual {@link android.provider.ContactsContract.CommonDataKinds.Photo#PHOTO} column of a
162data row, which the system will then process into the appropriate thumbnail and display photo
163records.</p>
164
Scott Main1d6f70c2011-10-06 22:57:25 -0700165
166<h4>Invite Intent</h4>
167
Scott Maine1e9e932011-10-13 23:36:19 -0700168<p>The {@link android.provider.ContactsContract.Intents#INVITE_CONTACT} intent action allows an app
169to invoke an action that indicates the user wants to add a contact to a social network. The app
170receiving the app uses it to invite the specified contact to that
171social network. Most apps will be on the receiving-end of this operation. For example, the
172built-in People app invokes the invite intent when the user selects "Add connection" for a specific
173social app that's listed in a person's contact details.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700174
Scott Maine1e9e932011-10-13 23:36:19 -0700175<p>To make your app visible as in the "Add connection" list, your app must provide a sync adapter to
176sync contact information from your social network. You must then indicate to the system that your
177app responds to the {@link android.provider.ContactsContract.Intents#INVITE_CONTACT} intent by
178adding the {@code inviteContactActivity} attribute to your app’s sync configuration file, with a
179fully-qualified name of the activity that the system should start when sending the invite intent.
180The activity that starts can then retrieve the URI for the contact in question from the intent’s
181data and perform the necessary work to invite that contact to the network or add the person to the
182user’s connections.</p>
183
184<p>See the <a href="{@docRoot}resources/samples/SampleSyncAdapter/index.html">Sample Sync
185Adapter</a> app for an example (specifically, see the <a
186href="{@docRoot}resources/samples/SampleSyncAdapter/res/xml-v14/contacts.html">contacts.xml</a>
187file).</p>
188
Scott Main1d6f70c2011-10-06 22:57:25 -0700189
190<h4>Contact Usage Feedback</h4>
191
192<p>The new {@link android.provider.ContactsContract.DataUsageFeedback} APIs allow you to help track
193how often the user uses particular methods of contacting people, such as how often the user uses
194each phone number or e-mail address. This information helps improve the ranking for each contact
Scott Maine1e9e932011-10-13 23:36:19 -0700195method associated with each person and provide better suggestions for contacting each person.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700196
197
198
199
200
Scott Maine1e9e932011-10-13 23:36:19 -0700201<h3 id="Calendar">Calendar Provider</h3>
Scott Main1d6f70c2011-10-06 22:57:25 -0700202
Scott Mainb57769a2011-10-17 11:20:49 -0700203<p>The new calendar APIs allow you to read, add, modify and delete calendars, events, attendees,
204reminders and alerts, which are stored in the Calendar Provider.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700205
Scott Maine1e9e932011-10-13 23:36:19 -0700206<p>A variety of apps and widgets can use these APIs to read and modify calendar events. However,
207some of the most compelling use cases are sync adapters that synchronize the user's calendar from
Scott Mainb57769a2011-10-17 11:20:49 -0700208other calendar services with the Calendar Provider, in order to offer a unified location for all the
209user's events. Google Calendar events, for example, are synchronized with the Calendar Provider by
210the Google Calendar Sync Adapter, allowing these events to be viewed with Android's built-in
Scott Maine1e9e932011-10-13 23:36:19 -0700211Calendar app.</p>
212
213<p>The data model for calendars and event-related information in the Calendar Provider is
214defined by {@link android.provider.CalendarContract}. All the user’s calendar data is stored in a
215number of tables defined by various subclasses of {@link android.provider.CalendarContract}:</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700216
217<ul>
218<li>The {@link android.provider.CalendarContract.Calendars} table holds the calendar-specific
219information. Each row in this table contains the details for a single calendar, such as the name,
220color, sync information, and so on.</li>
221
222<li>The {@link android.provider.CalendarContract.Events} table holds event-specific information.
Scott Maine1e9e932011-10-13 23:36:19 -0700223Each row in this table contains the information for a single event, such as the
224event title, location, start time, end time, and so on. The event can occur one time or recur
225multiple times. Attendees, reminders, and extended properties are stored in separate tables and
226use the event’s {@code _ID} to link them with the event.</li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700227
228<li>The {@link android.provider.CalendarContract.Instances} table holds the start and end time for
229occurrences of an event. Each row in this table represents a single occurrence. For one-time events
230there is a one-to-one mapping of instances to events. For recurring events, multiple rows are
231automatically generated to correspond to the multiple occurrences of that event.</li>
232
233<li>The {@link android.provider.CalendarContract.Attendees} table holds the event attendee or guest
234information. Each row represents a single guest of an event. It specifies the type of guest the
Scott Maine1e9e932011-10-13 23:36:19 -0700235person is and the person’s response for the event.</li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700236
237<li>The {@link android.provider.CalendarContract.Reminders} table holds the alert/notification data.
238Each row represents a single alert for an event. An event can have multiple reminders. The number of
Scott Maine1e9e932011-10-13 23:36:19 -0700239reminders per event is specified in {@code MAX_REMINDERS}, which is set by the sync adapter that
240owns the given calendar. Reminders are specified in number-of-minutes before the event is
241scheduled and specify an alarm method such as to use an alert, email, or SMS to remind
242the user.</li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700243
244<li>The {@link android.provider.CalendarContract.ExtendedProperties} table hold opaque data fields
Scott Maine1e9e932011-10-13 23:36:19 -0700245used by the sync adapter. The provider takes no action with items in this table except to delete
246them when their related events are deleted.</li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700247</ul>
248
Scott Maine1e9e932011-10-13 23:36:19 -0700249<p>To access a user’s calendar data with the Calendar Provider, your application must request
250the {@link android.Manifest.permission#READ_CALENDAR} permission (for read access) and
251{@link android.Manifest.permission#WRITE_CALENDAR} (for write access).</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700252
Scott Main1d6f70c2011-10-06 22:57:25 -0700253
Scott Maine1e9e932011-10-13 23:36:19 -0700254<h4>Event intent</h4>
255
256<p>If all you want to do is add an event to the user’s calendar, you can use an
257{@link android.content.Intent#ACTION_INSERT} intent with a {@code "vnd.android.cursor.item/event"}
258MIME type to start an activity in the Calendar app that creates new events. Using the intent does
259not require any permission and you can specify event details with the following extras:</p>
260
261<ul>
262 <li>{@link android.provider.CalendarContract.EventsColumns#TITLE Events.TITLE}: Name for the
263event</li>
264 <li>{@link
265android.provider.CalendarContract#EXTRA_EVENT_BEGIN_TIME CalendarContract.EXTRA_EVENT_BEGIN_TIME}:
266Event begin time in milliseconds from the
267epoch</li>
268 <li>{@link
269android.provider.CalendarContract#EXTRA_EVENT_END_TIME CalendarContract.EXTRA_EVENT_END_TIME}: Event
270end time in milliseconds from the epoch</li>
271 <li>{@link android.provider.CalendarContract.EventsColumns#EVENT_LOCATION Events.EVENT_LOCATION}:
272Location of the event</li>
273 <li>{@link android.provider.CalendarContract.EventsColumns#DESCRIPTION Events.DESCRIPTION}: Event
274description</li>
275 <li>{@link android.content.Intent#EXTRA_EMAIL Intent.EXTRA_EMAIL}: Email addresses of those to
276invite</li>
277 <li>{@link android.provider.CalendarContract.EventsColumns#RRULE Events.RRULE}: The recurrence
278rule for the event</li>
279 <li>{@link android.provider.CalendarContract.EventsColumns#ACCESS_LEVEL Events.ACCESS_LEVEL}:
280Whether the event is private or public</li>
281 <li>{@link android.provider.CalendarContract.EventsColumns#AVAILABILITY Events.AVAILABILITY}:
282Whether the time period of this event allows for other events to be scheduled at the same time</li>
283</ul>
284
285
286
287
288<h3 id="Voicemail">Voicemail Provider</h3>
289
290<p>The new voicemail APIs allows applications to add voicemails to a content provider on the device.
291Because the APIs currently do not allow third party apps to read all the voicemails from the system,
292the only third-party apps that should use the voicemail APIs are those that have voicemail to
293deliver to the user. For instance, it’s possible that a user has multiple voicemail sources, such as
294one provided by the phone’s service provider and others from VoIP or other alternative voice
295services. These apps can use the APIs to add their voicemails to the system for quick playback. The
296built-in Phone application presents all voicemails from the Voicemail Provider with a single list.
297Although the system’s Phone application is the only application that can read all the voicemails,
298each application that provides voicemails can read those that it has added to the system (but cannot
299read voicemails from other services).</p>
300
301<p>The {@link android.provider.VoicemailContract} class defines the content provider for the
302voicemail APIs. The subclasses {@link android.provider.VoicemailContract.Voicemails} and {@link
303android.provider.VoicemailContract.Status} provide tables in which the Voicemail Providers can
304insert voicemail data for storage on the device. For an example of a voicemail provider app, see the
Scott Mainb57769a2011-10-17 11:20:49 -0700305<a href="{@docRoot}resources/samples/VoicemailProviderDemo/index.html">Voicemail Provider
Scott Maine1e9e932011-10-13 23:36:19 -0700306Demo</a>.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700307
308
309
310
311<h3 id="Camera">Camera</h3>
312
Scott Maine1e9e932011-10-13 23:36:19 -0700313<p>The {@link android.hardware.Camera} class now includes APIs for detecting faces and controlling
314focus and metering areas.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700315
Scott Main1d6f70c2011-10-06 22:57:25 -0700316
Scott Maine1e9e932011-10-13 23:36:19 -0700317<h4>Face detection</h4>
318
319<p>Camera apps can now enhance their abilities with Android’s face detection APIs, which not
320only detect the face of a subject, but also specific facial features, such as the eyes and mouth.
321</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700322
323<p>To detect faces in your camera application, you must register a {@link
324android.hardware.Camera.FaceDetectionListener} by calling {@link
325android.hardware.Camera#setFaceDetectionListener setFaceDetectionListener()}. You can then start
326your camera surface and start detecting faces by calling {@link
327android.hardware.Camera#startFaceDetection}.</p>
328
Scott Maine1e9e932011-10-13 23:36:19 -0700329<p>When the system detects one or more faces in the camera scene, it calls the {@link
Scott Main1d6f70c2011-10-06 22:57:25 -0700330android.hardware.Camera.FaceDetectionListener#onFaceDetection onFaceDetection()} callback in your
331implementation of {@link android.hardware.Camera.FaceDetectionListener}, including an array of
332{@link android.hardware.Camera.Face} objects.</p>
333
334<p>An instance of the {@link android.hardware.Camera.Face} class provides various information about
Scott Maine1e9e932011-10-13 23:36:19 -0700335the face detected, including:</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700336<ul>
337<li>A {@link android.graphics.Rect} that specifies the bounds of the face, relative to the camera's
338current field of view</li>
Scott Mainb57769a2011-10-17 11:20:49 -0700339<li>An integer betwen 1 and 100 that indicates how confident the system is that the object is a
Scott Maine1e9e932011-10-13 23:36:19 -0700340human face</li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700341<li>A unique ID so you can track multiple faces</li>
342<li>Several {@link android.graphics.Point} objects that indicate where the eyes and mouth are
343located</li>
344</ul>
345
Scott Mainb57769a2011-10-17 11:20:49 -0700346<p class="note"><strong>Note:</strong> Face detection may not be supported on some
347devices, so you should check by calling {@link
348android.hardware.Camera.Parameters#getMaxNumDetectedFaces()} and ensure the return
349value is greater than zero. Also, some devices may not support identification of eyes and mouth,
350in which case, those fields in the {@link android.hardware.Camera.Face} object will be null.</p>
351
Scott Maine1e9e932011-10-13 23:36:19 -0700352
353<h4>Focus and metering areas</h4>
Robert Ly6cf7d9a2011-10-12 15:30:35 -0700354
Scott Maine1e9e932011-10-13 23:36:19 -0700355<p>Camera apps can now control the areas that the camera uses for focus and for metering white
Scott Main1d6f70c2011-10-06 22:57:25 -0700356balance
Scott Maine1e9e932011-10-13 23:36:19 -0700357and auto-exposure. Both features use the new {@link android.hardware.Camera.Area} class to specify
358the region of the camera’s current view that should be focused or metered. An instance of the {@link
359android.hardware.Camera.Area} class defines the bounds of the area with a {@link
360android.graphics.Rect} and the area's weight&mdash;representing the level of importance of that
361area, relative to other areas in consideration&mdash;with an integer.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700362
363<p>Before setting either a focus area or metering area, you should first call {@link
364android.hardware.Camera.Parameters#getMaxNumFocusAreas} or {@link
365android.hardware.Camera.Parameters#getMaxNumMeteringAreas}, respectively. If these return zero, then
Scott Maine1e9e932011-10-13 23:36:19 -0700366the device does not support the corresponding feature.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700367
368<p>To specify the focus or metering areas to use, simply call {@link
369android.hardware.Camera.Parameters#setFocusAreas setFocusAreas()} or {@link
370android.hardware.Camera.Parameters#setFocusAreas setMeteringAreas()}. Each take a {@link
371java.util.List} of {@link android.hardware.Camera.Area} objects that indicate the areas to consider
372for focus or metering. For example, you might implement a feature that allows the user to set the
373focus area by touching an area of the preview, which you then translate to an {@link
Scott Maine1e9e932011-10-13 23:36:19 -0700374android.hardware.Camera.Area} object and request that the camera focus on that area of the scene.
375The focus or exposure in that area will continually update as the scene in the area changes.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700376
377
Scott Mainb57769a2011-10-17 11:20:49 -0700378<h4>Continuous auto focus for photos</h4>
379
380<p>You can now enable continuous auto focusing (CAF) when taking photos. To enable CAF in your
381camera app, pass {@link android.hardware.Camera.Parameters#FOCUS_MODE_CONTINUOUS_PICTURE}
382to {@link android.hardware.Camera.Parameters#setFocusMode setFocusMode()}. When ready to capture
383a photo, call {@link android.hardware.Camera#autoFocus autoFocus()}. Your {@link
384android.hardware.Camera.AutoFocusCallback} immediately receives a callback to indicate whether
385focus was acheived. To resume CAF after receiving the callback, you must call {@link
386android.hardware.Camera#cancelAutoFocus()}.</p>
387
388<p class="note"><strong>Note:</strong> Continuous auto focus is also supported when capturing
389video, using {@link android.hardware.Camera.Parameters#FOCUS_MODE_CONTINUOUS_VIDEO}, which was
390added in API level 9.</p>
391
392
Scott Maine1e9e932011-10-13 23:36:19 -0700393<h4>Other camera features</h4>
394
Scott Mainb57769a2011-10-17 11:20:49 -0700395<ul>
Scott Maine1e9e932011-10-13 23:36:19 -0700396<li>While recording video, you can now call {@link android.hardware.Camera#takePicture
397takePicture()} to save a photo without interrupting the video session. Before doing so, you should
398call {@link android.hardware.Camera.Parameters#isVideoSnapshotSupported} to be sure the hardware
399supports it.</li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700400
Scott Mainb57769a2011-10-17 11:20:49 -0700401<li>You can now lock auto exposure and white balance with {@link
Scott Main1d6f70c2011-10-06 22:57:25 -0700402android.hardware.Camera.Parameters#setAutoExposureLock setAutoExposureLock()} and {@link
Scott Mainb57769a2011-10-17 11:20:49 -0700403android.hardware.Camera.Parameters#setAutoWhiteBalanceLock setAutoWhiteBalanceLock()} to prevent
Scott Main1d6f70c2011-10-06 22:57:25 -0700404these properties from changing.</li>
Scott Mainb57769a2011-10-17 11:20:49 -0700405
406<li>You can now call {@link android.hardware.Camera#setDisplayOrientation
407setDisplayOrientation()} while the camera preview is running. Previously, you could call this
408only before beginning the preview, but you can now change the orientation at any time.</li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700409</ul>
410
Scott Maine1e9e932011-10-13 23:36:19 -0700411
412<h4>Camera broadcast intents</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -0700413
414<ul>
Scott Maine1e9e932011-10-13 23:36:19 -0700415<li>{@link android.hardware.Camera#ACTION_NEW_PICTURE Camera.ACTION_NEW_PICTURE}:
416This indicates that the user has captured a new photo. The built-in Camera app invokes this
Scott Main1d6f70c2011-10-06 22:57:25 -0700417broadcast after a photo is captured and third-party camera apps should also broadcast this intent
418after capturing a photo.</li>
Scott Maine1e9e932011-10-13 23:36:19 -0700419<li>{@link android.hardware.Camera#ACTION_NEW_VIDEO Camera.ACTION_NEW_VIDEO}:
420This indicates that the user has captured a new video. The built-in Camera app invokes this
Scott Main1d6f70c2011-10-06 22:57:25 -0700421broadcast after a video is recorded and third-party camera apps should also broadcast this intent
422after capturing a video.</li>
423</ul>
424
Scott Main1d6f70c2011-10-06 22:57:25 -0700425
Robert Ly6cf7d9a2011-10-12 15:30:35 -0700426
427
428
Scott Main1d6f70c2011-10-06 22:57:25 -0700429<h3 id="Multimedia">Multimedia</h3>
430
431<p>Android 4.0 adds several new APIs for applications that interact with media such as photos,
Scott Maine1e9e932011-10-13 23:36:19 -0700432videos, and music.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700433
434
Scott Maine1e9e932011-10-13 23:36:19 -0700435<h4>Media player</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -0700436
437<ul>
Scott Maine1e9e932011-10-13 23:36:19 -0700438<li>Streaming online media from {@link android.media.MediaPlayer} now requires the {@link
Scott Main1d6f70c2011-10-06 22:57:25 -0700439android.Manifest.permission#INTERNET} permission. If you use {@link android.media.MediaPlayer} to
Scott Maine1e9e932011-10-13 23:36:19 -0700440play content from the Internet, be sure to add the {@link android.Manifest.permission#INTERNET}
441permission to your manifest or else your media playback will not work beginning with Android
4424.0.</li>
443
Scott Main1d6f70c2011-10-06 22:57:25 -0700444<li>{@link android.media.MediaPlayer#setSurface(Surface) setSurface()} allows you define a {@link
445android.view.Surface} to behave as the video sink.</li>
Scott Maine1e9e932011-10-13 23:36:19 -0700446
Scott Main1d6f70c2011-10-06 22:57:25 -0700447<li>{@link android.media.MediaPlayer#setDataSource(Context,Uri,Map) setDataSource()} allows you to
448send additional HTTP headers with your request, which can be useful for HTTP(S) live streaming</li>
Scott Maine1e9e932011-10-13 23:36:19 -0700449
Scott Main1d6f70c2011-10-06 22:57:25 -0700450<li>HTTP(S) live streaming now respects HTTP cookies across requests</li>
451</ul>
452
Scott Maine1e9e932011-10-13 23:36:19 -0700453
454<h4>Media types</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -0700455
456<p>Android 4.0 adds support for:</p>
457<ul>
458<li>HTTP/HTTPS live streaming protocol version 3 </li>
459<li>ADTS raw AAC audio encoding</li>
460<li>WEBP images</li>
461<li>Matroska video</li>
462</ul>
Scott Mainb57769a2011-10-17 11:20:49 -0700463<p>For more info, see <a href="{@docRoot}guide/appendix/media-formats.html">Supported Media
Scott Main1d6f70c2011-10-06 22:57:25 -0700464Formats</a>.</p>
465
466
Scott Maine1e9e932011-10-13 23:36:19 -0700467
468<h4>Remote control client</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -0700469
470<p>The new {@link android.media.RemoteControlClient} allows media players to enable playback
Scott Maine1e9e932011-10-13 23:36:19 -0700471controls from remote control clients such as the device lock screen. Media players can also expose
Scott Main1d6f70c2011-10-06 22:57:25 -0700472information about the media currently playing for display on the remote control, such as track
473information and album art.</p>
474
475<p>To enable remote control clients for your media player, instantiate a {@link
Scott Maine1e9e932011-10-13 23:36:19 -0700476android.media.RemoteControlClient} with its constructor, passing it a {@link
477android.app.PendingIntent} that broadcasts {@link
Scott Main1d6f70c2011-10-06 22:57:25 -0700478android.content.Intent#ACTION_MEDIA_BUTTON}. The intent must also declare the explicit {@link
479android.content.BroadcastReceiver} component in your app that handles the {@link
480android.content.Intent#ACTION_MEDIA_BUTTON} event.</p>
481
482<p>To declare which media control inputs your player can handle, you must call {@link
483android.media.RemoteControlClient#setTransportControlFlags setTransportControlFlags()} on your
484{@link android.media.RemoteControlClient}, passing a set of {@code FLAG_KEY_MEDIA_*} flags, such as
485{@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_PREVIOUS} and {@link
486android.media.RemoteControlClient#FLAG_KEY_MEDIA_NEXT}.</p>
487
488<p>You must then register your {@link android.media.RemoteControlClient} by passing it to {@link
489android.media.AudioManager#registerRemoteControlClient MediaManager.registerRemoteControlClient()}.
490Once registered, the broadcast receiver you declared when you instantiated the {@link
491android.media.RemoteControlClient} will receive {@link android.content.Intent#ACTION_MEDIA_BUTTON}
492events when a button is pressed from a remote control. The intent you receive includes the {@link
493android.view.KeyEvent} for the media key pressed, which you can retrieve from the intent with {@link
494android.content.Intent#getParcelableExtra getParcelableExtra(Intent.EXTRA_KEY_EVENT)}.</p>
495
496<p>To display information on the remote control about the media playing, call {@link
497android.media.RemoteControlClient#editMetadata editMetaData()} and add metadata to the returned
498{@link android.media.RemoteControlClient.MetadataEditor}. You can supply a bitmap for media artwork,
499numerical information such as elapsed time, and text information such as the track title. For
500information on available keys see the {@code METADATA_KEY_*} flags in {@link
501android.media.MediaMetadataRetriever}.</p>
502
503<p>For a sample implementation, see the <a
Scott Mainb57769a2011-10-17 11:20:49 -0700504href="{@docRoot}resources/samples/RandomMusicPlayer/index.html">Random Music Player</a>, which
Scott Maine1e9e932011-10-13 23:36:19 -0700505provides compatibility logic such that it enables the remote control client on Android 4.0
506devices while continuing to support devices back to Android 2.1.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700507
508
509<h4>Media Effects</h4>
510
511<p>A new media effects framework allows you to apply a variety of visual effects to images and
Scott Mainb57769a2011-10-17 11:20:49 -0700512videos. For example, image effects allow you to easily fix red-eye, convert an image to grayscale,
513adjust brightness, adjust saturation, rotate an image, apply a fisheye effect, and much more. The
514system performs all effects processing on the GPU to obtain maximum performance.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700515
516<p>For maximum performance, effects are applied directly to OpenGL textures, so your application
Scott Maine1e9e932011-10-13 23:36:19 -0700517must have a valid OpenGL context before it can use the effects APIs. The textures to which you apply
Scott Main1d6f70c2011-10-06 22:57:25 -0700518effects may be from bitmaps, videos or even the camera. However, there are certain restrictions that
519textures must meet:</p>
520<ol>
521<li>They must be bound to a {@link android.opengl.GLES20#GL_TEXTURE_2D} texture image</li>
522<li>They must contain at least one mipmap level</li>
523</ol>
524
525<p>An {@link android.media.effect.Effect} object defines a single media effect that you can apply to
Scott Maine1e9e932011-10-13 23:36:19 -0700526an image frame. The basic workflow to create an {@link android.media.effect.Effect} is:</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700527
528<ol>
529<li>Call {@link android.media.effect.EffectContext#createWithCurrentGlContext
530EffectContext.createWithCurrentGlContext()} from your OpenGL ES 2.0 context.</li>
531<li>Use the returned {@link android.media.effect.EffectContext} to call {@link
532android.media.effect.EffectContext#getFactory EffectContext.getFactory()}, which returns an instance
533of {@link android.media.effect.EffectFactory}.</li>
534<li>Call {@link android.media.effect.EffectFactory#createEffect createEffect()}, passing it an
Scott Maine1e9e932011-10-13 23:36:19 -0700535effect name from @link android.media.effect.EffectFactory}, such as {@link
Scott Main1d6f70c2011-10-06 22:57:25 -0700536android.media.effect.EffectFactory#EFFECT_FISHEYE} or {@link
537android.media.effect.EffectFactory#EFFECT_VIGNETTE}.</li>
538</ol>
539
540<p>Not all devices support all effects, so you must first check if the desired effect is supported
Scott Maine1e9e932011-10-13 23:36:19 -0700541by calling {@link android.media.effect.EffectFactory#isEffectSupported isEffectSupported()}.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700542
Scott Maine1e9e932011-10-13 23:36:19 -0700543<p>You can adjust an effect’s parameters by calling {@link android.media.effect.Effect#setParameter
Scott Main1d6f70c2011-10-06 22:57:25 -0700544setParameter()} and passing a parameter name and parameter value. Each type of effect accepts
545different parameters, which are documented with the effect name. For example, {@link
546android.media.effect.EffectFactory#EFFECT_FISHEYE} has one parameter for the {@code scale} of the
547distortion.</p>
548
549<p>To apply an effect on a texture, call {@link android.media.effect.Effect#apply apply()} on the
550{@link
551android.media.effect.Effect} and pass in the input texture, it’s width and height, and the output
552texture. The input texture must be bound to a {@link android.opengl.GLES20#GL_TEXTURE_2D} texture
553image (usually done by calling the {@link android.opengl.GLES20#glTexImage2D glTexImage2D()}
554function). You may provide multiple mipmap levels. If the output texture has not been bound to a
555texture image, it will be automatically bound by the effect as a {@link
Scott Maine1e9e932011-10-13 23:36:19 -0700556android.opengl.GLES20#GL_TEXTURE_2D} and with one mipmap level (0), which will have the same
557size as the input.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700558
559
560
561
562
563
564
565<h3 id="Bluetooth">Bluetooth</h3>
566
567<p>Android now supports Bluetooth Health Profile devices, so you can create applications that use
568Bluetooth to communicate with health devices that support Bluetooth, such as heart-rate monitors,
569blood meters, thermometers, and scales.</p>
570
571<p>Similar to regular headset and A2DP profile devices, you must call {@link
572android.bluetooth.BluetoothAdapter#getProfileProxy getProfileProxy()} with a {@link
573android.bluetooth.BluetoothProfile.ServiceListener} and the {@link
574android.bluetooth.BluetoothProfile#HEALTH} profile type to establish a connection with the profile
575proxy object.</p>
576
Scott Maine1e9e932011-10-13 23:36:19 -0700577<p>Once you’ve acquired the Health Profile proxy (the {@link android.bluetooth.BluetoothHealth}
Scott Main1d6f70c2011-10-06 22:57:25 -0700578object), connecting to and communicating with paired health devices involves the following new
579Bluetooth classes:</p>
580<ul>
581<li>{@link android.bluetooth.BluetoothHealthCallback}: You must extend this class and implement the
582callback methods to receive updates about changes in the application’s registration state and
583Bluetooth channel state.</li>
584<li>{@link android.bluetooth.BluetoothHealthAppConfiguration}: During callbacks to your {@link
585android.bluetooth.BluetoothHealthCallback}, you’ll receive an instance of this object, which
586provides configuration information about the available Bluetooth health device, which you must use
587to perform various operations such as initiate and terminate connections with the {@link
588android.bluetooth.BluetoothHealth} APIs.</li>
589</ul>
590
Scott Maine1e9e932011-10-13 23:36:19 -0700591<p>For more information about using the Bluetooth Health Profile, see the documentation for {@link
Scott Main1d6f70c2011-10-06 22:57:25 -0700592android.bluetooth.BluetoothHealth}.</p>
593
594
Scott Maine1e9e932011-10-13 23:36:19 -0700595
Scott Main1d6f70c2011-10-06 22:57:25 -0700596<h3 id="AndroidBeam">Android Beam (NDEF Push with NFC)</h3>
597
Scott Maine1e9e932011-10-13 23:36:19 -0700598<p>Android Beam is a new NFC feature that allows you to send NDEF messages from one device to
Scott Mainb57769a2011-10-17 11:20:49 -0700599another (a process also known as “NDEF Push"). The data transfer is initiated when two
Scott Main1d6f70c2011-10-06 22:57:25 -0700600Android-powered devices that support Android Beam are in close proximity (about 4 cm), usually with
601their backs touching. The data inside the NDEF message can contain any data that you wish to share
602between devices. For example, the People app shares contacts, YouTube shares videos, and Browser
603shares URLs using Android Beam.</p>
604
605<p>To transmit data between devices using Android Beam, you need to create an {@link
606android.nfc.NdefMessage} that contains the information you want to share while your activity is in
Scott Maine1e9e932011-10-13 23:36:19 -0700607the foreground. You must then pass the {@link android.nfc.NdefMessage} to the system in one of two
608ways:</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700609
610<ul>
Scott Maine1e9e932011-10-13 23:36:19 -0700611<li>Define a single {@link android.nfc.NdefMessage} to push while in the activity:
Scott Main1d6f70c2011-10-06 22:57:25 -0700612<p>Call {@link android.nfc.NfcAdapter#setNdefPushMessage setNdefPushMessage()} at any time to set
Scott Maine1e9e932011-10-13 23:36:19 -0700613the message you want to send. For instance, you might call this method and pass it your {@link
Scott Main1d6f70c2011-10-06 22:57:25 -0700614android.nfc.NdefMessage} during your activity’s {@link android.app.Activity#onCreate onCreate()}
Scott Maine1e9e932011-10-13 23:36:19 -0700615method. Then, whenever Android Beam is activated with another device while the activity is in the
616foreground, the system sends the {@link android.nfc.NdefMessage} to the other device.</p></li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700617
Scott Maine1e9e932011-10-13 23:36:19 -0700618<li>Define the {@link android.nfc.NdefMessage} to push at the time that Android Beam is initiated:
619<p>Implement {@link android.nfc.NfcAdapter.CreateNdefMessageCallback}, in which your
620implementation of the {@link
621android.nfc.NfcAdapter.CreateNdefMessageCallback#createNdefMessage createNdefMessage()}
Scott Main1d6f70c2011-10-06 22:57:25 -0700622method returns the {@link android.nfc.NdefMessage} you want to send. Then pass the {@link
Scott Maine1e9e932011-10-13 23:36:19 -0700623android.nfc.NfcAdapter.CreateNdefMessageCallback} implementation to {@link
624android.nfc.NfcAdapter#setNdefPushMessageCallback setNdefPushMessageCallback()}.</p>
625<p>In this case, when Android Beam is activated with another device while your activity is in the
626foreground, the system calls {@link
627android.nfc.NfcAdapter.CreateNdefMessageCallback#createNdefMessage createNdefMessage()} to retrieve
628the {@link android.nfc.NdefMessage} you want to send. This allows you to define the {@link
629android.nfc.NdefMessage} to deliver only once Android Beam is initiated, in case the contents
630of the message might vary throughout the life of the activity.</p></li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700631</ul>
632
633<p>In case you want to run some specific code once the system has successfully delivered your NDEF
634message to the other device, you can implement {@link
635android.nfc.NfcAdapter.OnNdefPushCompleteCallback} and set it with {@link
636android.nfc.NfcAdapter#setOnNdefPushCompleteCallback setNdefPushCompleteCallback()}. The system will
637then call {@link android.nfc.NfcAdapter.OnNdefPushCompleteCallback#onNdefPushComplete
638onNdefPushComplete()} when the message is delivered.</p>
639
640<p>On the receiving device, the system dispatches NDEF Push messages in a similar way to regular NFC
641tags. The system invokes an intent with the {@link android.nfc.NfcAdapter#ACTION_NDEF_DISCOVERED}
642action to start an activity, with either a URL or a MIME type set according to the first {@link
643android.nfc.NdefRecord} in the {@link android.nfc.NdefMessage}. For the activity you want to
Scott Maine1e9e932011-10-13 23:36:19 -0700644respond, you can declare intent filters for the URLs or MIME types your app cares about. For more
Scott Main1d6f70c2011-10-06 22:57:25 -0700645information about Tag Dispatch see the <a
Scott Mainb57769a2011-10-17 11:20:49 -0700646href="{@docRoot}guide/topics/nfc/index.html#dispatch">NFC</a> developer guide.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700647
648<p>If you want your {@link android.nfc.NdefMessage} to carry a URI, you can now use the convenience
649method {@link android.nfc.NdefRecord#createUri createUri} to construct a new {@link
650android.nfc.NdefRecord} based on either a string or a {@link android.net.Uri} object. If the URI is
651a special format that you want your application to also receive during an Android Beam event, you
652should create an intent filter for your activity using the same URI scheme in order to receive the
653incoming NDEF message.</p>
654
Scott Mainb57769a2011-10-17 11:20:49 -0700655<p>You should also pass an “Android application record" with your {@link android.nfc.NdefMessage} in
Scott Maine1e9e932011-10-13 23:36:19 -0700656order to guarantee that your application handles the incoming NDEF message, even if other
657applications filter for the same intent action. You can create an Android application record by
658calling {@link android.nfc.NdefRecord#createApplicationRecord createApplicationRecord()}, passing it
659your application’s package name. When the other device receives the NDEF message with the
660application record and multiple applications contain activities that handle the specified intent,
661the system always delivers the message to the activity in your application (based on the matching
662application record). If the target device does not currently have your application installed, the
663system uses the Android application record to launch Android Market and take the user to the
664application in order to install it.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700665
666<p>If your application doesn’t use NFC APIs to perform NDEF Push messaging, then Android provides a
667default behavior: When your application is in the foreground on one device and Android Beam is
668invoked with another Android-powered device, then the other device receives an NDEF message with an
669Android application record that identifies your application. If the receiving device has the
670application installed, the system launches it; if it’s not installed, Android Market opens and takes
Scott Maine1e9e932011-10-13 23:36:19 -0700671the user to your application in order to install it.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700672
Scott Maine1e9e932011-10-13 23:36:19 -0700673<p>For some example code, see the <a
674href="{@docRoot}resources/samples/AndroidBeamDemo/src/com/example/android/beam/Beam.html">Android
675Beam Demo</a> sample app.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700676
677
678
679
Scott Maine09743272011-10-14 11:25:46 -0700680<h3 id="WiFiDirect">Wi-Fi Direct</h3>
Scott Main1d6f70c2011-10-06 22:57:25 -0700681
Scott Maine1e9e932011-10-13 23:36:19 -0700682<p>Android now supports Wi-Fi Direct for peer-to-peer (P2P) connections between Android-powered
Scott Main1d6f70c2011-10-06 22:57:25 -0700683devices and other device types without a hotspot or Internet connection. The Android framework
684provides a set of Wi-Fi P2P APIs that allow you to discover and connect to other devices when each
Scott Maine1e9e932011-10-13 23:36:19 -0700685device supports Wi-Fi Direct, then communicate over a speedy connection across distances much longer
686than a Bluetooth connection.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700687
688<p>A new package, {@link android.net.wifi.p2p}, contains all the APIs for performing peer-to-peer
689connections with Wi-Fi. The primary class you need to work with is {@link
Scott Maine1e9e932011-10-13 23:36:19 -0700690android.net.wifi.p2p.WifiP2pManager}, which you can acquire by calling {@link
Scott Main1d6f70c2011-10-06 22:57:25 -0700691android.app.Activity#getSystemService getSystemService(WIFI_P2P_SERVICE)}. The {@link
Scott Maine1e9e932011-10-13 23:36:19 -0700692android.net.wifi.p2p.WifiP2pManager} includes APIs that allow you to:</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700693<ul>
694<li>Initialize your application for P2P connections by calling {@link
695android.net.wifi.p2p.WifiP2pManager#initialize initialize()}</li>
Scott Maine1e9e932011-10-13 23:36:19 -0700696
Scott Main1d6f70c2011-10-06 22:57:25 -0700697<li>Discover nearby devices by calling {@link android.net.wifi.p2p.WifiP2pManager#discoverPeers
698discoverPeers()}</li>
Scott Maine1e9e932011-10-13 23:36:19 -0700699
Scott Main1d6f70c2011-10-06 22:57:25 -0700700<li>Start a P2P connection by calling {@link android.net.wifi.p2p.WifiP2pManager#connect
701connect()}</li>
702<li>And more</li>
703</ul>
704
705<p>Several other interfaces and classes are necessary as well, such as:</p>
706<ul>
707<li>The {@link android.net.wifi.p2p.WifiP2pManager.ActionListener} interface allows you to receive
708callbacks when an operation such as discovering peers or connecting to them succeeds or fails.</li>
Scott Maine1e9e932011-10-13 23:36:19 -0700709
Scott Main1d6f70c2011-10-06 22:57:25 -0700710<li>{@link android.net.wifi.p2p.WifiP2pManager.PeerListListener} interface allows you to receive
711information about discovered peers. The callback provides a {@link
712android.net.wifi.p2p.WifiP2pDeviceList}, from which you can retrieve a {@link
713android.net.wifi.p2p.WifiP2pDevice} object for each device within range and get information such as
714the device name, address, device type, the WPS configurations the device supports, and more.</li>
Scott Maine1e9e932011-10-13 23:36:19 -0700715
Scott Main1d6f70c2011-10-06 22:57:25 -0700716<li>The {@link android.net.wifi.p2p.WifiP2pManager.GroupInfoListener} interface allows you to
Scott Maine1e9e932011-10-13 23:36:19 -0700717receive information about a P2P group. The callback provides a {@link
718android.net.wifi.p2p.WifiP2pGroup} object, which provides group information such as the owner, the
719network name, and passphrase.</li>
720
Scott Main1d6f70c2011-10-06 22:57:25 -0700721<li>{@link android.net.wifi.p2p.WifiP2pManager.ConnectionInfoListener} interface allows you to
Scott Maine1e9e932011-10-13 23:36:19 -0700722receive information about the current connection. The callback provides a {@link
Scott Main1d6f70c2011-10-06 22:57:25 -0700723android.net.wifi.p2p.WifiP2pInfo} object, which has information such as whether a group has been
724formed and who is the group owner.</li>
725</ul>
726
727<p>In order to use the Wi-Fi P2P APIs, your app must request the following user permissions:</p>
728<ul>
729<li>{@link android.Manifest.permission#ACCESS_WIFI_STATE}</li>
730<li>{@link android.Manifest.permission#CHANGE_WIFI_STATE}</li>
Scott Maine1e9e932011-10-13 23:36:19 -0700731<li>{@link android.Manifest.permission#INTERNET} (although your app doesn’t technically connect
Scott Mainb57769a2011-10-17 11:20:49 -0700732to the Internet, communicating to Wi-Fi Direct peers with standard java sockets requires Internet
733permission).</li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700734</ul>
735
736<p>The Android system also broadcasts several different actions during certain Wi-Fi P2P events:</p>
737<ul>
738<li>{@link android.net.wifi.p2p.WifiP2pManager#WIFI_P2P_CONNECTION_CHANGED_ACTION}: The P2P
Scott Maine1e9e932011-10-13 23:36:19 -0700739connection state has changed. This carries {@link
740android.net.wifi.p2p.WifiP2pManager#EXTRA_WIFI_P2P_INFO} with a {@link
741android.net.wifi.p2p.WifiP2pInfo} object and {@link
Scott Main1d6f70c2011-10-06 22:57:25 -0700742android.net.wifi.p2p.WifiP2pManager#EXTRA_NETWORK_INFO} with a {@link android.net.NetworkInfo}
743object.</li>
Scott Maine1e9e932011-10-13 23:36:19 -0700744
Scott Main1d6f70c2011-10-06 22:57:25 -0700745<li>{@link android.net.wifi.p2p.WifiP2pManager#WIFI_P2P_STATE_CHANGED_ACTION}: The P2P state has
Scott Maine1e9e932011-10-13 23:36:19 -0700746changed between enabled and disabled. It carries {@link
Scott Main1d6f70c2011-10-06 22:57:25 -0700747android.net.wifi.p2p.WifiP2pManager#EXTRA_WIFI_STATE} with either {@link
748android.net.wifi.p2p.WifiP2pManager#WIFI_P2P_STATE_DISABLED} or {@link
749android.net.wifi.p2p.WifiP2pManager#WIFI_P2P_STATE_ENABLED}</li>
Scott Maine1e9e932011-10-13 23:36:19 -0700750
Scott Main1d6f70c2011-10-06 22:57:25 -0700751<li>{@link android.net.wifi.p2p.WifiP2pManager#WIFI_P2P_PEERS_CHANGED_ACTION}: The list of peer
Scott Maine1e9e932011-10-13 23:36:19 -0700752devices has changed.</li>
753
Scott Main1d6f70c2011-10-06 22:57:25 -0700754<li>{@link android.net.wifi.p2p.WifiP2pManager#WIFI_P2P_THIS_DEVICE_CHANGED_ACTION}: The details for
755this device have changed.</li>
756</ul>
757
758<p>See the {@link android.net.wifi.p2p.WifiP2pManager} documentation for more information. Also
Scott Mainb57769a2011-10-17 11:20:49 -0700759look at the <a href="{@docRoot}resources/samples/WiFiDirectDemo/index.html">Wi-Fi Direct Demo</a>
Scott Maine1e9e932011-10-13 23:36:19 -0700760sample application.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700761
762
763
764
765
Scott Maine09743272011-10-14 11:25:46 -0700766<h3 id="NetworkUsage">Network Usage</h3>
Scott Main1d6f70c2011-10-06 22:57:25 -0700767
Scott Maine1e9e932011-10-13 23:36:19 -0700768<p>Android 4.0 gives users precise visibility of how much network data their applications are using.
769The Settings app provides controls that allow users to manage set limits for network data usage and
770even disable the use of background data for individual apps. In order to avoid users disabling your
771app’s access to data from the background, you should develop strategies to use use the data
772connection efficiently and adjust your usage depending on the type of connection available.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700773
774<p>If your application performs a lot of network transactions, you should provide user settings that
775allow users to control your app’s data habits, such as how often your app syncs data, whether to
776perform uploads/downloads only when on Wi-Fi, whether to use data while roaming, etc. With these
777controls available to them, users are much less likely to disable your app’s access to data when
778they approach their limits, because they can instead precisely control how much data your app uses.
Scott Maine1e9e932011-10-13 23:36:19 -0700779If you provide a preference activity with these settings, you should include in its manifest
780declaration an intent filter for the {@link android.content.Intent#ACTION_MANAGE_NETWORK_USAGE}
781action. For example:</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700782
783<pre>
784&lt;activity android:name="DataPreferences" android:label="@string/title_preferences">
785 &lt;intent-filter>
786 &lt;action android:name="android.intent.action.MANAGE_NETWORK_USAGE" />
787 &lt;category android:name="android.intent.category.DEFAULT" />
788 &lt;/intent-filter>
789&lt;/activity>
790</pre>
791
Scott Maine1e9e932011-10-13 23:36:19 -0700792<p>This intent filter indicates to the system that this is the activity that controls your
Scott Main1d6f70c2011-10-06 22:57:25 -0700793application’s data usage. Thus, when the user inspects how much data your app is using from the
Scott Mainb57769a2011-10-17 11:20:49 -0700794Settings app, a “View application settings" button is available that launches your
Scott Maine1e9e932011-10-13 23:36:19 -0700795preference activity so the user can refine how much data your app uses.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700796
797<p>Also beware that {@link android.net.ConnectivityManager#getBackgroundDataSetting()} is now
798deprecated and always returns true&mdash;use {@link
799android.net.ConnectivityManager#getActiveNetworkInfo()} instead. Before you attempt any network
800transactions, you should always call {@link android.net.ConnectivityManager#getActiveNetworkInfo()}
801to get the {@link android.net.NetworkInfo} that represents the current network and query {@link
802android.net.NetworkInfo#isConnected()} to check whether the device has a
Scott Maine1e9e932011-10-13 23:36:19 -0700803connection. You can then check other connection properties, such as whether the device is
Scott Main1d6f70c2011-10-06 22:57:25 -0700804roaming or connected to Wi-Fi.</p>
805
806
807
808
809
810
811
Scott Main1d6f70c2011-10-06 22:57:25 -0700812
Scott Maine1e9e932011-10-13 23:36:19 -0700813<h3 id="RenderScript">RenderScript</h3>
Scott Main1d6f70c2011-10-06 22:57:25 -0700814
Scott Maine1e9e932011-10-13 23:36:19 -0700815<p>Three major features have been added to RenderScript:</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700816
817<ul>
818 <li>Off-screen rendering to a framebuffer object</li>
819 <li>Rendering inside a view</li>
820 <li>RS for each from the framework APIs</li>
821</ul>
822
823<p>The {@link android.renderscript.Allocation} class now supports a {@link
824android.renderscript.Allocation#USAGE_GRAPHICS_RENDER_TARGET} memory space, which allows you to
825render things directly into the {@link android.renderscript.Allocation} and use it as a framebuffer
Scott Maine1e9e932011-10-13 23:36:19 -0700826object.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700827
Scott Maine1e9e932011-10-13 23:36:19 -0700828<p>{@link android.renderscript.RSTextureView} provides a means to display RenderScript graphics
829inside of a {@link android.view.View}, unlike {@link android.renderscript.RSSurfaceView}, which
830creates a separate window. This key difference allows you to do things such as move, transform, or
831animate an {@link android.renderscript.RSTextureView} as well as draw RenderScript graphics inside
832a view that lies within an activity layout.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700833
Scott Maine1e9e932011-10-13 23:36:19 -0700834<p>The {@link android.renderscript.Script#forEach Script.forEach()} method allows you to call
835RenderScript compute scripts from the VM level and have them automatically delegated to available
836cores on the device. You do not use this method directly, but any compute RenderScript that you
837write will have a {@link android.renderscript.Script#forEach forEach()} method that you can call in
838the reflected RenderScript class. You can call the reflected {@link
839android.renderscript.Script#forEach forEach()} method by passing in an input {@link
840android.renderscript.Allocation} to process, an output {@link android.renderscript.Allocation} to
841write the result to, and a {@link android.renderscript.FieldPacker} data structure in case the
842RenderScript needs more information. Only one of the {@link android.renderscript.Allocation}s is
843necessary and the data structure is optional.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700844
845
846
847
848
849
850<h3 id="A11y">Accessibility</h3>
851
Scott Maine1e9e932011-10-13 23:36:19 -0700852<p>Android 4.0 improves accessibility for sight-impaired users with new explore-by-touch mode
853and extended APIs that allow you to provide more information about view content or
854develop advanced accessibility services.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700855
856
Scott Maine1e9e932011-10-13 23:36:19 -0700857<h4>Explore-by-touch mode</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -0700858
Scott Maine1e9e932011-10-13 23:36:19 -0700859<p>Users with vision loss can now explore the screen by touching and dragging a finger across the
860screen to hear voice descriptions of the content. Because the explore-by-touch mode works like a
861virtual cursor, it allows screen readers to identify the descriptive text the same way that screen
862readers can when the user navigates with a d-pad or trackball&mdash;by reading information provided
863by {@link android.R.attr#contentDescription android:contentDescription} and {@link
864android.view.View#setContentDescription setContentDescription()} upon a simulated "hover" event. So,
865consider this is a reminder that you should provide descriptive text for the views in your
866application, especially for {@link android.widget.ImageButton}, {@link android.widget.EditText},
867{@link android.widget.ImageView} and other widgets that might not naturally contain descriptive
868text.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700869
Scott Main1d6f70c2011-10-06 22:57:25 -0700870
Scott Maine1e9e932011-10-13 23:36:19 -0700871<h4>Accessibility for views</h4>
872
873<p>To enhance the information available to accessibility services such as screen readers, you can
874implement new callback methods for accessibility events in your custom {@link
875android.view.View} components.</p>
876
877<p>It's important to first note that the behavior of the {@link
878android.view.View#sendAccessibilityEvent sendAccessibilityEvent()} method has changed in Android
8794.0. As with previous version of Android, when the user enables accessibility services on the device
880and an input event such as a click or hover occurs, the respective view is notified with a call to
881{@link android.view.View#sendAccessibilityEvent sendAccessibilityEvent()}. Previously, the
882implementation of {@link android.view.View#sendAccessibilityEvent sendAccessibilityEvent()} would
883initialize an {@link android.view.accessibility.AccessibilityEvent} and send it to {@link
884android.view.accessibility.AccessibilityManager}. The new behavior involves some additional callback
885methods that allow the view and its parents to add more contextual information to the event:
Scott Main1d6f70c2011-10-06 22:57:25 -0700886<ol>
Scott Maine1e9e932011-10-13 23:36:19 -0700887 <li>When invoked, the {@link
888android.view.View#sendAccessibilityEvent sendAccessibilityEvent()} and {@link
889android.view.View#sendAccessibilityEventUnchecked sendAccessibilityEventUnchecked()} methods defer
890to {@link android.view.View#onInitializeAccessibilityEvent onInitializeAccessibilityEvent()}.
891 <p>Custom implementations of {@link android.view.View} might want to implement {@link
892android.view.View#onInitializeAccessibilityEvent onInitializeAccessibilityEvent()} to
893attach additional accessibility information to the {@link
894android.view.accessibility.AccessibilityEvent}, but should also call the super implementation to
895provide default information such as the standard content description, item index, and more.
896However, you should not add additional text content in this callback&mdash;that happens
897next.</p></li>
898 <li>Once initialized, if the event is one of several types that should be populated with text
899information, the view then receives a call to {@link
900android.view.View#dispatchPopulateAccessibilityEvent dispatchPopulateAccessibilityEvent()}, which
901defers to the {@link android.view.View#onPopulateAccessibilityEvent onPopulateAccessibilityEvent()}
902callback.
903 <p>Custom implementations of {@link android.view.View} should usually implement {@link
904android.view.View#onPopulateAccessibilityEvent onPopulateAccessibilityEvent()} to add additional
905text content to the {@link android.view.accessibility.AccessibilityEvent} if the {@link
906android.R.attr#contentDescription android:contentDescription} text is missing or
907insufficient. To add more text description to the
908{@link android.view.accessibility.AccessibilityEvent}, call {@link
909android.view.accessibility.AccessibilityEvent#getText()}.{@link java.util.List#add add()}.</p>
910</li>
911 <li>At this point, the {@link android.view.View} passes the event up the view hierarchy by calling
912{@link android.view.ViewGroup#requestSendAccessibilityEvent requestSendAccessibilityEvent()} on the
913parent view. Each parent view then has the chance to augment the accessibility information by
914adding an {@link android.view.accessibility.AccessibilityRecord}, until it
915ultimately reaches the root view, which sends the event to the {@link
916android.view.accessibility.AccessibilityManager} with {@link
917android.view.accessibility.AccessibilityManager#sendAccessibilityEvent
918sendAccessibilityEvent()}.</li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700919</ol>
920
Scott Maine1e9e932011-10-13 23:36:19 -0700921<p>In addition to the new methods above, which are useful when extending the {@link
922android.view.View} class, you can also intercept these event callbacks on any {@link
923android.view.View} by extending {@link
924android.view.View.AccessibilityDelegate AccessibilityDelegate} and setting it on the view with
925{@link android.view.View#setAccessibilityDelegate setAccessibilityDelegate()}.
926When you do, each accessibility method in the view defers the call to the corresponding method in
927the delegate. For example, when the view receives a call to {@link
928android.view.View#onPopulateAccessibilityEvent onPopulateAccessibilityEvent()}, it passes it to the
929same method in the {@link android.view.View.AccessibilityDelegate}. Any methods not handled by
930the delegate are given right back to the view for default behavior. This allows you to override only
931the methods necessary for any given view without extending the {@link android.view.View} class.</p>
932
933
934<p>If you want to maintain compatibility with Android versions prior to 4.0, while also supporting
935the new the accessibility APIs, you can do so with the latest version of the <em>v4 support
936library</em> (in <a href="{@docRoot}sdk/compatibility-library.html">Compatibility Package, r4</a>)
937using a set of utility classes that provide the new accessibility APIs in a backward-compatible
938design.</p>
939
940
941
942<h4>Accessibility services</h4>
943
944<p>If you're developing an accessibility service, the information about various accessibility events
945has been significantly expanded to enable more advanced accessibility feedback for users. In
946particular, events are generated based on view composition, providing better context information and
947allowing accessibility services to traverse view hierarchies to get additional view information and
948deal with special cases.</p>
949
950<p>If you're developing an accessibility service (such as a screen reader), you can access
951additional content information and traverse view hierarchies with the following procedure:</p>
952<ol>
953<li>Upon receiving an {@link android.view.accessibility.AccessibilityEvent} from an application,
954call the {@link android.view.accessibility.AccessibilityEvent#getRecord(int)
955AccessibilityEvent.getRecord()} to retrieve a specific {@link
956android.view.accessibility.AccessibilityRecord} (there may be several records attached to the
957event).</li>
958
959<li>From either {@link android.view.accessibility.AccessibilityEvent} or an individual {@link
960android.view.accessibility.AccessibilityRecord}, you can call {@link
961android.view.accessibility.AccessibilityRecord#getSource() getSource()} to retrieve a {@link
962android.view.accessibility.AccessibilityNodeInfo} object.
963 <p>An {@link android.view.accessibility.AccessibilityNodeInfo} represents a single node
964of the window content in a format that allows you to query accessibility information about that
965node. The {@link android.view.accessibility.AccessibilityNodeInfo} object returned from {@link
966android.view.accessibility.AccessibilityEvent} describes the event source, whereas the source from
967an {@link android.view.accessibility.AccessibilityRecord} describes the predecessor of the event
968source.</p></li>
969
970<li>With the {@link android.view.accessibility.AccessibilityNodeInfo}, you can query information
971about it, call {@link
972android.view.accessibility.AccessibilityNodeInfo#getParent getParent()} or {@link
973android.view.accessibility.AccessibilityNodeInfo#getChild getChild()} to traverse the view
974hierarchy, and even add child views to the node.</li>
975</ol>
976
977<p>In order for your application to publish itself to the system as an accessibility service, it
978must declare an XML configuration file that corresponds to {@link
979android.accessibilityservice.AccessibilityServiceInfo}. For more information about creating an
980accessibility service, see {@link
Scott Main1d6f70c2011-10-06 22:57:25 -0700981android.accessibilityservice.AccessibilityService} and {@link
982android.accessibilityservice.AccessibilityService#SERVICE_META_DATA
Scott Maine1e9e932011-10-13 23:36:19 -0700983SERVICE_META_DATA} for information about the XML configuration.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700984
985
Scott Maine1e9e932011-10-13 23:36:19 -0700986<h4>Other accessibility APIs</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -0700987
Scott Maine1e9e932011-10-13 23:36:19 -0700988<p>If you're interested in the device's accessibility state, the {@link
989android.view.accessibility.AccessibilityManager} has some new APIs such as:</p>
990<ul>
991 <li>{@link android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener}
992is an interface that allows you to receive a callback whenever accessibility is enabled or
993disabled.</li>
994 <li>{@link android.view.accessibility.AccessibilityManager#getEnabledAccessibilityServiceList
995 getEnabledAccessibilityServiceList()} provides information about which accessibility services
996 are currently enabled.</li>
997 <li>{@link android.view.accessibility.AccessibilityManager#isTouchExplorationEnabled()} tells
998 you whether the explore-by-touch mode is enabled.</li>
999</ul>
Scott Main1d6f70c2011-10-06 22:57:25 -07001000
1001
1002
1003<h3 id="Enterprise">Enterprise</h3>
1004
1005<p>Android 4.0 expands the capabilities for enterprise application with the following features.</p>
1006
Scott Maine1e9e932011-10-13 23:36:19 -07001007<h4>VPN services</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -07001008
1009<p>The new {@link android.net.VpnService} allows applications to build their own VPN (Virtual
Scott Maine1e9e932011-10-13 23:36:19 -07001010Private Network), running as a {@link android.app.Service}. A VPN service creates an interface for a
1011virtual network with its own address and routing rules and performs all reading and writing with a
1012file descriptor.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001013
1014<p>To create a VPN service, use {@link android.net.VpnService.Builder}, which allows you to specify
1015the network address, DNS server, network route, and more. When complete, you can establish the
1016interface by calling {@link android.net.VpnService.Builder#establish()}, which returns a {@link
1017android.os.ParcelFileDescriptor}. </p>
1018
1019<p>Because a VPN service can intercept packets, there are security implications. As such, if you
1020implement {@link android.net.VpnService}, then your service must require the {@link
1021android.Manifest.permission#BIND_VPN_SERVICE} to ensure that only the system can bind to it (only
1022the system is granted this permission&mdash;apps cannot request it). To then use your VPN service,
1023users must manually enable it in the system settings.</p>
1024
1025
Scott Maine1e9e932011-10-13 23:36:19 -07001026<h4>Device restrictions</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -07001027
1028<p>Applications that manage the device restrictions can now disable the camera using {@link
1029android.app.admin.DevicePolicyManager#setCameraDisabled setCameraDisabled()} and the {@link
1030android.app.admin.DeviceAdminInfo#USES_POLICY_DISABLE_CAMERA} property (applied with a {@code
1031&lt;disable-camera /&gt;} element in the policy configuration file).</p>
1032
1033
Scott Maine1e9e932011-10-13 23:36:19 -07001034<h4>Certificate management</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -07001035
1036<p>The new {@link android.security.KeyChain} class provides APIs that allow you to import and access
Scott Maine1e9e932011-10-13 23:36:19 -07001037certificates in the system key store. Certificates streamline the installation of both client
1038certificates (to validate the identity of the user) and certificate authority certificates (to
1039verify server identity). Applications such as web browsers or email clients can access the installed
1040certificates to authenticate users to servers. See the {@link android.security.KeyChain}
Scott Main1d6f70c2011-10-06 22:57:25 -07001041documentation for more information.</p>
1042
1043
1044
1045
Scott Main1d6f70c2011-10-06 22:57:25 -07001046
1047
1048
Scott Maine1e9e932011-10-13 23:36:19 -07001049<h3 id="Sensors">Device Sensors</h3>
Scott Main1d6f70c2011-10-06 22:57:25 -07001050
Scott Maine1e9e932011-10-13 23:36:19 -07001051<p>Two new sensor types have been added in Android 4.0:</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001052
Scott Maine1e9e932011-10-13 23:36:19 -07001053<ul>
1054 <li>{@link android.hardware.Sensor#TYPE_AMBIENT_TEMPERATURE}: A temperature sensor that provides
1055the ambient (room) temperature in degrees Celsius.</li>
1056 <li>{@link android.hardware.Sensor#TYPE_RELATIVE_HUMIDITY}: A humidity sensor that provides the
1057relative ambient (room) humidity as a percentage.</li>
1058</ul>
Scott Main1d6f70c2011-10-06 22:57:25 -07001059
Scott Maine1e9e932011-10-13 23:36:19 -07001060<p>If a device has both {@link android.hardware.Sensor#TYPE_AMBIENT_TEMPERATURE} and {@link
1061android.hardware.Sensor#TYPE_RELATIVE_HUMIDITY} sensors, you can use them to calculate the dew point
1062and the absolute humidity.</p>
1063
1064<p>The previous temperature sensor, {@link android.hardware.Sensor#TYPE_TEMPERATURE}, has been
1065deprecated. You should use the {@link android.hardware.Sensor#TYPE_AMBIENT_TEMPERATURE} sensor
1066instead.</p>
1067
1068<p>Additionally, Android’s three synthetic sensors have been improved so they now have lower latency
1069and smoother output. These sensors include the gravity sensor ({@link
1070android.hardware.Sensor#TYPE_GRAVITY}), rotation vector sensor ({@link
1071android.hardware.Sensor#TYPE_ROTATION_VECTOR}), and linear acceleration sensor ({@link
1072android.hardware.Sensor#TYPE_LINEAR_ACCELERATION}). The improved sensors rely on the gyroscope
1073sensor to improve their output, so the sensors appear only on devices that have a gyroscope.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001074
1075
1076
1077
1078
1079<h3 id="TTS">Text-to-speech Engines</h3>
1080
Scott Maine1e9e932011-10-13 23:36:19 -07001081<p>Android’s text-to-speech (TTS) APIs have been significantly extended to allow applications to
1082more easily implement custom TTS engines, while applications that want to use a TTS engine have a
1083couple new APIs for selecting an engine.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001084
1085
1086<h4>Using text-to-speech engines</h4>
1087
1088<p>In previous versions of Android, you could use the {@link android.speech.tts.TextToSpeech} class
Scott Maine1e9e932011-10-13 23:36:19 -07001089to perform text-to-speech (TTS) operations using the TTS engine provided by the system or set a
1090custom engine using {@link android.speech.tts.TextToSpeech#setEngineByPackageName
1091setEngineByPackageName()}. In Android 4.0, the {@link
1092android.speech.tts.TextToSpeech#setEngineByPackageName setEngineByPackageName()} method has been
1093deprecated and you can now specify the engine to use with a new {@link
1094android.speech.tts.TextToSpeech} constructor that accepts the package name of a TTS engine.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001095
1096<p>You can also query the available TTS engines with {@link
1097android.speech.tts.TextToSpeech#getEngines()}. This method returns a list of {@link
1098android.speech.tts.TextToSpeech.EngineInfo} objects, which include meta data such as the engine’s
1099icon, label, and package name.</p>
1100
1101
1102<h4>Building text-to-speech engines</h4>
1103
Scott Maine1e9e932011-10-13 23:36:19 -07001104<p>Previously, custom engines required that the engine be built using an undocumented native header
1105file. In Android 4.0, there is a complete set of framework APIs for building TTS engines. </p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001106
1107<p>The basic setup requires an implementation of {@link android.speech.tts.TextToSpeechService} that
1108responds to the {@link android.speech.tts.TextToSpeech.Engine#INTENT_ACTION_TTS_SERVICE} intent. The
1109primary work for a TTS engine happens during the {@link
Scott Maine1e9e932011-10-13 23:36:19 -07001110android.speech.tts.TextToSpeechService#onSynthesizeText onSynthesizeText()} callback in a service
1111that extends {@link android.speech.tts.TextToSpeechService}. The system delivers this method two
1112objects:</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001113<ul>
1114<li>{@link android.speech.tts.SynthesisRequest}: This contains various data including the text to
1115synthesize, the locale, the speech rate, and voice pitch.</li>
1116<li>{@link android.speech.tts.SynthesisCallback}: This is the interface by which your TTS engine
Scott Maine1e9e932011-10-13 23:36:19 -07001117delivers the resulting speech data as streaming audio. First the engine must call {@link
Scott Main1d6f70c2011-10-06 22:57:25 -07001118android.speech.tts.SynthesisCallback#start start()} to indicate that the engine is ready to deliver
Scott Maine1e9e932011-10-13 23:36:19 -07001119the audio, then call {@link android.speech.tts.SynthesisCallback#audioAvailable audioAvailable()},
1120passing it the audio data in a byte buffer. Once your engine has passed all audio through the
1121buffer, call {@link android.speech.tts.SynthesisCallback#done()}.</li>
Scott Main1d6f70c2011-10-06 22:57:25 -07001122</ul>
1123
Scott Maine1e9e932011-10-13 23:36:19 -07001124<p>Now that the framework supports a true API for creating TTS engines, support for the native code
1125implementation has been removed. Look for a blog post about a compatibility layer
1126that you can use to convert your old TTS engines to the new framework.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001127
1128<p>For an example TTS engine using the new APIs, see the <a
Scott Mainb57769a2011-10-17 11:20:49 -07001129href="{@docRoot}resources/samples/TtsEngine/index.html">Text To Speech Engine</a> sample app.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001130
1131
1132
1133
1134
1135
Scott Maine1e9e932011-10-13 23:36:19 -07001136<h3 id="SpellChecker">Spell Checker Services</h3>
1137
1138<p>A new spell checker framework allows apps to create spell checkers in a manner similar to the
1139input method framework. To create a new spell checker, you must implement a service that extends
1140{@link android.service.textservice.SpellCheckerService} and extend the {@link
1141android.service.textservice.SpellCheckerService.Session} class to provide spelling suggestions based
1142on text provided by interface callback methods. In the {@link
1143android.service.textservice.SpellCheckerService.Session} callback methods, you must return the
1144spelling suggestions as {@link android.view.textservice.SuggestionsInfo} objects. </p>
1145
1146<p>Applications with a spell checker service must declare the {@link
1147android.Manifest.permission#BIND_TEXT_SERVICE} permission as required by the service, such that
1148other services must have this permission in order for them to bind with the spell checker service.
1149The service must also declare an intent filter with {@code &lt;action
1150android:name="android.service.textservice.SpellCheckerService" />} as the intent’s action and should
1151include a {@code &lt;meta-data&gt;} element that declares configuration information for the spell
1152checker. </p>
1153
1154
1155
1156
Scott Main1d6f70c2011-10-06 22:57:25 -07001157
1158
1159
1160
1161
1162<h3 id="ActionBar">Action Bar</h3>
1163
1164<p>The {@link android.app.ActionBar} has been updated to support several new behaviors. Most
1165importantly, the system gracefully manages the action bar’s size and configuration when running on
Scott Maine1e9e932011-10-13 23:36:19 -07001166smaller screens in order to provide an optimal user experience on all screen sizes. For example,
1167when the screen is narrow (such as when a handset is in portrait orientation), the action bar’s
Scott Mainb57769a2011-10-17 11:20:49 -07001168navigation tabs appear in a “stacked bar," which appears directly below the main action bar. You can
1169also opt-in to a “split action bar," which places all action items in a separate bar at the bottom
Scott Maine1e9e932011-10-13 23:36:19 -07001170of the screen when the screen is narrow.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001171
1172
Scott Maine1e9e932011-10-13 23:36:19 -07001173<h4>Split action bar</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -07001174
Scott Maine1e9e932011-10-13 23:36:19 -07001175<p>If your action bar includes several action items, not all of them will fit into the action bar on
1176a narrow screen, so the system will place more of them into the overflow menu. However, Android 4.0
Scott Mainb57769a2011-10-17 11:20:49 -07001177allows you to enable “split action bar" so that more action items can appear on the screen in a
Scott Main1d6f70c2011-10-06 22:57:25 -07001178separate bar at the bottom of the screen. To enable split action bar, add {@link
Scott Mainb57769a2011-10-17 11:20:49 -07001179android.R.attr#uiOptions android:uiOptions} with {@code "splitActionBarWhenNarrow"} to either your
Scott Maine1e9e932011-10-13 23:36:19 -07001180<a href="guide/topics/manifest/application-element.html">{@code &lt;application&gt;}</a> tag or
1181individual <a href="guide/topics/manifest/activity-element.html">{@code &lt;activity&gt;}</a> tags
1182in your manifest file. When enabled, the system will add an additional bar at the bottom of the
1183screen for all action items when the screen is narrow (no action items will appear in the primary
1184action bar).</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001185
1186<p>If you want to use the navigation tabs provided by the {@link android.app.ActionBar.Tab} APIs,
Scott Maine1e9e932011-10-13 23:36:19 -07001187but don’t need the main action bar on top (you want only the tabs to appear at the top), then enable
1188the split action bar as described above and also call {@link
1189android.app.ActionBar#setDisplayShowHomeEnabled setDisplayShowHomeEnabled(false)} to disable the
1190application icon in the action bar. With nothing left in the main action bar, it
1191disappears&mdash;all that’s left are the navigation tabs at the top and the action items at the
1192bottom of the screen.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001193
1194
Scott Maine1e9e932011-10-13 23:36:19 -07001195<h4>Action bar styles</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -07001196
1197<p>If you want to apply custom styling to the action bar, you can use new style properties {@link
1198android.R.attr#backgroundStacked} and {@link android.R.attr#backgroundSplit} to apply a background
1199drawable or color to the stacked bar and split bar, respectively. You can also set these styles at
1200runtime with {@link android.app.ActionBar#setStackedBackgroundDrawable
1201setStackedBackgroundDrawable()} and {@link android.app.ActionBar#setSplitBackgroundDrawable
1202setSplitBackgroundDrawable()}.</p>
1203
1204
Scott Maine1e9e932011-10-13 23:36:19 -07001205<h4>Action provider</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -07001206
Scott Maine1e9e932011-10-13 23:36:19 -07001207<p>The new {@link android.view.ActionProvider} class allows you to create a specialized handler for
1208action items. An action provider can define an action view, a default action behavior, and a submenu
1209for each action item to which it is associated. When you want to create an action item that has
1210dynamic behaviors (such as a variable action view, default action, or submenu), extending {@link
1211android.view.ActionProvider} is a good solution in order to create a reusable component, rather than
1212handling the various action item transformations in your fragment or activity.</p>
1213
1214<p>For example, the {@link android.widget.ShareActionProvider} is an extension of {@link
Scott Mainb57769a2011-10-17 11:20:49 -07001215android.view.ActionProvider} that facilitates a “share" action from the action bar. Instead of using
Scott Maine1e9e932011-10-13 23:36:19 -07001216traditional action item that invokes the {@link android.content.Intent#ACTION_SEND} intent, you can
1217use this action provider to present an action view with a drop-down list of applications that handle
1218the {@link android.content.Intent#ACTION_SEND} intent. When the user selects an application to use
1219for the action, {@link android.widget.ShareActionProvider} remembers that selection and provides it
1220in the action view for faster access to sharing with that app.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001221
1222<p>To declare an action provider for an action item, include the {@code android:actionProviderClass}
Scott Maine1e9e932011-10-13 23:36:19 -07001223attribute in the <a href="{@docRoot}guide/topics/resources/menu-resource.html#item-element">{@code
1224&lt;item&gt;}</a> element for your activity’s options menu, with the class name of the action
1225provider as the value. For example:</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001226
1227<pre>
1228&lt;item android:id="@+id/menu_share"
1229 android:title="Share"
Scott Main1d6f70c2011-10-06 22:57:25 -07001230 android:showAsAction="ifRoom"
1231 android:actionProviderClass="android.widget.ShareActionProvider" /&gt;
1232</pre>
1233
1234<p>In your activity’s {@link android.app.Activity#onCreateOptionsMenu onCreateOptionsMenu()}
Scott Maine1e9e932011-10-13 23:36:19 -07001235callback method, retrieve an instance of the action provider from the menu item and set the
1236intent:</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001237
1238<pre>
1239public boolean onCreateOptionsMenu(Menu menu) {
1240 getMenuInflater().inflate(R.menu.options, menu);
1241 ShareActionProvider shareActionProvider =
1242 (ShareActionProvider) menu.findItem(R.id.menu_share).getActionProvider();
1243 // Set the share intent of the share action provider.
1244 shareActionProvider.setShareIntent(createShareIntent());
1245 ...
1246 return super.onCreateOptionsMenu(menu);
1247}
1248</pre>
1249
1250<p>For an example using the {@link android.widget.ShareActionProvider}, see the <a
Scott Mainb57769a2011-10-17 11:20:49 -07001251href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/
1252ActionBarActionProviderActivity.html">ActionBarActionProviderActivity</a>
Scott Main1d6f70c2011-10-06 22:57:25 -07001253class in ApiDemos.</p>
1254
1255
Scott Maine1e9e932011-10-13 23:36:19 -07001256<h4>Collapsible action views</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -07001257
Scott Maine1e9e932011-10-13 23:36:19 -07001258<p>Action items that provide an action view can now toggle between their action view state and
Scott Main1d6f70c2011-10-06 22:57:25 -07001259traditional action item state. Previously only the {@link android.widget.SearchView} supported
1260collapsing when used as an action view, but now you can add an action view for any action item and
1261switch between the expanded state (action view is visible) and collapsed state (action item is
1262visible).</p>
1263
1264<p>To declare that an action item that contains an action view be collapsible, include the {@code
Scott Mainb57769a2011-10-17 11:20:49 -07001265“collapseActionView"} flag in the {@code android:showAsAction} attribute for the <a
Scott Maine1e9e932011-10-13 23:36:19 -07001266href="{@docRoot}guide/topics/resources/menu-resource.html#item-element">{@code
1267&lt;item&gt;}</a> element in the menu’s XML file.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001268
1269<p>To receive callbacks when an action view switches between expanded and collapsed, register an
1270instance of {@link android.view.MenuItem.OnActionExpandListener} with the respective {@link
1271android.view.MenuItem} by calling {@link android.view.MenuItem#setOnActionExpandListener
1272setOnActionExpandListener()}. Typically, you should do so during the {@link
1273android.app.Activity#onCreateOptionsMenu onCreateOptionsMenu()} callback.</p>
1274
1275<p>To control a collapsible action view, you can call {@link
1276android.view.MenuItem#collapseActionView()} and {@link android.view.MenuItem#expandActionView()} on
1277the respective {@link android.view.MenuItem}.</p>
1278
1279<p>When creating a custom action view, you can also implement the new {@link
1280android.view.CollapsibleActionView} interface to receive callbacks when the view is expanded and
1281collapsed.</p>
1282
1283
Scott Maine1e9e932011-10-13 23:36:19 -07001284<h4>Other APIs for action bar</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -07001285<ul>
Scott Maine1e9e932011-10-13 23:36:19 -07001286<li>{@link android.app.ActionBar#setHomeButtonEnabled setHomeButtonEnabled()} allows you to specify
Scott Mainb57769a2011-10-17 11:20:49 -07001287whether the icon/logo behaves as a button to navigate home or “up" (pass “true" to make it behave as
Scott Maine1e9e932011-10-13 23:36:19 -07001288a button).</li>
1289
Scott Main1d6f70c2011-10-06 22:57:25 -07001290<li>{@link android.app.ActionBar#setIcon setIcon()} and {@link android.app.ActionBar#setLogo
Scott Maine1e9e932011-10-13 23:36:19 -07001291setLogo()} allow you to define the action bar icon or logo at runtime.</li>
1292
Scott Main1d6f70c2011-10-06 22:57:25 -07001293<li>{@link android.app.Fragment#setMenuVisibility Fragment.setMenuVisibility()} allows you to enable
Scott Maine1e9e932011-10-13 23:36:19 -07001294or disable the visibility of the options menu items declared by the fragment. This is useful if the
Scott Main1d6f70c2011-10-06 22:57:25 -07001295fragment has been added to the activity, but is not visible, so the menu items should be
1296hidden.</li>
Scott Maine1e9e932011-10-13 23:36:19 -07001297
Scott Main1d6f70c2011-10-06 22:57:25 -07001298<li>{@link android.app.FragmentManager#invalidateOptionsMenu
1299FragmentManager.invalidateOptionsMenu()}
1300allows you to invalidate the activity options menu during various states of the fragment lifecycle
1301in which using the equivalent method from {@link android.app.Activity} might not be available.</li>
1302</ul>
1303
1304
1305
1306
1307
1308
1309
1310
1311<h3 id="UI">User Interface and Views</h3>
1312
1313<p>Android 4.0 introduces a variety of new views and other UI components.</p>
1314
Scott Maine1e9e932011-10-13 23:36:19 -07001315
Scott Main1d6f70c2011-10-06 22:57:25 -07001316<h4>System UI</h4>
1317
1318<p>Since the early days of Android, the system has managed a UI component known as the <em>status
1319bar</em>, which resides at the top of handset devices to deliver information such as the carrier
1320signal, time, notifications, and so on. Android 3.0 added the <em>system bar</em> for tablet
1321devices, which resides at the bottom of the screen to provide system navigation controls (Home,
1322Back, and so forth) and also an interface for elements traditionally provided by the status bar. In
1323Android 4.0, the system provides a new type of system UI called the <em>navigation bar</em>. The
1324navigation bar shares some qualities with the system bar, because it provides navigation controls
1325for devices that don’t have hardware counterparts for navigating the system, but the navigation
Scott Maine1e9e932011-10-13 23:36:19 -07001326controls is all that the navigation bar offers (a device with the navigation bar, thus, also
1327includes the status bar at the top of the screen).</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001328
1329<p>To this day, you can hide the status bar on handsets using the {@link
1330android.view.WindowManager.LayoutParams#FLAG_FULLSCREEN} flag. In Android 4.0, the APIs that control
1331the system bar’s visibility have been updated to better reflect the behavior of both the system bar
1332and navigation bar:</p>
1333<ul>
1334<li>The {@link android.view.View#SYSTEM_UI_FLAG_LOW_PROFILE} flag replaces View.STATUS_BAR_HIDDEN
Scott Mainb57769a2011-10-17 11:20:49 -07001335flag. When set, this flag enables “low profile" mode for the system bar or
Scott Maine1e9e932011-10-13 23:36:19 -07001336navigation bar. Navigation buttons dim and other elements in the system bar also hide.</li>
1337
Scott Main1d6f70c2011-10-06 22:57:25 -07001338<li>The {@link android.view.View#SYSTEM_UI_FLAG_VISIBLE} flag replaces the {@code
Scott Maine1e9e932011-10-13 23:36:19 -07001339STATUS_BAR_VISIBLE} flag to request the system bar or navigation bar be visible.</li>
1340
Scott Main1d6f70c2011-10-06 22:57:25 -07001341<li>The {@link android.view.View#SYSTEM_UI_FLAG_HIDE_NAVIGATION} is a new flag that requests that
Scott Maine1e9e932011-10-13 23:36:19 -07001342the navigation bar hide completely. Take note that this works only for the <em>navigation bar</em>
1343used by some handsets (it does <strong>not</strong> hide the system bar on tablets). The navigation
1344bar returns as soon as the system receives user input. As such, this mode is generally used for
1345video playback or other cases in which the whole screen is needed but user input is not
1346required.</li>
Scott Main1d6f70c2011-10-06 22:57:25 -07001347</ul>
1348
Scott Maine1e9e932011-10-13 23:36:19 -07001349<p>You can set each of these flags for the system bar and navigation bar by calling {@link
1350android.view.View#setSystemUiVisibility setSystemUiVisibility()} on any view in your activity. The
1351window manager will combine (OR-together) all flags from all views in your window and
Scott Main1d6f70c2011-10-06 22:57:25 -07001352apply them to the system UI as long as your window has input focus. When your window loses input
1353focus (the user navigates away from your app, or a dialog appears), your flags cease to have effect.
1354Similarly, if you remove those views from the view hierarchy their flags no longer apply.</p>
1355
1356<p>To synchronize other events in your activity with visibility changes to the system UI (for
Scott Maine1e9e932011-10-13 23:36:19 -07001357example, hide the action bar or other UI controls when the system UI hides), you should register a
1358{@link android.view.View.OnSystemUiVisibilityChangeListener} to be notified when the visibility
1359of the system bar or navigation bar changes.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001360
1361<p>See the <a
Scott Mainb57769a2011-10-17 11:20:49 -07001362href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/view/OverscanActivity.html">
Scott Main1d6f70c2011-10-06 22:57:25 -07001363OverscanActivity</a> class for a demonstration of different system UI options.</p>
1364
1365
1366<h4>GridLayout</h4>
1367
1368<p>{@link android.widget.GridLayout} is a new view group that places child views in a rectangular
Scott Maine1e9e932011-10-13 23:36:19 -07001369grid. Unlike {@link android.widget.TableLayout}, {@link android.widget.GridLayout} relies on a flat
Scott Main1d6f70c2011-10-06 22:57:25 -07001370hierarchy and does not make use of intermediate views such as table rows for providing structure.
1371Instead, children specify which row(s) and column(s) they should occupy (cells can span multiple
1372rows and/or columns), and by default are laid out sequentially across the grid’s rows and columns.
1373The {@link android.widget.GridLayout} orientation determines whether sequential children are by
1374default laid out horizontally or vertically. Space between children may be specified either by using
1375instances of the new {@link android.widget.Space} view or by setting the relevant margin parameters
1376on children.</p>
1377
1378<p>See <a
Scott Mainb57769a2011-10-17 11:20:49 -07001379href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/view/index.html">ApiDemos</a
1380>
Scott Main1d6f70c2011-10-06 22:57:25 -07001381for samples using {@link android.widget.GridLayout}.</p>
1382
1383
1384
1385<h4>TextureView</h4>
1386
1387<p>{@link android.view.TextureView} is a new view that allows you to display a content stream, such
Scott Maine1e9e932011-10-13 23:36:19 -07001388as a video or an OpenGL scene. Although similar to {@link android.view.SurfaceView}, {@link
Scott Main1d6f70c2011-10-06 22:57:25 -07001389android.view.TextureView} is unique in that it behaves like a regular view, rather than creating a
1390separate window, so you can treat it like any other {@link android.view.View} object. For example,
Scott Maine1e9e932011-10-13 23:36:19 -07001391you can apply transforms, animate it using {@link android.view.ViewPropertyAnimator}, or
Scott Main1d6f70c2011-10-06 22:57:25 -07001392adjust its opacity with {@link android.view.View#setAlpha setAlpha()}.</p>
1393
1394<p>Beware that {@link android.view.TextureView} works only within a hardware accelerated window.</p>
1395
1396<p>For more information, see the {@link android.view.TextureView} documentation.</p>
1397
1398
Scott Maine1e9e932011-10-13 23:36:19 -07001399<h4>Switch widget</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -07001400
1401<p>The new {@link android.widget.Switch} widget is a two-state toggle that users can drag to one
Scott Maine1e9e932011-10-13 23:36:19 -07001402side or the other (or simply tap) to toggle an option between two states.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001403
Scott Maine1e9e932011-10-13 23:36:19 -07001404<p>You can use the {@code android:textOn} and {@code android:textOff} attributes to specify the text
1405to appear on the switch when in the on and off setting. The {@code android:text} attribute also
1406allows you to place a label alongside the switch.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001407
1408<p>For a sample using switches, see the <a
Scott Mainb57769a2011-10-17 11:20:49 -07001409href="{@docRoot}resources/samples/ApiDemos/res/layout/switches.html">switches.xml</a> layout file
Scott Main1d6f70c2011-10-06 22:57:25 -07001410and respective <a
Scott Mainb57769a2011-10-17 11:20:49 -07001411href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/view/Switches.html">Switches
Scott Main1d6f70c2011-10-06 22:57:25 -07001412</a> activity.</p>
1413
1414
Scott Maine1e9e932011-10-13 23:36:19 -07001415<h4>Popup menus</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -07001416
1417<p>Android 3.0 introduced {@link android.widget.PopupMenu} to create short contextual menus that pop
Scott Maine1e9e932011-10-13 23:36:19 -07001418up at an anchor point you specify (usually at the point of the item selected). Android 4.0 extends
1419the {@link android.widget.PopupMenu} with a couple useful features:</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001420<ul>
1421<li>You can now easily inflate the contents of a popup menu from an XML <a
Scott Mainb57769a2011-10-17 11:20:49 -07001422href="{@docRoot}guide/topics/resources/menu-resource.html">menu resource</a> with {@link
Scott Main1d6f70c2011-10-06 22:57:25 -07001423android.widget.PopupMenu#inflate inflate()}, passing it the menu resource ID.</li>
1424<li>You can also now create a {@link android.widget.PopupMenu.OnDismissListener} that receives a
1425callback when the menu is dismissed.</li>
1426</ul>
1427
Scott Maine1e9e932011-10-13 23:36:19 -07001428
Scott Main1d6f70c2011-10-06 22:57:25 -07001429<h4>Preferences</h4>
1430
1431<p>A new {@link android.preference.TwoStatePreference} abstract class serves as the basis for
1432preferences that provide a two-state selection option. The new {@link
1433android.preference.SwitchPreference} is an extension of {@link
1434android.preference.TwoStatePreference} that provides a {@link android.widget.Switch} widget in the
1435preference view to allow users to toggle a setting on or off without the need to open an additional
1436preference screen or dialog. For example, the Settings application uses a {@link
1437android.preference.SwitchPreference} for the Wi-Fi and Bluetooth settings.</p>
1438
1439
Scott Maine1e9e932011-10-13 23:36:19 -07001440<h4>Hover events</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -07001441
Scott Mainb57769a2011-10-17 11:20:49 -07001442<p>The {@link android.view.View} class now supports “hover" events to enable richer interactions
Scott Maine1e9e932011-10-13 23:36:19 -07001443through the use of pointer devices (such as a mouse or other devices that drive an on-screen
Scott Main1d6f70c2011-10-06 22:57:25 -07001444cursor).</p>
1445
1446<p>To receive hover events on a view, implement the {@link android.view.View.OnHoverListener} and
1447register it with {@link android.view.View#setOnHoverListener setOnHoverListener()}. When a hover
1448event occurs on the view, your listener receives a call to {@link
1449android.view.View.OnHoverListener#onHover onHover()}, providing the {@link android.view.View} that
1450received the event and a {@link android.view.MotionEvent} that describes the type of hover event
1451that occurred. The hover event can be one of the following:</p>
1452<ul>
1453<li>{@link android.view.MotionEvent#ACTION_HOVER_ENTER}</li>
1454<li>{@link android.view.MotionEvent#ACTION_HOVER_EXIT}</li>
1455<li>{@link android.view.MotionEvent#ACTION_HOVER_MOVE}</li>
1456</ul>
1457
1458<p>Your {@link android.view.View.OnHoverListener} should return true from {@link
1459android.view.View.OnHoverListener#onHover onHover()} if it handles the hover event. If your
1460listener returns false, then the hover event will be dispatched to the parent view as usual.</p>
1461
1462<p>If your application uses buttons or other widgets that change their appearance based on the
Scott Maine1e9e932011-10-13 23:36:19 -07001463current state, you can now use the {@code android:state_hovered} attribute in a <a
Scott Mainb57769a2011-10-17 11:20:49 -07001464href="{@docRoot}guide/topics/resources/drawable-resource.html#StateList">state list drawable</a> to
Scott Main1d6f70c2011-10-06 22:57:25 -07001465provide a different background drawable when a cursor hovers over the view.</p>
1466
1467<p>For a demonstration of the new hover events, see the <a
Scott Mainb57769a2011-10-17 11:20:49 -07001468href="{@docRoot}samples/ApiDemos/src/com/example/android/apis/view/Hover.html">Hover</a> class in
Scott Main1d6f70c2011-10-06 22:57:25 -07001469ApiDemos.</p>
1470
1471
Scott Maine1e9e932011-10-13 23:36:19 -07001472<h4>Stylus and mouse button events</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -07001473
1474<p>Android now provides APIs for receiving input from a stylus input device such as a digitizer
Scott Maine1e9e932011-10-13 23:36:19 -07001475tablet peripheral or a stylus-enabled touch screen.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001476
1477<p>Stylus input operates in a similar manner to touch or mouse input. When the stylus is in contact
1478with the digitizer, applications receive touch events just like they would when a finger is used to
1479touch the display. When the stylus is hovering above the digitizer, applications receive hover
1480events just like they would when a mouse pointer was being moved across the display when no buttons
1481are pressed.</p>
1482
1483<p>Your application can distinguish between finger, mouse, stylus and eraser input by querying the
Scott Mainb57769a2011-10-17 11:20:49 -07001484“tool type" associated with each pointer in a {@link android.view.MotionEvent} using {@link
Scott Main1d6f70c2011-10-06 22:57:25 -07001485android.view.MotionEvent#getToolType getToolType()}. The currently defined tool types are: {@link
1486android.view.MotionEvent#TOOL_TYPE_UNKNOWN}, {@link android.view.MotionEvent#TOOL_TYPE_FINGER},
1487{@link android.view.MotionEvent#TOOL_TYPE_MOUSE}, {@link android.view.MotionEvent#TOOL_TYPE_STYLUS},
1488and {@link android.view.MotionEvent#TOOL_TYPE_ERASER}. By querying the tool type, your application
1489can choose to handle stylus input in different ways from finger or mouse input.</p>
1490
1491<p>Your application can also query which mouse or stylus buttons are pressed by querying the “button
Scott Mainb57769a2011-10-17 11:20:49 -07001492state" of a {@link android.view.MotionEvent} using {@link android.view.MotionEvent#getButtonState
Scott Main1d6f70c2011-10-06 22:57:25 -07001493getButtonState()}. The currently defined button states are: {@link
Scott Maine1e9e932011-10-13 23:36:19 -07001494android.view.MotionEvent#BUTTON_PRIMARY}, {@link android.view.MotionEvent#BUTTON_SECONDARY}, {@link
1495android.view.MotionEvent#BUTTON_TERTIARY}, {@link android.view.MotionEvent#BUTTON_BACK}, and {@link
1496android.view.MotionEvent#BUTTON_FORWARD}. For convenience, the back and forward mouse buttons are
1497automatically mapped to the {@link android.view.KeyEvent#KEYCODE_BACK} and {@link
1498android.view.KeyEvent#KEYCODE_FORWARD} keys. Your application can handle these keys to support
1499mouse button based back and forward navigation.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001500
1501<p>In addition to precisely measuring the position and pressure of a contact, some stylus input
Scott Maine1e9e932011-10-13 23:36:19 -07001502devices also report the distance between the stylus tip and the digitizer, the stylus tilt angle,
1503and the stylus orientation angle. Your application can query this information using {@link
Scott Main1d6f70c2011-10-06 22:57:25 -07001504android.view.MotionEvent#getAxisValue getAxisValue()} with the axis codes {@link
1505android.view.MotionEvent#AXIS_DISTANCE}, {@link android.view.MotionEvent#AXIS_TILT}, and {@link
1506android.view.MotionEvent#AXIS_ORIENTATION}.</p>
1507
1508<p>For a demonstration of tool types, button states and the new axis codes, see the <a
Scott Mainb57769a2011-10-17 11:20:49 -07001509href="{@docRoot}samples/ApiDemos/src/com/example/android/apis/graphics/TouchPaint.html">TouchPaint
Scott Main1d6f70c2011-10-06 22:57:25 -07001510</a> class in ApiDemos.</p>
1511
1512
1513
1514
1515
1516
1517<h3 id="Properties">Properties</h3>
1518
1519<p>The new {@link android.util.Property} class provides a fast, efficient, and easy way to specify a
1520property on any object that allows callers to generically set/get values on target objects. It also
1521allows the functionality of passing around field/method references and allows code to set/get values
1522of the property without knowing the details of what the fields/methods are.</p>
1523
1524<p>For example, if you want to set the value of field {@code bar} on object {@code foo}, you would
1525previously do this:</p>
1526<pre>
1527foo.bar = value;
1528</pre>
1529
1530<p>If you want to call the setter for an underlying private field {@code bar}, you would previously
1531do this:</p>
1532<pre>
1533foo.setBar(value);
1534</pre>
1535
1536<p>However, if you want to pass around the {@code foo} instance and have some other code set the
1537{@code bar} value, there is really no way to do it prior to Android 4.0.</p>
1538
1539<p>Using the {@link android.util.Property} class, you can declare a {@link android.util.Property}
1540object {@code BAR} on class {@code Foo} so that you can set the field on instance {@code foo} of
1541class {@code Foo} like this:</p>
1542<pre>
1543BAR.set(foo, value);
1544</pre>
1545
1546<p>The {@link android.view.View} class now leverages the {@link android.util.Property} class to
1547allow you to set various fields, such as transform properties that were added in Android 3.0 ({@link
1548android.view.View#ROTATION}, {@link android.view.View#ROTATION_X}, {@link
1549android.view.View#TRANSLATION_X}, etc.).</p>
1550
1551<p>The {@link android.animation.ObjectAnimator} class also uses the {@link android.util.Property}
1552class, so you can create an {@link android.animation.ObjectAnimator} with a {@link
1553android.util.Property}, which is faster, more efficient, and more type-safe than the string-based
1554approach.</p>
1555
1556
1557
1558
1559
1560
1561<h3 id="HwAccel">Hardware Acceleration</h3>
1562
1563<p>Beginning with Android 4.0, hardware acceleration for all windows is enabled by default if your
1564application has set either <a
1565href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code targetSdkVersion}</a> or
1566<a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code minSdkVersion}</a> to
Scott Mainb57769a2011-10-17 11:20:49 -07001567{@code “14"} or higher. Hardware acceleration generally results in smoother animations, smoother
Scott Main1d6f70c2011-10-06 22:57:25 -07001568scrolling, and overall better performance and response to user interaction.</p>
1569
1570<p>If necessary, you can manually disable hardware acceleration with the <a
Scott Mainb57769a2011-10-17 11:20:49 -07001571href="{@docRoot}guide/topics/manifest/activity-element.html#hwaccel">{@code hardwareAccelerated}</a>
Scott Main1d6f70c2011-10-06 22:57:25 -07001572attribute for individual <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code
1573&lt;activity&gt;}</a> elements or the <a
1574href="{@docRoot}guide/topics/manifest/application-element.html">{@code &lt;application&gt;}</a>
1575element. You can alternatively disable hardware acceleration for individual views by calling {@link
1576android.view.View#setLayerType setLayerType(LAYER_TYPE_SOFTWARE)}.</p>
1577
Scott Maine1e9e932011-10-13 23:36:19 -07001578<p>For more information about hardware acceleration, including a list of unsupported drawing
1579operations, see the <a href="{@docRoot}guide/topics/graphics/hardware-accel.html">Hardware
1580Acceleration</a> document.</p>
1581
1582
Scott Main1d6f70c2011-10-06 22:57:25 -07001583
1584<h3 id="Jni">JNI Changes</h3>
1585
Scott Maine1e9e932011-10-13 23:36:19 -07001586<p>In previous versions of Android, JNI local references weren’t indirect handles; Android used
1587direct pointers. This wasn't a problem as long as the garbage collector didn't move objects, but it
1588seemed to work because it made it possible to write buggy code. In Android 4.0, the system now uses
1589indirect references in order to detect these bugs.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001590
Scott Mainb57769a2011-10-17 11:20:49 -07001591<p>The ins and outs of JNI local references are described in “Local and Global References" in <a
Scott Maine1e9e932011-10-13 23:36:19 -07001592href="{@docRoot}guide/practices/design/jni.html">JNI Tips</a>. In Android 4.0, <a
1593href="http://android-developers.blogspot.com/2011/07/debugging-android-jni-with-checkjni.html">
1594CheckJNI</a> has been enhanced to detect these errors. Watch the <a
Scott Mainb57769a2011-10-17 11:20:49 -07001595href="http://android-developers.blogspot.com/">Android Developers Blog</a> for an upcoming post
Scott Maine1e9e932011-10-13 23:36:19 -07001596about common errors with JNI references and how you can fix them.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001597
1598<p>This change in the JNI implementation only affects apps that target Android 4.0 by setting either
Scott Maine1e9e932011-10-13 23:36:19 -07001599the <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code
1600targetSdkVersion}</a> or <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code
Scott Mainb57769a2011-10-17 11:20:49 -07001601minSdkVersion}</a> to {@code “14"} or higher. If you’ve set these attributes to any lower value,
Scott Maine1e9e932011-10-13 23:36:19 -07001602then JNI local references behave the same as in previous versions.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001603
1604
1605
1606
1607
1608<h3 id="WebKit">WebKit</h3>
1609<ul>
1610<li>WebKit updated to version 534.30</li>
1611<li>Support for Indic fonts (Devanagari, Bengali, and Tamil, including the complex character support
1612needed for combining glyphs) in {@link android.webkit.WebView} and the built-in Browser</li>
1613<li>Support for Ethiopic, Georgian, and Armenian fonts in {@link android.webkit.WebView} and the
1614built-in Browser</li>
1615<li>Support for <a
1616href="http://google-opensource.blogspot.com/2009/05/introducing-webdriver.html">WebDriver</a> makes
1617it easier for you to test apps that use {@link android.webkit.WebView}</li>
1618</ul>
1619
1620
1621<h4>Android Browser</h4>
1622
1623<p>The Browser application adds the following features to support web applications:</p>
1624<ul>
1625<li>Updated V8 JavaScript compiler for faster performance</li>
1626<li>Plus other notable enhancements carried over from <a
Scott Mainb57769a2011-10-17 11:20:49 -07001627href="{@docRoot}sdk/android-3.0.html">Android
Scott Main1d6f70c2011-10-06 22:57:25 -070016283.0</a> are now available for handsets:
1629<ul>
1630<li>Support for fixed position elements on all pages</li>
1631<li><a href="http://dev.w3.org/2009/dap/camera/">HTML media capture</a></li>
1632<li><a href="http://dev.w3.org/geo/api/spec-source-orientation.html">Device orientation
1633events</a></li>
1634<li><a href="http://www.w3.org/TR/css3-3d-transforms/">CSS 3D transformations</a></li>
1635</ul>
1636</li>
1637</ul>
1638
1639
1640
1641<h3 id="Permissions">Permissions</h3>
1642
1643<p>The following are new permissions:</p>
1644<ul>
1645<li>{@link android.Manifest.permission#ADD_VOICEMAIL}: Allows a voicemail service to add voicemail
1646messages to the device.</li>
1647<li>{@link android.Manifest.permission#BIND_TEXT_SERVICE}: A service that implements {@link
1648android.service.textservice.SpellCheckerService} must require this permission for itself.</li>
1649<li>{@link android.Manifest.permission#BIND_VPN_SERVICE}: A service that implements {@link
1650android.net.VpnService} must require this permission for itself.</li>
1651<li>{@link android.Manifest.permission#READ_PROFILE}: Provides read access to the {@link
1652android.provider.ContactsContract.Profile} provider.</li>
1653<li>{@link android.Manifest.permission#WRITE_PROFILE}: Provides write access to the {@link
1654android.provider.ContactsContract.Profile} provider.</li>
1655</ul>
1656
1657
1658
1659<h3 id="DeviceFeatures">Device Features</h3>
1660
1661<p>The following are new device features:</p>
1662<ul>
1663<li>{@link android.content.pm.PackageManager#FEATURE_WIFI_DIRECT}: Declares that the application
1664uses
1665Wi-Fi for peer-to-peer communications.</li>
1666</ul>
1667
1668
1669
Scott Maine1e9e932011-10-13 23:36:19 -07001670<h2 id="Honeycomb">Previous APIs</h2>
Scott Main1d6f70c2011-10-06 22:57:25 -07001671
Scott Maine1e9e932011-10-13 23:36:19 -07001672<p>In addition to everything above, Android 4.0 naturally supports all APIs from previous releases.
1673Because the Android 3.x (Honeycomb) platform is available only for large-screen devices, if you've
1674been developing primarily for handsets, then you might not be aware of all the APIs added to Android
1675in these recent releases.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001676
Scott Maine1e9e932011-10-13 23:36:19 -07001677<p>Here's a look at some of the most notable APIs you might have missed that are now available
1678on handsets as well:</p>
1679
1680<dl>
1681 <dt><a href="android-3.0.html">Android 3.0</a></dt>
1682 <dd>
1683 <ul>
1684 <li>{@link android.app.Fragment}: A framework component that allows you to separate distinct
1685elements of an activity into self-contained modules that define their own UI and lifecycle. See the
1686<a href="{@docRoot}guide/topics/fundamentals/fragments.html">Fragments</a> developer guide.</li>
1687 <li>{@link android.app.ActionBar}: A replacement for the traditional title bar at the top of
1688the activity window. It includes the application logo in the left corner and provides a new
1689interface for menu items. See the
1690<a href="{@docRoot}guide/topics/ui/actionbar.html">Action Bar</a> developer guide.</li>
1691 <li>{@link android.content.Loader}: A framework component that facilitates asynchronour
1692loading of data in combination with UI components to dynamically load data without blocking the
1693main thread. See the
1694<a href="{@docRoot}guide/topics/fundamentals/loaders.html">Loaders</a> developer guide.</li>
1695 <li>System clipboard: Applications can copy and paste data (beyond mere text) to and from
1696the system-wide clipboard. Clipped data can be plain text, a URI, or an intent. See the
1697<a href="{@docRoot}guide/topics/clipboard/copy-paste.html">Copy and Paste</a> developer guide.</li>
1698 <li>Drag and drop: A set of APIs built into the view framework that facilitates drag and drop
1699operations. See the
1700<a href="{@docRoot}guide/topics/ui/drag-drop.html">Drag and Drop</a> developer guide.</li>
1701 <li>An all new flexible animation framework allows you to animate arbitrary properties of any
1702object (View, Drawable, Fragment, Object, or anything else) and define animation aspects such
1703as duration, interpolation, repeat and more. The new framework makes Animations in Android
1704simpler than ever. See the
1705<a href="{@docRoot}guide/topics/graphics/property-animation.html">Property Animation</a> developer
1706guide.</li>
1707 <li>RenderScript graphics and compute engine: RenderScript offers a high performance 3D
1708graphics rendering and compute API at the native level, which you write in the C (C99 standard),
1709providing the type of performance you expect from a native environment while remaining portable
1710across various CPUs and GPUs. See the
1711<a href="{@docRoot}guide/topics/renderscript/index.html">RenderScript</a> developer
1712guide.</li>
1713 <li>Hardware accelerated 2D graphics: You can now enable the OpenGL renderer for your
1714application by setting {android:hardwareAccelerated="true"} in your manifest element's <a
1715href="{@docRoot}guide/topics/manifest/application-element.html"><code>&lt;application&gt;</code></a>
1716element or for individual <a
1717href="{@docRoot}guide/topics/manifest/activity-element.html"><code>&lt;activity&gt;</code></a>
1718elements. This results
1719in smoother animations, smoother scrolling, and overall better performance and response to user
1720interaction.
1721 <p class="note"><strong>Note:</strong> If you set your application's <a
1722href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code minSdkVersion}</a> or <a
1723href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code targetSdkVersion}</a> to
1724{@code "14"} or higher, hardware acceleration is enabled by default.</p></li>
1725 <li>And much, much more. See the <a href="android-3.0.html">Android 3.0 Platform</a>
1726notes for more information.</li>
1727 </ul>
1728 </dd>
1729
1730 <dt><a href="android-3.1.html">Android 3.1</a></dt>
1731 <dd>
1732 <ul>
1733 <li>USB APIs: Powerful new APIs for integrating connected peripherals with
1734Android applications. The APIs are based on a USB stack and services that are
1735built into the platform, including support for both USB host and device interactions. See the <a
1736href="{@docRoot}guide/topics/usb/index.html">USB Host and Accessory</a> developer guide.</li>
1737 <li>MTP/PTP APIs: Applications can interact directly with connected cameras and other PTP
1738devices to receive notifications when devices are attached and removed, manage files and storage on
1739those devices, and transfer files and metadata to and from them. The MTP API implements the PTP
1740(Picture Transfer Protocol) subset of the MTP (Media Transfer Protocol) specification. See the
1741{@link android.mtp} documentation.</li>
1742 <li>RTP APIs: Android exposes an API to its built-in RTP (Real-time Transport Protocol) stack,
1743which applications can use to manage on-demand or interactive data streaming. In particular, apps
1744that provide VOIP, push-to-talk, conferencing, and audio streaming can use the API to initiate
1745sessions and transmit or receive data streams over any available network. See the {@link
1746android.net.rtp} documentation.</li>
1747 <li>Support for joysticks and other generic motion inputs.</li>
1748 <li>See the <a href="android-3.1.html">Android 3.1 Platform</a>
1749notes for many more new APIs.</li>
1750 </ul>
1751 </dd>
1752
1753 <dt><a href="android-3.2.html">Android 3.2</a></dt>
1754 <dd>
1755 <ul>
1756 <li>New screens support APIs that give you more control over how your applications are
1757displayed across different screen sizes. The API extends the existing screen support model with the
1758ability to precisely target specific screen size ranges by dimensions, measured in
1759density-independent pixel units (such as 600dp or 720dp wide), rather than by their generalized
1760screen sizes (such as large or xlarge). For example, this is important in order to help you
1761distinguish between a 5" device and a 7" device, which would both traditionally be bucketed as
1762"large" screens. See the blog post, <a
1763href="http://android-developers.blogspot.com/2011/07/new-tools-for-managing-screen-sizes.html">
1764New Tools for Managing Screen Sizes</a>.</li>
1765 <li>New constants for <a
1766href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code &lt;uses-feature&gt;}</a> to
1767declare landscape or portrait screen orientation requirements.</li>
1768 <li>The device "screen size" configuration now changes during a screen orientation
1769change. If your app targets API level 13 or higher, you must handle the {@code "screenSize"}
1770configuration change if you also want to handle the {@code "orientation"} configuration change. See
1771<a href="{@docRoot}guide/topics/manifest/activity-element.html#config">{@code
1772android:configChanges}</a> for more information.</li>
1773 <li>See the <a href="android-3.2.html">Android 3.2 Platform</a>
1774notes for other new APIs.</li>
1775 </ul>
1776 </dd>
1777
1778</dl>
Scott Main1d6f70c2011-10-06 22:57:25 -07001779
1780
1781
1782
1783
1784
1785<h2 id="api-diff">API Differences Report</h2>
1786
Scott Maine1e9e932011-10-13 23:36:19 -07001787<p>For a detailed view of all API changes in Android {@sdkPlatformVersion} (API Level
Scott Main1d6f70c2011-10-06 22:57:25 -07001788{@sdkPlatformApiLevel}), see the <a
Scott Maine1e9e932011-10-13 23:36:19 -07001789href="{@docRoot}sdk/api_diff/{@sdkPlatformApiLevel}/changes.html">API Differences Report</a>.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001790
1791
1792
1793<h2 id="api-level">API Level</h2>
1794
Scott Maine1e9e932011-10-13 23:36:19 -07001795<p>The Android {@sdkPlatformVersion} API is assigned an integer
1796identifier&mdash;<strong>{@sdkPlatformApiLevel}</strong>&mdash;that is stored in the system itself.
1797This identifier, called the "API level", allows the system to correctly determine whether an
1798application is compatible with the system, prior to installing the application. </p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001799
1800<p>To use APIs introduced in Android {@sdkPlatformVersion} in your application, you need compile the
Scott Maine1e9e932011-10-13 23:36:19 -07001801application against an Android platform that supports API level {@sdkPlatformApiLevel} or
1802higher. Depending on your needs, you might also need to add an
Scott Main1d6f70c2011-10-06 22:57:25 -07001803<code>android:minSdkVersion="{@sdkPlatformApiLevel}"</code> attribute to the
Scott Maine1e9e932011-10-13 23:36:19 -07001804<a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html">{@code &lt;uses-sdk&gt;}</a>
1805element.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001806
Scott Maine1e9e932011-10-13 23:36:19 -07001807<p>For more information, see the <a href="{@docRoot}guide/appendix/api-levels.html">API Levels</a>
1808document. </p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001809
1810
1811<h2 id="apps">Built-in Applications</h2>
1812
1813<p>The system image included in the downloadable platform provides these
1814built-in applications:</p>
1815
1816<table style="border:0;padding-bottom:0;margin-bottom:0;">
1817<tr>
1818<td style="border:0;padding-bottom:0;margin-bottom:0;">
1819<ul>
1820<li>API Demos</li>
1821<li>Browser</li>
1822<li>Calculator</li>
Scott Maine1e9e932011-10-13 23:36:19 -07001823<li>Calendar</li>
Scott Main1d6f70c2011-10-06 22:57:25 -07001824<li>Camera</li>
1825<li>Clock</li>
1826<li>Custom Locale</li>
1827<li>Dev Tools</li>
1828<li>Downloads</li>
1829<li>Email</li>
1830<li>Gallery</li>
1831</ul>
1832</td>
1833<td style="border:0;padding-bottom:0;margin-bottom:0;padding-left:5em;">
1834<ul>
1835<li>Gestures Builder</li>
1836<li>Messaging</li>
1837<li>Music</li>
1838<li>People</li>
1839<li>Phone</li>
1840<li>Search</li>
1841<li>Settings</li>
Scott Maine1e9e932011-10-13 23:36:19 -07001842<li>Speech Recorder</li>
Scott Main1d6f70c2011-10-06 22:57:25 -07001843<li>Speech Recorder</li>
1844<li>Widget Preview</li>
1845</ul>
1846</td>
1847</tr>
1848</table>
1849
1850
1851<h2 id="locs" style="margin-top:.75em;">Locales</h2>
1852
Scott Maine1e9e932011-10-13 23:36:19 -07001853<p>The system image included in the downloadable SDK platform provides a variety of built-in
1854locales. In some cases, region-specific strings are available for the locales. In other cases, a
1855default version of the language is used. The languages that are available in the Android 3.0 system
1856image are listed below (with <em>language</em>_<em>country/region</em> locale descriptor).</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001857
1858<table style="border:0;padding-bottom:0;margin-bottom:0;">
1859<tr>
1860<td style="border:0;padding-bottom:0;margin-bottom:0;">
1861<ul>
1862<li>Arabic, Egypt (ar_EG)</li>
1863<li>Arabic, Israel (ar_IL)</li>
1864<li>Bulgarian, Bulgaria (bg_BG)</li>
1865<li>Catalan, Spain (ca_ES)</li>
1866<li>Czech, Czech Republic (cs_CZ)</li>
1867<li>Danish, Denmark(da_DK)</li>
1868<li>German, Austria (de_AT)</li>
1869<li>German, Switzerland (de_CH)</li>
1870<li>German, Germany (de_DE)</li>
1871<li>German, Liechtenstein (de_LI)</li>
1872<li>Greek, Greece (el_GR)</li>
1873<li>English, Australia (en_AU)</li>
1874<li>English, Canada (en_CA)</li>
1875<li>English, Britain (en_GB)</li>
1876<li>English, Ireland (en_IE)</li>
1877<li>English, India (en_IN)</li>
1878<li>English, New Zealand (en_NZ)</li>
1879<li>English, Singapore(en_SG)</li>
1880<li>English, US (en_US)</li>
1881<li>English, Zimbabwe (en_ZA)</li>
1882<li>Spanish (es_ES)</li>
1883<li>Spanish, US (es_US)</li>
1884<li>Finnish, Finland (fi_FI)</li>
1885<li>French, Belgium (fr_BE)</li>
1886<li>French, Canada (fr_CA)</li>
1887<li>French, Switzerland (fr_CH)</li>
1888<li>French, France (fr_FR)</li>
1889<li>Hebrew, Israel (he_IL)</li>
1890<li>Hindi, India (hi_IN)</li>
1891</ul>
1892</td>
1893<td style="border:0;padding-bottom:0;margin-bottom:0;padding-left:5em;">
1894<li>Croatian, Croatia (hr_HR)</li>
1895<li>Hungarian, Hungary (hu_HU)</li>
1896<li>Indonesian, Indonesia (id_ID)</li>
1897<li>Italian, Switzerland (it_CH)</li>
1898<li>Italian, Italy (it_IT)</li>
1899<li>Japanese (ja_JP)</li>
1900<li>Korean (ko_KR)</li>
1901<li>Lithuanian, Lithuania (lt_LT)</li>
1902<li>Latvian, Latvia (lv_LV)</li>
1903<li>Norwegian bokmål, Norway (nb_NO)</li>
1904<li>Dutch, Belgium (nl_BE)</li>
1905<li>Dutch, Netherlands (nl_NL)</li>
1906<li>Polish (pl_PL)</li>
1907<li>Portuguese, Brazil (pt_BR)</li>
1908<li>Portuguese, Portugal (pt_PT)</li>
1909<li>Romanian, Romania (ro_RO)</li>
1910<li>Russian (ru_RU)</li></li>
1911<li>Slovak, Slovakia (sk_SK)</li>
1912<li>Slovenian, Slovenia (sl_SI)</li>
1913<li>Serbian (sr_RS)</li>
1914<li>Swedish, Sweden (sv_SE)</li>
1915<li>Thai, Thailand (th_TH)</li>
1916<li>Tagalog, Philippines (tl_PH)</li>
1917<li>Turkish, Turkey (tr_TR)</li>
1918<li>Ukrainian, Ukraine (uk_UA)</li>
1919<li>Vietnamese, Vietnam (vi_VN)</li>
1920<li>Chinese, PRC (zh_CN)</li>
1921<li>Chinese, Taiwan (zh_TW)</li>
1922</td>
1923</tr>
1924</table>
1925
1926<p class="note"><strong>Note:</strong> The Android platform may support more
1927locales than are included in the SDK system image. All of the supported locales
1928are available in the <a href="http://source.android.com/">Android Open Source
1929Project</a>.</p>
1930
1931<h2 id="skins">Emulator Skins</h2>
1932
Scott Maine1e9e932011-10-13 23:36:19 -07001933<p>The downloadable platform includes the following emulator skins:</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001934
1935<ul>
1936 <li>
Scott Maine1e9e932011-10-13 23:36:19 -07001937 QVGA (240x320, low density, small screen)
1938 </li>
1939 <li>
1940 WQVGA400 (240x400, low density, normal screen)
1941 </li>
1942 <li>
1943 WQVGA432 (240x432, low density, normal screen)
1944 </li>
1945 <li>
1946 HVGA (320x480, medium density, normal screen)
1947 </li>
1948 <li>
1949 WVGA800 (480x800, high density, normal screen)
1950 </li>
1951 <li>
1952 WVGA854 (480x854 high density, normal screen)
1953 </li>
1954 <li>
1955 WXGA720 (1280x720, extra-high density, normal screen) <span class="new">new</span>
1956 </li>
1957 <li>
1958 WSVGA (1024x600, medium density, large screen) <span class="new">new</span>
1959 </li>
1960 <li>
1961 WXGA (1280x800, medium density, xlarge screen)
Scott Main1d6f70c2011-10-06 22:57:25 -07001962 </li>
1963</ul>
1964
Scott Maine1e9e932011-10-13 23:36:19 -07001965<p>To test your application on an emulator that represents the latest Android device, you can create
1966an AVD with the new WXGA720 skin (it's an xhdpi, normal screen device). Note that the emulator
1967currently doesn't support the new on-screen navigation bar for devices without hardware navigation
1968buttons, so when using this skin, you must use keyboard keys <em>Home</em> for the Home button,
1969<em>ESC</em> for the Back button, and <em>F2</em> or <em>Page-up</em> for the Menu button.</p>
1970
1971<p>However, due to performance issues in the emulator when running high-resolution screens such as
1972the one for the WXGA720 skin, we recommend that you primarily use the traditional WVGA800 skin
1973(hdpi, normal screen) to test your application.</p>
1974