blob: 70051d8f28d3d9c17b8185fa29354d2378215a12 [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>
Robert Lya94c7bd2011-10-18 17:39:56 -070075<dt>Initial release. SDK Tools r14 or higher is required.
76 <p class="caution"><strong>Important:</strong> To download the new Android
77 4.0 system components from the Android SDK Manager, you must first update the
78 SDK tools to revision 14 and restart the Android SDK Manager. If you do not,
79 the Android 4.0 system components will not be available for download.</p>
80</dt>
Scott Main1d6f70c2011-10-06 22:57:25 -070081</dl>
82
83 </div>
84</div>
85
86
87<h2 id="api">API Overview</h2>
88
89<p>The sections below provide a technical overview of new APIs in Android 4.0.</p>
90
91<div class="toggle-content closed" style="padding-left:1em;">
92
93 <p><a href="#" onclick="return toggleContent(this)">
94 <img src="{@docRoot}assets/images/triangle-closed.png"
95class="toggle-content-img" alt="" />
96 <strong>Table of Contents</strong>
97 </a></p>
98
99 <div class="toggle-content-toggleme" style="padding-left:2em;">
100 <ol class="toc" style="margin-left:-1em">
Scott Maine1e9e932011-10-13 23:36:19 -0700101 <li><a href="#Contacts">Contact Provider</a></li>
102 <li><a href="#Calendar">Calendar Provider</a></li>
103 <li><a href="#Voicemail">Voicemail Provider</a></li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700104 <li><a href="#Camera">Camera</a></li>
105 <li><a href="#Multimedia">Multimedia</a></li>
106 <li><a href="#Bluetooth">Bluetooth</a></li>
107 <li><a href="#AndroidBeam">Android Beam (NDEF Push with NFC)</a></li>
Scott Maine09743272011-10-14 11:25:46 -0700108 <li><a href="#WiFiDirect">Wi-Fi Direct</a></li>
109 <li><a href="#NetworkUsage">Network Usage</a></li>
Scott Maine1e9e932011-10-13 23:36:19 -0700110 <li><a href="#RenderScript">RenderScript</a></li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700111 <li><a href="#A11y">Accessibility</a></li>
112 <li><a href="#Enterprise">Enterprise</a></li>
Scott Maine1e9e932011-10-13 23:36:19 -0700113 <li><a href="#Sensors">Device Sensors</a></li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700114 <li><a href="#TTS">Text-to-speech Engines</a></li>
Scott Maine1e9e932011-10-13 23:36:19 -0700115 <li><a href="#SpellChecker">Spell Checker Services</a></li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700116 <li><a href="#ActionBar">Action Bar</a></li>
117 <li><a href="#UI">User Interface and Views</a></li>
118 <li><a href="#Properties">Properties</a></li>
119 <li><a href="#HwAccel">Hardware Acceleration</a></li>
120 <li><a href="#Jni">JNI Changes</a></li>
121 <li><a href="#WebKit">WebKit</a></li>
122 <li><a href="#Permissions">Permissions</a></li>
123 <li><a href="#DeviceFeatures">Device Features</a></li>
124 </ol>
125 </div>
126</div>
127
128
129
130
131
Scott Maine1e9e932011-10-13 23:36:19 -0700132<h3 id="Contacts">Contact Provider</h3>
Scott Main1d6f70c2011-10-06 22:57:25 -0700133
Scott Maine1e9e932011-10-13 23:36:19 -0700134<p>The contact APIs that are defined by the {@link android.provider.ContactsContract} provider have
135been extended to support new features such as a personal profile for the device owner, high
136resolution contact photos, and the ability for users to invite individual contacts to social
137networks that are installed on the device.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700138
139
140<h4>User Profile</h4>
141
142<p>Android now includes a personal profile that represents the device owner, as defined by the
Scott Maine1e9e932011-10-13 23:36:19 -0700143{@link android.provider.ContactsContract.Profile} table. Social apps that maintain a user identity
144can contribute to the user's profile data by creating a new {@link
Scott Main1d6f70c2011-10-06 22:57:25 -0700145android.provider.ContactsContract.RawContacts} entry within the {@link
146android.provider.ContactsContract.Profile}. That is, raw contacts that represent the device user do
147not belong in the traditional raw contacts table defined by the {@link
148android.provider.ContactsContract.RawContacts} Uri; instead, you must add a profile raw contact in
149the table at {@link android.provider.ContactsContract.Profile#CONTENT_RAW_CONTACTS_URI}. Raw
Scott Maine1e9e932011-10-13 23:36:19 -0700150contacts in this table are then aggregated into the single user-visible profile labeled "Me".</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700151
152<p>Adding a new raw contact for the profile requires the {@link
153android.Manifest.permission#WRITE_PROFILE} permission. Likewise, in order to read from the profile
154table, you must request the {@link android.Manifest.permission#READ_PROFILE} permission. However,
Scott Maine1e9e932011-10-13 23:36:19 -0700155most apps should need to read the user profile, even when contributing data to the
156profile. Reading the user profile is a sensitive permission and you should expect users to be
157skeptical of apps that request it.</p>
158
Scott Main1d6f70c2011-10-06 22:57:25 -0700159
160<h4>Large photos</h4>
161
162<p>Android now supports high resolution photos for contacts. Now, when you push a photo into a
Scott Maine1e9e932011-10-13 23:36:19 -0700163contact record, the system processes it into both a 96x96 thumbnail (as it has previously) and a
164256x256 "display photo" that's stored in a new file-based photo store (the exact dimensions that the
165system chooses may vary in the future). You can add a large photo to a contact by putting a large
166photo in the usual {@link android.provider.ContactsContract.CommonDataKinds.Photo#PHOTO} column of a
167data row, which the system will then process into the appropriate thumbnail and display photo
168records.</p>
169
Scott Main1d6f70c2011-10-06 22:57:25 -0700170
171<h4>Invite Intent</h4>
172
Scott Maine1e9e932011-10-13 23:36:19 -0700173<p>The {@link android.provider.ContactsContract.Intents#INVITE_CONTACT} intent action allows an app
174to invoke an action that indicates the user wants to add a contact to a social network. The app
175receiving the app uses it to invite the specified contact to that
176social network. Most apps will be on the receiving-end of this operation. For example, the
177built-in People app invokes the invite intent when the user selects "Add connection" for a specific
178social app that's listed in a person's contact details.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700179
Scott Maine1e9e932011-10-13 23:36:19 -0700180<p>To make your app visible as in the "Add connection" list, your app must provide a sync adapter to
181sync contact information from your social network. You must then indicate to the system that your
182app responds to the {@link android.provider.ContactsContract.Intents#INVITE_CONTACT} intent by
183adding the {@code inviteContactActivity} attribute to your app’s sync configuration file, with a
184fully-qualified name of the activity that the system should start when sending the invite intent.
185The activity that starts can then retrieve the URI for the contact in question from the intent’s
186data and perform the necessary work to invite that contact to the network or add the person to the
187user’s connections.</p>
188
189<p>See the <a href="{@docRoot}resources/samples/SampleSyncAdapter/index.html">Sample Sync
190Adapter</a> app for an example (specifically, see the <a
191href="{@docRoot}resources/samples/SampleSyncAdapter/res/xml-v14/contacts.html">contacts.xml</a>
192file).</p>
193
Scott Main1d6f70c2011-10-06 22:57:25 -0700194
195<h4>Contact Usage Feedback</h4>
196
197<p>The new {@link android.provider.ContactsContract.DataUsageFeedback} APIs allow you to help track
198how often the user uses particular methods of contacting people, such as how often the user uses
199each phone number or e-mail address. This information helps improve the ranking for each contact
Scott Maine1e9e932011-10-13 23:36:19 -0700200method associated with each person and provide better suggestions for contacting each person.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700201
202
203
204
205
Scott Maine1e9e932011-10-13 23:36:19 -0700206<h3 id="Calendar">Calendar Provider</h3>
Scott Main1d6f70c2011-10-06 22:57:25 -0700207
Scott Mainb57769a2011-10-17 11:20:49 -0700208<p>The new calendar APIs allow you to read, add, modify and delete calendars, events, attendees,
209reminders and alerts, which are stored in the Calendar Provider.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700210
Scott Maine1e9e932011-10-13 23:36:19 -0700211<p>A variety of apps and widgets can use these APIs to read and modify calendar events. However,
212some of the most compelling use cases are sync adapters that synchronize the user's calendar from
Scott Mainb57769a2011-10-17 11:20:49 -0700213other calendar services with the Calendar Provider, in order to offer a unified location for all the
214user's events. Google Calendar events, for example, are synchronized with the Calendar Provider by
215the Google Calendar Sync Adapter, allowing these events to be viewed with Android's built-in
Scott Maine1e9e932011-10-13 23:36:19 -0700216Calendar app.</p>
217
218<p>The data model for calendars and event-related information in the Calendar Provider is
219defined by {@link android.provider.CalendarContract}. All the user’s calendar data is stored in a
220number of tables defined by various subclasses of {@link android.provider.CalendarContract}:</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700221
222<ul>
223<li>The {@link android.provider.CalendarContract.Calendars} table holds the calendar-specific
224information. Each row in this table contains the details for a single calendar, such as the name,
225color, sync information, and so on.</li>
226
227<li>The {@link android.provider.CalendarContract.Events} table holds event-specific information.
Scott Maine1e9e932011-10-13 23:36:19 -0700228Each row in this table contains the information for a single event, such as the
229event title, location, start time, end time, and so on. The event can occur one time or recur
230multiple times. Attendees, reminders, and extended properties are stored in separate tables and
231use the event’s {@code _ID} to link them with the event.</li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700232
233<li>The {@link android.provider.CalendarContract.Instances} table holds the start and end time for
234occurrences of an event. Each row in this table represents a single occurrence. For one-time events
235there is a one-to-one mapping of instances to events. For recurring events, multiple rows are
236automatically generated to correspond to the multiple occurrences of that event.</li>
237
238<li>The {@link android.provider.CalendarContract.Attendees} table holds the event attendee or guest
239information. Each row represents a single guest of an event. It specifies the type of guest the
Scott Maine1e9e932011-10-13 23:36:19 -0700240person is and the person’s response for the event.</li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700241
242<li>The {@link android.provider.CalendarContract.Reminders} table holds the alert/notification data.
243Each row represents a single alert for an event. An event can have multiple reminders. The number of
Scott Maine1e9e932011-10-13 23:36:19 -0700244reminders per event is specified in {@code MAX_REMINDERS}, which is set by the sync adapter that
245owns the given calendar. Reminders are specified in number-of-minutes before the event is
246scheduled and specify an alarm method such as to use an alert, email, or SMS to remind
247the user.</li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700248
249<li>The {@link android.provider.CalendarContract.ExtendedProperties} table hold opaque data fields
Scott Maine1e9e932011-10-13 23:36:19 -0700250used by the sync adapter. The provider takes no action with items in this table except to delete
251them when their related events are deleted.</li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700252</ul>
253
Scott Maine1e9e932011-10-13 23:36:19 -0700254<p>To access a user’s calendar data with the Calendar Provider, your application must request
255the {@link android.Manifest.permission#READ_CALENDAR} permission (for read access) and
256{@link android.Manifest.permission#WRITE_CALENDAR} (for write access).</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700257
Scott Main1d6f70c2011-10-06 22:57:25 -0700258
Scott Maine1e9e932011-10-13 23:36:19 -0700259<h4>Event intent</h4>
260
261<p>If all you want to do is add an event to the user’s calendar, you can use an
262{@link android.content.Intent#ACTION_INSERT} intent with a {@code "vnd.android.cursor.item/event"}
263MIME type to start an activity in the Calendar app that creates new events. Using the intent does
264not require any permission and you can specify event details with the following extras:</p>
265
266<ul>
267 <li>{@link android.provider.CalendarContract.EventsColumns#TITLE Events.TITLE}: Name for the
268event</li>
269 <li>{@link
270android.provider.CalendarContract#EXTRA_EVENT_BEGIN_TIME CalendarContract.EXTRA_EVENT_BEGIN_TIME}:
271Event begin time in milliseconds from the
272epoch</li>
273 <li>{@link
274android.provider.CalendarContract#EXTRA_EVENT_END_TIME CalendarContract.EXTRA_EVENT_END_TIME}: Event
275end time in milliseconds from the epoch</li>
276 <li>{@link android.provider.CalendarContract.EventsColumns#EVENT_LOCATION Events.EVENT_LOCATION}:
277Location of the event</li>
278 <li>{@link android.provider.CalendarContract.EventsColumns#DESCRIPTION Events.DESCRIPTION}: Event
279description</li>
280 <li>{@link android.content.Intent#EXTRA_EMAIL Intent.EXTRA_EMAIL}: Email addresses of those to
281invite</li>
282 <li>{@link android.provider.CalendarContract.EventsColumns#RRULE Events.RRULE}: The recurrence
283rule for the event</li>
284 <li>{@link android.provider.CalendarContract.EventsColumns#ACCESS_LEVEL Events.ACCESS_LEVEL}:
285Whether the event is private or public</li>
286 <li>{@link android.provider.CalendarContract.EventsColumns#AVAILABILITY Events.AVAILABILITY}:
287Whether the time period of this event allows for other events to be scheduled at the same time</li>
288</ul>
289
290
291
292
293<h3 id="Voicemail">Voicemail Provider</h3>
294
295<p>The new voicemail APIs allows applications to add voicemails to a content provider on the device.
296Because the APIs currently do not allow third party apps to read all the voicemails from the system,
297the only third-party apps that should use the voicemail APIs are those that have voicemail to
298deliver to the user. For instance, it’s possible that a user has multiple voicemail sources, such as
299one provided by the phone’s service provider and others from VoIP or other alternative voice
300services. These apps can use the APIs to add their voicemails to the system for quick playback. The
301built-in Phone application presents all voicemails from the Voicemail Provider with a single list.
302Although the system’s Phone application is the only application that can read all the voicemails,
303each application that provides voicemails can read those that it has added to the system (but cannot
304read voicemails from other services).</p>
305
306<p>The {@link android.provider.VoicemailContract} class defines the content provider for the
307voicemail APIs. The subclasses {@link android.provider.VoicemailContract.Voicemails} and {@link
308android.provider.VoicemailContract.Status} provide tables in which the Voicemail Providers can
309insert voicemail data for storage on the device. For an example of a voicemail provider app, see the
Scott Mainb57769a2011-10-17 11:20:49 -0700310<a href="{@docRoot}resources/samples/VoicemailProviderDemo/index.html">Voicemail Provider
Scott Maine1e9e932011-10-13 23:36:19 -0700311Demo</a>.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700312
313
314
315
316<h3 id="Camera">Camera</h3>
317
Scott Maine1e9e932011-10-13 23:36:19 -0700318<p>The {@link android.hardware.Camera} class now includes APIs for detecting faces and controlling
319focus and metering areas.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700320
Scott Main1d6f70c2011-10-06 22:57:25 -0700321
Scott Maine1e9e932011-10-13 23:36:19 -0700322<h4>Face detection</h4>
323
324<p>Camera apps can now enhance their abilities with Android’s face detection APIs, which not
325only detect the face of a subject, but also specific facial features, such as the eyes and mouth.
326</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700327
328<p>To detect faces in your camera application, you must register a {@link
329android.hardware.Camera.FaceDetectionListener} by calling {@link
330android.hardware.Camera#setFaceDetectionListener setFaceDetectionListener()}. You can then start
331your camera surface and start detecting faces by calling {@link
332android.hardware.Camera#startFaceDetection}.</p>
333
Scott Maine1e9e932011-10-13 23:36:19 -0700334<p>When the system detects one or more faces in the camera scene, it calls the {@link
Scott Main1d6f70c2011-10-06 22:57:25 -0700335android.hardware.Camera.FaceDetectionListener#onFaceDetection onFaceDetection()} callback in your
336implementation of {@link android.hardware.Camera.FaceDetectionListener}, including an array of
337{@link android.hardware.Camera.Face} objects.</p>
338
339<p>An instance of the {@link android.hardware.Camera.Face} class provides various information about
Scott Maine1e9e932011-10-13 23:36:19 -0700340the face detected, including:</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700341<ul>
342<li>A {@link android.graphics.Rect} that specifies the bounds of the face, relative to the camera's
343current field of view</li>
Scott Mainb57769a2011-10-17 11:20:49 -0700344<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 -0700345human face</li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700346<li>A unique ID so you can track multiple faces</li>
347<li>Several {@link android.graphics.Point} objects that indicate where the eyes and mouth are
348located</li>
349</ul>
350
Scott Mainb57769a2011-10-17 11:20:49 -0700351<p class="note"><strong>Note:</strong> Face detection may not be supported on some
352devices, so you should check by calling {@link
353android.hardware.Camera.Parameters#getMaxNumDetectedFaces()} and ensure the return
354value is greater than zero. Also, some devices may not support identification of eyes and mouth,
355in which case, those fields in the {@link android.hardware.Camera.Face} object will be null.</p>
356
Scott Maine1e9e932011-10-13 23:36:19 -0700357
358<h4>Focus and metering areas</h4>
Robert Ly6cf7d9a2011-10-12 15:30:35 -0700359
Scott Maine1e9e932011-10-13 23:36:19 -0700360<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 -0700361balance
Scott Maine1e9e932011-10-13 23:36:19 -0700362and auto-exposure. Both features use the new {@link android.hardware.Camera.Area} class to specify
363the region of the camera’s current view that should be focused or metered. An instance of the {@link
364android.hardware.Camera.Area} class defines the bounds of the area with a {@link
365android.graphics.Rect} and the area's weight&mdash;representing the level of importance of that
366area, relative to other areas in consideration&mdash;with an integer.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700367
368<p>Before setting either a focus area or metering area, you should first call {@link
369android.hardware.Camera.Parameters#getMaxNumFocusAreas} or {@link
370android.hardware.Camera.Parameters#getMaxNumMeteringAreas}, respectively. If these return zero, then
Scott Maine1e9e932011-10-13 23:36:19 -0700371the device does not support the corresponding feature.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700372
373<p>To specify the focus or metering areas to use, simply call {@link
374android.hardware.Camera.Parameters#setFocusAreas setFocusAreas()} or {@link
375android.hardware.Camera.Parameters#setFocusAreas setMeteringAreas()}. Each take a {@link
376java.util.List} of {@link android.hardware.Camera.Area} objects that indicate the areas to consider
377for focus or metering. For example, you might implement a feature that allows the user to set the
378focus area by touching an area of the preview, which you then translate to an {@link
Scott Maine1e9e932011-10-13 23:36:19 -0700379android.hardware.Camera.Area} object and request that the camera focus on that area of the scene.
380The focus or exposure in that area will continually update as the scene in the area changes.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700381
382
Scott Mainb57769a2011-10-17 11:20:49 -0700383<h4>Continuous auto focus for photos</h4>
384
385<p>You can now enable continuous auto focusing (CAF) when taking photos. To enable CAF in your
386camera app, pass {@link android.hardware.Camera.Parameters#FOCUS_MODE_CONTINUOUS_PICTURE}
387to {@link android.hardware.Camera.Parameters#setFocusMode setFocusMode()}. When ready to capture
388a photo, call {@link android.hardware.Camera#autoFocus autoFocus()}. Your {@link
389android.hardware.Camera.AutoFocusCallback} immediately receives a callback to indicate whether
390focus was acheived. To resume CAF after receiving the callback, you must call {@link
391android.hardware.Camera#cancelAutoFocus()}.</p>
392
393<p class="note"><strong>Note:</strong> Continuous auto focus is also supported when capturing
394video, using {@link android.hardware.Camera.Parameters#FOCUS_MODE_CONTINUOUS_VIDEO}, which was
395added in API level 9.</p>
396
397
Scott Maine1e9e932011-10-13 23:36:19 -0700398<h4>Other camera features</h4>
399
Scott Mainb57769a2011-10-17 11:20:49 -0700400<ul>
Scott Maine1e9e932011-10-13 23:36:19 -0700401<li>While recording video, you can now call {@link android.hardware.Camera#takePicture
402takePicture()} to save a photo without interrupting the video session. Before doing so, you should
403call {@link android.hardware.Camera.Parameters#isVideoSnapshotSupported} to be sure the hardware
404supports it.</li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700405
Scott Mainb57769a2011-10-17 11:20:49 -0700406<li>You can now lock auto exposure and white balance with {@link
Scott Main1d6f70c2011-10-06 22:57:25 -0700407android.hardware.Camera.Parameters#setAutoExposureLock setAutoExposureLock()} and {@link
Scott Mainb57769a2011-10-17 11:20:49 -0700408android.hardware.Camera.Parameters#setAutoWhiteBalanceLock setAutoWhiteBalanceLock()} to prevent
Scott Main1d6f70c2011-10-06 22:57:25 -0700409these properties from changing.</li>
Scott Mainb57769a2011-10-17 11:20:49 -0700410
411<li>You can now call {@link android.hardware.Camera#setDisplayOrientation
412setDisplayOrientation()} while the camera preview is running. Previously, you could call this
413only before beginning the preview, but you can now change the orientation at any time.</li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700414</ul>
415
Scott Maine1e9e932011-10-13 23:36:19 -0700416
417<h4>Camera broadcast intents</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -0700418
419<ul>
Scott Maine1e9e932011-10-13 23:36:19 -0700420<li>{@link android.hardware.Camera#ACTION_NEW_PICTURE Camera.ACTION_NEW_PICTURE}:
421This indicates that the user has captured a new photo. The built-in Camera app invokes this
Scott Main1d6f70c2011-10-06 22:57:25 -0700422broadcast after a photo is captured and third-party camera apps should also broadcast this intent
423after capturing a photo.</li>
Scott Maine1e9e932011-10-13 23:36:19 -0700424<li>{@link android.hardware.Camera#ACTION_NEW_VIDEO Camera.ACTION_NEW_VIDEO}:
425This indicates that the user has captured a new video. The built-in Camera app invokes this
Scott Main1d6f70c2011-10-06 22:57:25 -0700426broadcast after a video is recorded and third-party camera apps should also broadcast this intent
427after capturing a video.</li>
428</ul>
429
Scott Main1d6f70c2011-10-06 22:57:25 -0700430
Robert Ly6cf7d9a2011-10-12 15:30:35 -0700431
432
433
Scott Main1d6f70c2011-10-06 22:57:25 -0700434<h3 id="Multimedia">Multimedia</h3>
435
436<p>Android 4.0 adds several new APIs for applications that interact with media such as photos,
Scott Maine1e9e932011-10-13 23:36:19 -0700437videos, and music.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700438
439
Scott Maine1e9e932011-10-13 23:36:19 -0700440<h4>Media player</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -0700441
442<ul>
Scott Maine1e9e932011-10-13 23:36:19 -0700443<li>Streaming online media from {@link android.media.MediaPlayer} now requires the {@link
Scott Main1d6f70c2011-10-06 22:57:25 -0700444android.Manifest.permission#INTERNET} permission. If you use {@link android.media.MediaPlayer} to
Scott Maine1e9e932011-10-13 23:36:19 -0700445play content from the Internet, be sure to add the {@link android.Manifest.permission#INTERNET}
446permission to your manifest or else your media playback will not work beginning with Android
4474.0.</li>
448
Scott Main1d6f70c2011-10-06 22:57:25 -0700449<li>{@link android.media.MediaPlayer#setSurface(Surface) setSurface()} allows you define a {@link
450android.view.Surface} to behave as the video sink.</li>
Scott Maine1e9e932011-10-13 23:36:19 -0700451
Scott Main1d6f70c2011-10-06 22:57:25 -0700452<li>{@link android.media.MediaPlayer#setDataSource(Context,Uri,Map) setDataSource()} allows you to
453send additional HTTP headers with your request, which can be useful for HTTP(S) live streaming</li>
Scott Maine1e9e932011-10-13 23:36:19 -0700454
Scott Main1d6f70c2011-10-06 22:57:25 -0700455<li>HTTP(S) live streaming now respects HTTP cookies across requests</li>
456</ul>
457
Scott Maine1e9e932011-10-13 23:36:19 -0700458
459<h4>Media types</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -0700460
461<p>Android 4.0 adds support for:</p>
462<ul>
463<li>HTTP/HTTPS live streaming protocol version 3 </li>
464<li>ADTS raw AAC audio encoding</li>
465<li>WEBP images</li>
466<li>Matroska video</li>
467</ul>
Scott Mainb57769a2011-10-17 11:20:49 -0700468<p>For more info, see <a href="{@docRoot}guide/appendix/media-formats.html">Supported Media
Scott Main1d6f70c2011-10-06 22:57:25 -0700469Formats</a>.</p>
470
471
Scott Maine1e9e932011-10-13 23:36:19 -0700472
473<h4>Remote control client</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -0700474
475<p>The new {@link android.media.RemoteControlClient} allows media players to enable playback
Scott Maine1e9e932011-10-13 23:36:19 -0700476controls from remote control clients such as the device lock screen. Media players can also expose
Scott Main1d6f70c2011-10-06 22:57:25 -0700477information about the media currently playing for display on the remote control, such as track
478information and album art.</p>
479
480<p>To enable remote control clients for your media player, instantiate a {@link
Scott Maine1e9e932011-10-13 23:36:19 -0700481android.media.RemoteControlClient} with its constructor, passing it a {@link
482android.app.PendingIntent} that broadcasts {@link
Scott Main1d6f70c2011-10-06 22:57:25 -0700483android.content.Intent#ACTION_MEDIA_BUTTON}. The intent must also declare the explicit {@link
484android.content.BroadcastReceiver} component in your app that handles the {@link
485android.content.Intent#ACTION_MEDIA_BUTTON} event.</p>
486
487<p>To declare which media control inputs your player can handle, you must call {@link
488android.media.RemoteControlClient#setTransportControlFlags setTransportControlFlags()} on your
489{@link android.media.RemoteControlClient}, passing a set of {@code FLAG_KEY_MEDIA_*} flags, such as
490{@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_PREVIOUS} and {@link
491android.media.RemoteControlClient#FLAG_KEY_MEDIA_NEXT}.</p>
492
493<p>You must then register your {@link android.media.RemoteControlClient} by passing it to {@link
494android.media.AudioManager#registerRemoteControlClient MediaManager.registerRemoteControlClient()}.
495Once registered, the broadcast receiver you declared when you instantiated the {@link
496android.media.RemoteControlClient} will receive {@link android.content.Intent#ACTION_MEDIA_BUTTON}
497events when a button is pressed from a remote control. The intent you receive includes the {@link
498android.view.KeyEvent} for the media key pressed, which you can retrieve from the intent with {@link
499android.content.Intent#getParcelableExtra getParcelableExtra(Intent.EXTRA_KEY_EVENT)}.</p>
500
501<p>To display information on the remote control about the media playing, call {@link
502android.media.RemoteControlClient#editMetadata editMetaData()} and add metadata to the returned
503{@link android.media.RemoteControlClient.MetadataEditor}. You can supply a bitmap for media artwork,
504numerical information such as elapsed time, and text information such as the track title. For
505information on available keys see the {@code METADATA_KEY_*} flags in {@link
506android.media.MediaMetadataRetriever}.</p>
507
508<p>For a sample implementation, see the <a
Scott Mainb57769a2011-10-17 11:20:49 -0700509href="{@docRoot}resources/samples/RandomMusicPlayer/index.html">Random Music Player</a>, which
Scott Maine1e9e932011-10-13 23:36:19 -0700510provides compatibility logic such that it enables the remote control client on Android 4.0
511devices while continuing to support devices back to Android 2.1.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700512
513
514<h4>Media Effects</h4>
515
516<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 -0700517videos. For example, image effects allow you to easily fix red-eye, convert an image to grayscale,
518adjust brightness, adjust saturation, rotate an image, apply a fisheye effect, and much more. The
519system performs all effects processing on the GPU to obtain maximum performance.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700520
521<p>For maximum performance, effects are applied directly to OpenGL textures, so your application
Scott Maine1e9e932011-10-13 23:36:19 -0700522must 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 -0700523effects may be from bitmaps, videos or even the camera. However, there are certain restrictions that
524textures must meet:</p>
525<ol>
526<li>They must be bound to a {@link android.opengl.GLES20#GL_TEXTURE_2D} texture image</li>
527<li>They must contain at least one mipmap level</li>
528</ol>
529
530<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 -0700531an image frame. The basic workflow to create an {@link android.media.effect.Effect} is:</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700532
533<ol>
534<li>Call {@link android.media.effect.EffectContext#createWithCurrentGlContext
535EffectContext.createWithCurrentGlContext()} from your OpenGL ES 2.0 context.</li>
536<li>Use the returned {@link android.media.effect.EffectContext} to call {@link
537android.media.effect.EffectContext#getFactory EffectContext.getFactory()}, which returns an instance
538of {@link android.media.effect.EffectFactory}.</li>
539<li>Call {@link android.media.effect.EffectFactory#createEffect createEffect()}, passing it an
Scott Maine1e9e932011-10-13 23:36:19 -0700540effect name from @link android.media.effect.EffectFactory}, such as {@link
Scott Main1d6f70c2011-10-06 22:57:25 -0700541android.media.effect.EffectFactory#EFFECT_FISHEYE} or {@link
542android.media.effect.EffectFactory#EFFECT_VIGNETTE}.</li>
543</ol>
544
545<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 -0700546by calling {@link android.media.effect.EffectFactory#isEffectSupported isEffectSupported()}.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700547
Scott Maine1e9e932011-10-13 23:36:19 -0700548<p>You can adjust an effect’s parameters by calling {@link android.media.effect.Effect#setParameter
Scott Main1d6f70c2011-10-06 22:57:25 -0700549setParameter()} and passing a parameter name and parameter value. Each type of effect accepts
550different parameters, which are documented with the effect name. For example, {@link
551android.media.effect.EffectFactory#EFFECT_FISHEYE} has one parameter for the {@code scale} of the
552distortion.</p>
553
554<p>To apply an effect on a texture, call {@link android.media.effect.Effect#apply apply()} on the
555{@link
556android.media.effect.Effect} and pass in the input texture, it’s width and height, and the output
557texture. The input texture must be bound to a {@link android.opengl.GLES20#GL_TEXTURE_2D} texture
558image (usually done by calling the {@link android.opengl.GLES20#glTexImage2D glTexImage2D()}
559function). You may provide multiple mipmap levels. If the output texture has not been bound to a
560texture image, it will be automatically bound by the effect as a {@link
Scott Maine1e9e932011-10-13 23:36:19 -0700561android.opengl.GLES20#GL_TEXTURE_2D} and with one mipmap level (0), which will have the same
562size as the input.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700563
564
565
566
567
568
569
570<h3 id="Bluetooth">Bluetooth</h3>
571
572<p>Android now supports Bluetooth Health Profile devices, so you can create applications that use
573Bluetooth to communicate with health devices that support Bluetooth, such as heart-rate monitors,
574blood meters, thermometers, and scales.</p>
575
576<p>Similar to regular headset and A2DP profile devices, you must call {@link
577android.bluetooth.BluetoothAdapter#getProfileProxy getProfileProxy()} with a {@link
578android.bluetooth.BluetoothProfile.ServiceListener} and the {@link
579android.bluetooth.BluetoothProfile#HEALTH} profile type to establish a connection with the profile
580proxy object.</p>
581
Scott Maine1e9e932011-10-13 23:36:19 -0700582<p>Once you’ve acquired the Health Profile proxy (the {@link android.bluetooth.BluetoothHealth}
Scott Main1d6f70c2011-10-06 22:57:25 -0700583object), connecting to and communicating with paired health devices involves the following new
584Bluetooth classes:</p>
585<ul>
586<li>{@link android.bluetooth.BluetoothHealthCallback}: You must extend this class and implement the
587callback methods to receive updates about changes in the application’s registration state and
588Bluetooth channel state.</li>
589<li>{@link android.bluetooth.BluetoothHealthAppConfiguration}: During callbacks to your {@link
590android.bluetooth.BluetoothHealthCallback}, you’ll receive an instance of this object, which
591provides configuration information about the available Bluetooth health device, which you must use
592to perform various operations such as initiate and terminate connections with the {@link
593android.bluetooth.BluetoothHealth} APIs.</li>
594</ul>
595
Scott Maine1e9e932011-10-13 23:36:19 -0700596<p>For more information about using the Bluetooth Health Profile, see the documentation for {@link
Scott Main1d6f70c2011-10-06 22:57:25 -0700597android.bluetooth.BluetoothHealth}.</p>
598
599
Scott Maine1e9e932011-10-13 23:36:19 -0700600
Scott Main1d6f70c2011-10-06 22:57:25 -0700601<h3 id="AndroidBeam">Android Beam (NDEF Push with NFC)</h3>
602
Scott Maine1e9e932011-10-13 23:36:19 -0700603<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 -0700604another (a process also known as “NDEF Push"). The data transfer is initiated when two
Scott Main1d6f70c2011-10-06 22:57:25 -0700605Android-powered devices that support Android Beam are in close proximity (about 4 cm), usually with
606their backs touching. The data inside the NDEF message can contain any data that you wish to share
607between devices. For example, the People app shares contacts, YouTube shares videos, and Browser
608shares URLs using Android Beam.</p>
609
610<p>To transmit data between devices using Android Beam, you need to create an {@link
611android.nfc.NdefMessage} that contains the information you want to share while your activity is in
Scott Maine1e9e932011-10-13 23:36:19 -0700612the foreground. You must then pass the {@link android.nfc.NdefMessage} to the system in one of two
613ways:</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700614
615<ul>
Scott Maine1e9e932011-10-13 23:36:19 -0700616<li>Define a single {@link android.nfc.NdefMessage} to push while in the activity:
Scott Main1d6f70c2011-10-06 22:57:25 -0700617<p>Call {@link android.nfc.NfcAdapter#setNdefPushMessage setNdefPushMessage()} at any time to set
Scott Maine1e9e932011-10-13 23:36:19 -0700618the message you want to send. For instance, you might call this method and pass it your {@link
Scott Main1d6f70c2011-10-06 22:57:25 -0700619android.nfc.NdefMessage} during your activity’s {@link android.app.Activity#onCreate onCreate()}
Scott Maine1e9e932011-10-13 23:36:19 -0700620method. Then, whenever Android Beam is activated with another device while the activity is in the
621foreground, the system sends the {@link android.nfc.NdefMessage} to the other device.</p></li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700622
Scott Maine1e9e932011-10-13 23:36:19 -0700623<li>Define the {@link android.nfc.NdefMessage} to push at the time that Android Beam is initiated:
624<p>Implement {@link android.nfc.NfcAdapter.CreateNdefMessageCallback}, in which your
625implementation of the {@link
626android.nfc.NfcAdapter.CreateNdefMessageCallback#createNdefMessage createNdefMessage()}
Scott Main1d6f70c2011-10-06 22:57:25 -0700627method returns the {@link android.nfc.NdefMessage} you want to send. Then pass the {@link
Scott Maine1e9e932011-10-13 23:36:19 -0700628android.nfc.NfcAdapter.CreateNdefMessageCallback} implementation to {@link
629android.nfc.NfcAdapter#setNdefPushMessageCallback setNdefPushMessageCallback()}.</p>
630<p>In this case, when Android Beam is activated with another device while your activity is in the
631foreground, the system calls {@link
632android.nfc.NfcAdapter.CreateNdefMessageCallback#createNdefMessage createNdefMessage()} to retrieve
633the {@link android.nfc.NdefMessage} you want to send. This allows you to define the {@link
634android.nfc.NdefMessage} to deliver only once Android Beam is initiated, in case the contents
635of the message might vary throughout the life of the activity.</p></li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700636</ul>
637
638<p>In case you want to run some specific code once the system has successfully delivered your NDEF
639message to the other device, you can implement {@link
640android.nfc.NfcAdapter.OnNdefPushCompleteCallback} and set it with {@link
641android.nfc.NfcAdapter#setOnNdefPushCompleteCallback setNdefPushCompleteCallback()}. The system will
642then call {@link android.nfc.NfcAdapter.OnNdefPushCompleteCallback#onNdefPushComplete
643onNdefPushComplete()} when the message is delivered.</p>
644
645<p>On the receiving device, the system dispatches NDEF Push messages in a similar way to regular NFC
646tags. The system invokes an intent with the {@link android.nfc.NfcAdapter#ACTION_NDEF_DISCOVERED}
647action to start an activity, with either a URL or a MIME type set according to the first {@link
648android.nfc.NdefRecord} in the {@link android.nfc.NdefMessage}. For the activity you want to
Scott Maine1e9e932011-10-13 23:36:19 -0700649respond, you can declare intent filters for the URLs or MIME types your app cares about. For more
Scott Main1d6f70c2011-10-06 22:57:25 -0700650information about Tag Dispatch see the <a
Scott Mainb57769a2011-10-17 11:20:49 -0700651href="{@docRoot}guide/topics/nfc/index.html#dispatch">NFC</a> developer guide.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700652
653<p>If you want your {@link android.nfc.NdefMessage} to carry a URI, you can now use the convenience
654method {@link android.nfc.NdefRecord#createUri createUri} to construct a new {@link
655android.nfc.NdefRecord} based on either a string or a {@link android.net.Uri} object. If the URI is
656a special format that you want your application to also receive during an Android Beam event, you
657should create an intent filter for your activity using the same URI scheme in order to receive the
658incoming NDEF message.</p>
659
Scott Mainb57769a2011-10-17 11:20:49 -0700660<p>You should also pass an “Android application record" with your {@link android.nfc.NdefMessage} in
Scott Maine1e9e932011-10-13 23:36:19 -0700661order to guarantee that your application handles the incoming NDEF message, even if other
662applications filter for the same intent action. You can create an Android application record by
663calling {@link android.nfc.NdefRecord#createApplicationRecord createApplicationRecord()}, passing it
664your application’s package name. When the other device receives the NDEF message with the
665application record and multiple applications contain activities that handle the specified intent,
666the system always delivers the message to the activity in your application (based on the matching
667application record). If the target device does not currently have your application installed, the
668system uses the Android application record to launch Android Market and take the user to the
669application in order to install it.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700670
671<p>If your application doesn’t use NFC APIs to perform NDEF Push messaging, then Android provides a
672default behavior: When your application is in the foreground on one device and Android Beam is
673invoked with another Android-powered device, then the other device receives an NDEF message with an
674Android application record that identifies your application. If the receiving device has the
675application installed, the system launches it; if it’s not installed, Android Market opens and takes
Scott Maine1e9e932011-10-13 23:36:19 -0700676the user to your application in order to install it.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700677
Scott Maine1e9e932011-10-13 23:36:19 -0700678<p>For some example code, see the <a
679href="{@docRoot}resources/samples/AndroidBeamDemo/src/com/example/android/beam/Beam.html">Android
680Beam Demo</a> sample app.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700681
682
683
684
Scott Maine09743272011-10-14 11:25:46 -0700685<h3 id="WiFiDirect">Wi-Fi Direct</h3>
Scott Main1d6f70c2011-10-06 22:57:25 -0700686
Scott Maine1e9e932011-10-13 23:36:19 -0700687<p>Android now supports Wi-Fi Direct for peer-to-peer (P2P) connections between Android-powered
Scott Main1d6f70c2011-10-06 22:57:25 -0700688devices and other device types without a hotspot or Internet connection. The Android framework
689provides 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 -0700690device supports Wi-Fi Direct, then communicate over a speedy connection across distances much longer
691than a Bluetooth connection.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700692
693<p>A new package, {@link android.net.wifi.p2p}, contains all the APIs for performing peer-to-peer
694connections with Wi-Fi. The primary class you need to work with is {@link
Scott Maine1e9e932011-10-13 23:36:19 -0700695android.net.wifi.p2p.WifiP2pManager}, which you can acquire by calling {@link
Scott Main1d6f70c2011-10-06 22:57:25 -0700696android.app.Activity#getSystemService getSystemService(WIFI_P2P_SERVICE)}. The {@link
Scott Maine1e9e932011-10-13 23:36:19 -0700697android.net.wifi.p2p.WifiP2pManager} includes APIs that allow you to:</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700698<ul>
699<li>Initialize your application for P2P connections by calling {@link
700android.net.wifi.p2p.WifiP2pManager#initialize initialize()}</li>
Scott Maine1e9e932011-10-13 23:36:19 -0700701
Scott Main1d6f70c2011-10-06 22:57:25 -0700702<li>Discover nearby devices by calling {@link android.net.wifi.p2p.WifiP2pManager#discoverPeers
703discoverPeers()}</li>
Scott Maine1e9e932011-10-13 23:36:19 -0700704
Scott Main1d6f70c2011-10-06 22:57:25 -0700705<li>Start a P2P connection by calling {@link android.net.wifi.p2p.WifiP2pManager#connect
706connect()}</li>
707<li>And more</li>
708</ul>
709
710<p>Several other interfaces and classes are necessary as well, such as:</p>
711<ul>
712<li>The {@link android.net.wifi.p2p.WifiP2pManager.ActionListener} interface allows you to receive
713callbacks when an operation such as discovering peers or connecting to them succeeds or fails.</li>
Scott Maine1e9e932011-10-13 23:36:19 -0700714
Scott Main1d6f70c2011-10-06 22:57:25 -0700715<li>{@link android.net.wifi.p2p.WifiP2pManager.PeerListListener} interface allows you to receive
716information about discovered peers. The callback provides a {@link
717android.net.wifi.p2p.WifiP2pDeviceList}, from which you can retrieve a {@link
718android.net.wifi.p2p.WifiP2pDevice} object for each device within range and get information such as
719the device name, address, device type, the WPS configurations the device supports, and more.</li>
Scott Maine1e9e932011-10-13 23:36:19 -0700720
Scott Main1d6f70c2011-10-06 22:57:25 -0700721<li>The {@link android.net.wifi.p2p.WifiP2pManager.GroupInfoListener} interface allows you to
Scott Maine1e9e932011-10-13 23:36:19 -0700722receive information about a P2P group. The callback provides a {@link
723android.net.wifi.p2p.WifiP2pGroup} object, which provides group information such as the owner, the
724network name, and passphrase.</li>
725
Scott Main1d6f70c2011-10-06 22:57:25 -0700726<li>{@link android.net.wifi.p2p.WifiP2pManager.ConnectionInfoListener} interface allows you to
Scott Maine1e9e932011-10-13 23:36:19 -0700727receive information about the current connection. The callback provides a {@link
Scott Main1d6f70c2011-10-06 22:57:25 -0700728android.net.wifi.p2p.WifiP2pInfo} object, which has information such as whether a group has been
729formed and who is the group owner.</li>
730</ul>
731
732<p>In order to use the Wi-Fi P2P APIs, your app must request the following user permissions:</p>
733<ul>
734<li>{@link android.Manifest.permission#ACCESS_WIFI_STATE}</li>
735<li>{@link android.Manifest.permission#CHANGE_WIFI_STATE}</li>
Scott Maine1e9e932011-10-13 23:36:19 -0700736<li>{@link android.Manifest.permission#INTERNET} (although your app doesn’t technically connect
Scott Mainb57769a2011-10-17 11:20:49 -0700737to the Internet, communicating to Wi-Fi Direct peers with standard java sockets requires Internet
738permission).</li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700739</ul>
740
741<p>The Android system also broadcasts several different actions during certain Wi-Fi P2P events:</p>
742<ul>
743<li>{@link android.net.wifi.p2p.WifiP2pManager#WIFI_P2P_CONNECTION_CHANGED_ACTION}: The P2P
Scott Maine1e9e932011-10-13 23:36:19 -0700744connection state has changed. This carries {@link
745android.net.wifi.p2p.WifiP2pManager#EXTRA_WIFI_P2P_INFO} with a {@link
746android.net.wifi.p2p.WifiP2pInfo} object and {@link
Scott Main1d6f70c2011-10-06 22:57:25 -0700747android.net.wifi.p2p.WifiP2pManager#EXTRA_NETWORK_INFO} with a {@link android.net.NetworkInfo}
748object.</li>
Scott Maine1e9e932011-10-13 23:36:19 -0700749
Scott Main1d6f70c2011-10-06 22:57:25 -0700750<li>{@link android.net.wifi.p2p.WifiP2pManager#WIFI_P2P_STATE_CHANGED_ACTION}: The P2P state has
Scott Maine1e9e932011-10-13 23:36:19 -0700751changed between enabled and disabled. It carries {@link
Scott Main1d6f70c2011-10-06 22:57:25 -0700752android.net.wifi.p2p.WifiP2pManager#EXTRA_WIFI_STATE} with either {@link
753android.net.wifi.p2p.WifiP2pManager#WIFI_P2P_STATE_DISABLED} or {@link
754android.net.wifi.p2p.WifiP2pManager#WIFI_P2P_STATE_ENABLED}</li>
Scott Maine1e9e932011-10-13 23:36:19 -0700755
Scott Main1d6f70c2011-10-06 22:57:25 -0700756<li>{@link android.net.wifi.p2p.WifiP2pManager#WIFI_P2P_PEERS_CHANGED_ACTION}: The list of peer
Scott Maine1e9e932011-10-13 23:36:19 -0700757devices has changed.</li>
758
Scott Main1d6f70c2011-10-06 22:57:25 -0700759<li>{@link android.net.wifi.p2p.WifiP2pManager#WIFI_P2P_THIS_DEVICE_CHANGED_ACTION}: The details for
760this device have changed.</li>
761</ul>
762
763<p>See the {@link android.net.wifi.p2p.WifiP2pManager} documentation for more information. Also
Scott Mainb57769a2011-10-17 11:20:49 -0700764look at the <a href="{@docRoot}resources/samples/WiFiDirectDemo/index.html">Wi-Fi Direct Demo</a>
Scott Maine1e9e932011-10-13 23:36:19 -0700765sample application.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700766
767
768
769
770
Scott Maine09743272011-10-14 11:25:46 -0700771<h3 id="NetworkUsage">Network Usage</h3>
Scott Main1d6f70c2011-10-06 22:57:25 -0700772
Scott Maine1e9e932011-10-13 23:36:19 -0700773<p>Android 4.0 gives users precise visibility of how much network data their applications are using.
774The Settings app provides controls that allow users to manage set limits for network data usage and
775even disable the use of background data for individual apps. In order to avoid users disabling your
776app’s access to data from the background, you should develop strategies to use use the data
777connection efficiently and adjust your usage depending on the type of connection available.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700778
779<p>If your application performs a lot of network transactions, you should provide user settings that
780allow users to control your app’s data habits, such as how often your app syncs data, whether to
781perform uploads/downloads only when on Wi-Fi, whether to use data while roaming, etc. With these
782controls available to them, users are much less likely to disable your app’s access to data when
783they approach their limits, because they can instead precisely control how much data your app uses.
Scott Maine1e9e932011-10-13 23:36:19 -0700784If you provide a preference activity with these settings, you should include in its manifest
785declaration an intent filter for the {@link android.content.Intent#ACTION_MANAGE_NETWORK_USAGE}
786action. For example:</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700787
788<pre>
789&lt;activity android:name="DataPreferences" android:label="@string/title_preferences">
790 &lt;intent-filter>
791 &lt;action android:name="android.intent.action.MANAGE_NETWORK_USAGE" />
792 &lt;category android:name="android.intent.category.DEFAULT" />
793 &lt;/intent-filter>
794&lt;/activity>
795</pre>
796
Scott Maine1e9e932011-10-13 23:36:19 -0700797<p>This intent filter indicates to the system that this is the activity that controls your
Scott Main1d6f70c2011-10-06 22:57:25 -0700798application’s data usage. Thus, when the user inspects how much data your app is using from the
Scott Mainb57769a2011-10-17 11:20:49 -0700799Settings app, a “View application settings" button is available that launches your
Scott Maine1e9e932011-10-13 23:36:19 -0700800preference activity so the user can refine how much data your app uses.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700801
802<p>Also beware that {@link android.net.ConnectivityManager#getBackgroundDataSetting()} is now
803deprecated and always returns true&mdash;use {@link
804android.net.ConnectivityManager#getActiveNetworkInfo()} instead. Before you attempt any network
805transactions, you should always call {@link android.net.ConnectivityManager#getActiveNetworkInfo()}
806to get the {@link android.net.NetworkInfo} that represents the current network and query {@link
807android.net.NetworkInfo#isConnected()} to check whether the device has a
Scott Maine1e9e932011-10-13 23:36:19 -0700808connection. You can then check other connection properties, such as whether the device is
Scott Main1d6f70c2011-10-06 22:57:25 -0700809roaming or connected to Wi-Fi.</p>
810
811
812
813
814
815
816
Scott Main1d6f70c2011-10-06 22:57:25 -0700817
Scott Maine1e9e932011-10-13 23:36:19 -0700818<h3 id="RenderScript">RenderScript</h3>
Scott Main1d6f70c2011-10-06 22:57:25 -0700819
Scott Maine1e9e932011-10-13 23:36:19 -0700820<p>Three major features have been added to RenderScript:</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700821
822<ul>
823 <li>Off-screen rendering to a framebuffer object</li>
824 <li>Rendering inside a view</li>
825 <li>RS for each from the framework APIs</li>
826</ul>
827
828<p>The {@link android.renderscript.Allocation} class now supports a {@link
829android.renderscript.Allocation#USAGE_GRAPHICS_RENDER_TARGET} memory space, which allows you to
830render things directly into the {@link android.renderscript.Allocation} and use it as a framebuffer
Scott Maine1e9e932011-10-13 23:36:19 -0700831object.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700832
Scott Maine1e9e932011-10-13 23:36:19 -0700833<p>{@link android.renderscript.RSTextureView} provides a means to display RenderScript graphics
834inside of a {@link android.view.View}, unlike {@link android.renderscript.RSSurfaceView}, which
835creates a separate window. This key difference allows you to do things such as move, transform, or
836animate an {@link android.renderscript.RSTextureView} as well as draw RenderScript graphics inside
837a view that lies within an activity layout.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700838
Scott Maine1e9e932011-10-13 23:36:19 -0700839<p>The {@link android.renderscript.Script#forEach Script.forEach()} method allows you to call
840RenderScript compute scripts from the VM level and have them automatically delegated to available
841cores on the device. You do not use this method directly, but any compute RenderScript that you
842write will have a {@link android.renderscript.Script#forEach forEach()} method that you can call in
843the reflected RenderScript class. You can call the reflected {@link
844android.renderscript.Script#forEach forEach()} method by passing in an input {@link
845android.renderscript.Allocation} to process, an output {@link android.renderscript.Allocation} to
846write the result to, and a {@link android.renderscript.FieldPacker} data structure in case the
847RenderScript needs more information. Only one of the {@link android.renderscript.Allocation}s is
848necessary and the data structure is optional.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700849
850
851
852
853
854
855<h3 id="A11y">Accessibility</h3>
856
Scott Maine1e9e932011-10-13 23:36:19 -0700857<p>Android 4.0 improves accessibility for sight-impaired users with new explore-by-touch mode
858and extended APIs that allow you to provide more information about view content or
859develop advanced accessibility services.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700860
861
Scott Maine1e9e932011-10-13 23:36:19 -0700862<h4>Explore-by-touch mode</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -0700863
Scott Maine1e9e932011-10-13 23:36:19 -0700864<p>Users with vision loss can now explore the screen by touching and dragging a finger across the
865screen to hear voice descriptions of the content. Because the explore-by-touch mode works like a
866virtual cursor, it allows screen readers to identify the descriptive text the same way that screen
867readers can when the user navigates with a d-pad or trackball&mdash;by reading information provided
868by {@link android.R.attr#contentDescription android:contentDescription} and {@link
869android.view.View#setContentDescription setContentDescription()} upon a simulated "hover" event. So,
870consider this is a reminder that you should provide descriptive text for the views in your
871application, especially for {@link android.widget.ImageButton}, {@link android.widget.EditText},
872{@link android.widget.ImageView} and other widgets that might not naturally contain descriptive
873text.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700874
Scott Main1d6f70c2011-10-06 22:57:25 -0700875
Scott Maine1e9e932011-10-13 23:36:19 -0700876<h4>Accessibility for views</h4>
877
878<p>To enhance the information available to accessibility services such as screen readers, you can
879implement new callback methods for accessibility events in your custom {@link
880android.view.View} components.</p>
881
882<p>It's important to first note that the behavior of the {@link
883android.view.View#sendAccessibilityEvent sendAccessibilityEvent()} method has changed in Android
8844.0. As with previous version of Android, when the user enables accessibility services on the device
885and an input event such as a click or hover occurs, the respective view is notified with a call to
886{@link android.view.View#sendAccessibilityEvent sendAccessibilityEvent()}. Previously, the
887implementation of {@link android.view.View#sendAccessibilityEvent sendAccessibilityEvent()} would
888initialize an {@link android.view.accessibility.AccessibilityEvent} and send it to {@link
889android.view.accessibility.AccessibilityManager}. The new behavior involves some additional callback
890methods that allow the view and its parents to add more contextual information to the event:
Scott Main1d6f70c2011-10-06 22:57:25 -0700891<ol>
Scott Maine1e9e932011-10-13 23:36:19 -0700892 <li>When invoked, the {@link
893android.view.View#sendAccessibilityEvent sendAccessibilityEvent()} and {@link
894android.view.View#sendAccessibilityEventUnchecked sendAccessibilityEventUnchecked()} methods defer
895to {@link android.view.View#onInitializeAccessibilityEvent onInitializeAccessibilityEvent()}.
896 <p>Custom implementations of {@link android.view.View} might want to implement {@link
897android.view.View#onInitializeAccessibilityEvent onInitializeAccessibilityEvent()} to
898attach additional accessibility information to the {@link
899android.view.accessibility.AccessibilityEvent}, but should also call the super implementation to
900provide default information such as the standard content description, item index, and more.
901However, you should not add additional text content in this callback&mdash;that happens
902next.</p></li>
903 <li>Once initialized, if the event is one of several types that should be populated with text
904information, the view then receives a call to {@link
905android.view.View#dispatchPopulateAccessibilityEvent dispatchPopulateAccessibilityEvent()}, which
906defers to the {@link android.view.View#onPopulateAccessibilityEvent onPopulateAccessibilityEvent()}
907callback.
908 <p>Custom implementations of {@link android.view.View} should usually implement {@link
909android.view.View#onPopulateAccessibilityEvent onPopulateAccessibilityEvent()} to add additional
910text content to the {@link android.view.accessibility.AccessibilityEvent} if the {@link
911android.R.attr#contentDescription android:contentDescription} text is missing or
912insufficient. To add more text description to the
913{@link android.view.accessibility.AccessibilityEvent}, call {@link
914android.view.accessibility.AccessibilityEvent#getText()}.{@link java.util.List#add add()}.</p>
915</li>
916 <li>At this point, the {@link android.view.View} passes the event up the view hierarchy by calling
917{@link android.view.ViewGroup#requestSendAccessibilityEvent requestSendAccessibilityEvent()} on the
918parent view. Each parent view then has the chance to augment the accessibility information by
919adding an {@link android.view.accessibility.AccessibilityRecord}, until it
920ultimately reaches the root view, which sends the event to the {@link
921android.view.accessibility.AccessibilityManager} with {@link
922android.view.accessibility.AccessibilityManager#sendAccessibilityEvent
923sendAccessibilityEvent()}.</li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700924</ol>
925
Scott Maine1e9e932011-10-13 23:36:19 -0700926<p>In addition to the new methods above, which are useful when extending the {@link
927android.view.View} class, you can also intercept these event callbacks on any {@link
928android.view.View} by extending {@link
929android.view.View.AccessibilityDelegate AccessibilityDelegate} and setting it on the view with
930{@link android.view.View#setAccessibilityDelegate setAccessibilityDelegate()}.
931When you do, each accessibility method in the view defers the call to the corresponding method in
932the delegate. For example, when the view receives a call to {@link
933android.view.View#onPopulateAccessibilityEvent onPopulateAccessibilityEvent()}, it passes it to the
934same method in the {@link android.view.View.AccessibilityDelegate}. Any methods not handled by
935the delegate are given right back to the view for default behavior. This allows you to override only
936the methods necessary for any given view without extending the {@link android.view.View} class.</p>
937
938
939<p>If you want to maintain compatibility with Android versions prior to 4.0, while also supporting
940the new the accessibility APIs, you can do so with the latest version of the <em>v4 support
941library</em> (in <a href="{@docRoot}sdk/compatibility-library.html">Compatibility Package, r4</a>)
942using a set of utility classes that provide the new accessibility APIs in a backward-compatible
943design.</p>
944
945
946
947<h4>Accessibility services</h4>
948
949<p>If you're developing an accessibility service, the information about various accessibility events
950has been significantly expanded to enable more advanced accessibility feedback for users. In
951particular, events are generated based on view composition, providing better context information and
952allowing accessibility services to traverse view hierarchies to get additional view information and
953deal with special cases.</p>
954
955<p>If you're developing an accessibility service (such as a screen reader), you can access
956additional content information and traverse view hierarchies with the following procedure:</p>
957<ol>
958<li>Upon receiving an {@link android.view.accessibility.AccessibilityEvent} from an application,
959call the {@link android.view.accessibility.AccessibilityEvent#getRecord(int)
960AccessibilityEvent.getRecord()} to retrieve a specific {@link
961android.view.accessibility.AccessibilityRecord} (there may be several records attached to the
962event).</li>
963
964<li>From either {@link android.view.accessibility.AccessibilityEvent} or an individual {@link
965android.view.accessibility.AccessibilityRecord}, you can call {@link
966android.view.accessibility.AccessibilityRecord#getSource() getSource()} to retrieve a {@link
967android.view.accessibility.AccessibilityNodeInfo} object.
968 <p>An {@link android.view.accessibility.AccessibilityNodeInfo} represents a single node
969of the window content in a format that allows you to query accessibility information about that
970node. The {@link android.view.accessibility.AccessibilityNodeInfo} object returned from {@link
971android.view.accessibility.AccessibilityEvent} describes the event source, whereas the source from
972an {@link android.view.accessibility.AccessibilityRecord} describes the predecessor of the event
973source.</p></li>
974
975<li>With the {@link android.view.accessibility.AccessibilityNodeInfo}, you can query information
976about it, call {@link
977android.view.accessibility.AccessibilityNodeInfo#getParent getParent()} or {@link
978android.view.accessibility.AccessibilityNodeInfo#getChild getChild()} to traverse the view
979hierarchy, and even add child views to the node.</li>
980</ol>
981
982<p>In order for your application to publish itself to the system as an accessibility service, it
983must declare an XML configuration file that corresponds to {@link
984android.accessibilityservice.AccessibilityServiceInfo}. For more information about creating an
985accessibility service, see {@link
Scott Main1d6f70c2011-10-06 22:57:25 -0700986android.accessibilityservice.AccessibilityService} and {@link
987android.accessibilityservice.AccessibilityService#SERVICE_META_DATA
Scott Maine1e9e932011-10-13 23:36:19 -0700988SERVICE_META_DATA} for information about the XML configuration.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700989
990
Scott Maine1e9e932011-10-13 23:36:19 -0700991<h4>Other accessibility APIs</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -0700992
Scott Maine1e9e932011-10-13 23:36:19 -0700993<p>If you're interested in the device's accessibility state, the {@link
994android.view.accessibility.AccessibilityManager} has some new APIs such as:</p>
995<ul>
996 <li>{@link android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener}
997is an interface that allows you to receive a callback whenever accessibility is enabled or
998disabled.</li>
999 <li>{@link android.view.accessibility.AccessibilityManager#getEnabledAccessibilityServiceList
1000 getEnabledAccessibilityServiceList()} provides information about which accessibility services
1001 are currently enabled.</li>
1002 <li>{@link android.view.accessibility.AccessibilityManager#isTouchExplorationEnabled()} tells
1003 you whether the explore-by-touch mode is enabled.</li>
1004</ul>
Scott Main1d6f70c2011-10-06 22:57:25 -07001005
1006
1007
1008<h3 id="Enterprise">Enterprise</h3>
1009
1010<p>Android 4.0 expands the capabilities for enterprise application with the following features.</p>
1011
Scott Maine1e9e932011-10-13 23:36:19 -07001012<h4>VPN services</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -07001013
1014<p>The new {@link android.net.VpnService} allows applications to build their own VPN (Virtual
Scott Maine1e9e932011-10-13 23:36:19 -07001015Private Network), running as a {@link android.app.Service}. A VPN service creates an interface for a
1016virtual network with its own address and routing rules and performs all reading and writing with a
1017file descriptor.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001018
1019<p>To create a VPN service, use {@link android.net.VpnService.Builder}, which allows you to specify
1020the network address, DNS server, network route, and more. When complete, you can establish the
1021interface by calling {@link android.net.VpnService.Builder#establish()}, which returns a {@link
1022android.os.ParcelFileDescriptor}. </p>
1023
1024<p>Because a VPN service can intercept packets, there are security implications. As such, if you
1025implement {@link android.net.VpnService}, then your service must require the {@link
1026android.Manifest.permission#BIND_VPN_SERVICE} to ensure that only the system can bind to it (only
1027the system is granted this permission&mdash;apps cannot request it). To then use your VPN service,
1028users must manually enable it in the system settings.</p>
1029
1030
Scott Maine1e9e932011-10-13 23:36:19 -07001031<h4>Device restrictions</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -07001032
1033<p>Applications that manage the device restrictions can now disable the camera using {@link
1034android.app.admin.DevicePolicyManager#setCameraDisabled setCameraDisabled()} and the {@link
1035android.app.admin.DeviceAdminInfo#USES_POLICY_DISABLE_CAMERA} property (applied with a {@code
1036&lt;disable-camera /&gt;} element in the policy configuration file).</p>
1037
1038
Scott Maine1e9e932011-10-13 23:36:19 -07001039<h4>Certificate management</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -07001040
1041<p>The new {@link android.security.KeyChain} class provides APIs that allow you to import and access
Scott Maine1e9e932011-10-13 23:36:19 -07001042certificates in the system key store. Certificates streamline the installation of both client
1043certificates (to validate the identity of the user) and certificate authority certificates (to
1044verify server identity). Applications such as web browsers or email clients can access the installed
1045certificates to authenticate users to servers. See the {@link android.security.KeyChain}
Scott Main1d6f70c2011-10-06 22:57:25 -07001046documentation for more information.</p>
1047
1048
1049
1050
Scott Main1d6f70c2011-10-06 22:57:25 -07001051
1052
1053
Scott Maine1e9e932011-10-13 23:36:19 -07001054<h3 id="Sensors">Device Sensors</h3>
Scott Main1d6f70c2011-10-06 22:57:25 -07001055
Scott Maine1e9e932011-10-13 23:36:19 -07001056<p>Two new sensor types have been added in Android 4.0:</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001057
Scott Maine1e9e932011-10-13 23:36:19 -07001058<ul>
1059 <li>{@link android.hardware.Sensor#TYPE_AMBIENT_TEMPERATURE}: A temperature sensor that provides
1060the ambient (room) temperature in degrees Celsius.</li>
1061 <li>{@link android.hardware.Sensor#TYPE_RELATIVE_HUMIDITY}: A humidity sensor that provides the
1062relative ambient (room) humidity as a percentage.</li>
1063</ul>
Scott Main1d6f70c2011-10-06 22:57:25 -07001064
Scott Maine1e9e932011-10-13 23:36:19 -07001065<p>If a device has both {@link android.hardware.Sensor#TYPE_AMBIENT_TEMPERATURE} and {@link
1066android.hardware.Sensor#TYPE_RELATIVE_HUMIDITY} sensors, you can use them to calculate the dew point
1067and the absolute humidity.</p>
1068
1069<p>The previous temperature sensor, {@link android.hardware.Sensor#TYPE_TEMPERATURE}, has been
1070deprecated. You should use the {@link android.hardware.Sensor#TYPE_AMBIENT_TEMPERATURE} sensor
1071instead.</p>
1072
1073<p>Additionally, Android’s three synthetic sensors have been improved so they now have lower latency
1074and smoother output. These sensors include the gravity sensor ({@link
1075android.hardware.Sensor#TYPE_GRAVITY}), rotation vector sensor ({@link
1076android.hardware.Sensor#TYPE_ROTATION_VECTOR}), and linear acceleration sensor ({@link
1077android.hardware.Sensor#TYPE_LINEAR_ACCELERATION}). The improved sensors rely on the gyroscope
1078sensor to improve their output, so the sensors appear only on devices that have a gyroscope.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001079
1080
1081
1082
1083
1084<h3 id="TTS">Text-to-speech Engines</h3>
1085
Scott Maine1e9e932011-10-13 23:36:19 -07001086<p>Android’s text-to-speech (TTS) APIs have been significantly extended to allow applications to
1087more easily implement custom TTS engines, while applications that want to use a TTS engine have a
1088couple new APIs for selecting an engine.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001089
1090
1091<h4>Using text-to-speech engines</h4>
1092
1093<p>In previous versions of Android, you could use the {@link android.speech.tts.TextToSpeech} class
Scott Maine1e9e932011-10-13 23:36:19 -07001094to perform text-to-speech (TTS) operations using the TTS engine provided by the system or set a
1095custom engine using {@link android.speech.tts.TextToSpeech#setEngineByPackageName
1096setEngineByPackageName()}. In Android 4.0, the {@link
1097android.speech.tts.TextToSpeech#setEngineByPackageName setEngineByPackageName()} method has been
1098deprecated and you can now specify the engine to use with a new {@link
1099android.speech.tts.TextToSpeech} constructor that accepts the package name of a TTS engine.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001100
1101<p>You can also query the available TTS engines with {@link
1102android.speech.tts.TextToSpeech#getEngines()}. This method returns a list of {@link
1103android.speech.tts.TextToSpeech.EngineInfo} objects, which include meta data such as the engine’s
1104icon, label, and package name.</p>
1105
1106
1107<h4>Building text-to-speech engines</h4>
1108
Scott Maine1e9e932011-10-13 23:36:19 -07001109<p>Previously, custom engines required that the engine be built using an undocumented native header
1110file. In Android 4.0, there is a complete set of framework APIs for building TTS engines. </p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001111
1112<p>The basic setup requires an implementation of {@link android.speech.tts.TextToSpeechService} that
1113responds to the {@link android.speech.tts.TextToSpeech.Engine#INTENT_ACTION_TTS_SERVICE} intent. The
1114primary work for a TTS engine happens during the {@link
Scott Maine1e9e932011-10-13 23:36:19 -07001115android.speech.tts.TextToSpeechService#onSynthesizeText onSynthesizeText()} callback in a service
1116that extends {@link android.speech.tts.TextToSpeechService}. The system delivers this method two
1117objects:</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001118<ul>
1119<li>{@link android.speech.tts.SynthesisRequest}: This contains various data including the text to
1120synthesize, the locale, the speech rate, and voice pitch.</li>
1121<li>{@link android.speech.tts.SynthesisCallback}: This is the interface by which your TTS engine
Scott Maine1e9e932011-10-13 23:36:19 -07001122delivers the resulting speech data as streaming audio. First the engine must call {@link
Scott Main1d6f70c2011-10-06 22:57:25 -07001123android.speech.tts.SynthesisCallback#start start()} to indicate that the engine is ready to deliver
Scott Maine1e9e932011-10-13 23:36:19 -07001124the audio, then call {@link android.speech.tts.SynthesisCallback#audioAvailable audioAvailable()},
1125passing it the audio data in a byte buffer. Once your engine has passed all audio through the
1126buffer, call {@link android.speech.tts.SynthesisCallback#done()}.</li>
Scott Main1d6f70c2011-10-06 22:57:25 -07001127</ul>
1128
Scott Maine1e9e932011-10-13 23:36:19 -07001129<p>Now that the framework supports a true API for creating TTS engines, support for the native code
1130implementation has been removed. Look for a blog post about a compatibility layer
1131that you can use to convert your old TTS engines to the new framework.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001132
1133<p>For an example TTS engine using the new APIs, see the <a
Scott Mainb57769a2011-10-17 11:20:49 -07001134href="{@docRoot}resources/samples/TtsEngine/index.html">Text To Speech Engine</a> sample app.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001135
1136
1137
1138
1139
1140
Scott Maine1e9e932011-10-13 23:36:19 -07001141<h3 id="SpellChecker">Spell Checker Services</h3>
1142
1143<p>A new spell checker framework allows apps to create spell checkers in a manner similar to the
1144input method framework. To create a new spell checker, you must implement a service that extends
1145{@link android.service.textservice.SpellCheckerService} and extend the {@link
1146android.service.textservice.SpellCheckerService.Session} class to provide spelling suggestions based
1147on text provided by interface callback methods. In the {@link
1148android.service.textservice.SpellCheckerService.Session} callback methods, you must return the
1149spelling suggestions as {@link android.view.textservice.SuggestionsInfo} objects. </p>
1150
1151<p>Applications with a spell checker service must declare the {@link
1152android.Manifest.permission#BIND_TEXT_SERVICE} permission as required by the service, such that
1153other services must have this permission in order for them to bind with the spell checker service.
1154The service must also declare an intent filter with {@code &lt;action
1155android:name="android.service.textservice.SpellCheckerService" />} as the intent’s action and should
1156include a {@code &lt;meta-data&gt;} element that declares configuration information for the spell
1157checker. </p>
1158
1159
1160
1161
Scott Main1d6f70c2011-10-06 22:57:25 -07001162
1163
1164
1165
1166
1167<h3 id="ActionBar">Action Bar</h3>
1168
1169<p>The {@link android.app.ActionBar} has been updated to support several new behaviors. Most
1170importantly, the system gracefully manages the action bar’s size and configuration when running on
Scott Maine1e9e932011-10-13 23:36:19 -07001171smaller screens in order to provide an optimal user experience on all screen sizes. For example,
1172when the screen is narrow (such as when a handset is in portrait orientation), the action bar’s
Scott Mainb57769a2011-10-17 11:20:49 -07001173navigation tabs appear in a “stacked bar," which appears directly below the main action bar. You can
1174also 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 -07001175of the screen when the screen is narrow.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001176
1177
Scott Maine1e9e932011-10-13 23:36:19 -07001178<h4>Split action bar</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -07001179
Scott Maine1e9e932011-10-13 23:36:19 -07001180<p>If your action bar includes several action items, not all of them will fit into the action bar on
1181a 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 -07001182allows 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 -07001183separate bar at the bottom of the screen. To enable split action bar, add {@link
Scott Mainb57769a2011-10-17 11:20:49 -07001184android.R.attr#uiOptions android:uiOptions} with {@code "splitActionBarWhenNarrow"} to either your
Scott Maine1e9e932011-10-13 23:36:19 -07001185<a href="guide/topics/manifest/application-element.html">{@code &lt;application&gt;}</a> tag or
1186individual <a href="guide/topics/manifest/activity-element.html">{@code &lt;activity&gt;}</a> tags
1187in your manifest file. When enabled, the system will add an additional bar at the bottom of the
1188screen for all action items when the screen is narrow (no action items will appear in the primary
1189action bar).</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001190
1191<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 -07001192but don’t need the main action bar on top (you want only the tabs to appear at the top), then enable
1193the split action bar as described above and also call {@link
1194android.app.ActionBar#setDisplayShowHomeEnabled setDisplayShowHomeEnabled(false)} to disable the
1195application icon in the action bar. With nothing left in the main action bar, it
1196disappears&mdash;all that’s left are the navigation tabs at the top and the action items at the
1197bottom of the screen.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001198
1199
Scott Maine1e9e932011-10-13 23:36:19 -07001200<h4>Action bar styles</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -07001201
1202<p>If you want to apply custom styling to the action bar, you can use new style properties {@link
1203android.R.attr#backgroundStacked} and {@link android.R.attr#backgroundSplit} to apply a background
1204drawable or color to the stacked bar and split bar, respectively. You can also set these styles at
1205runtime with {@link android.app.ActionBar#setStackedBackgroundDrawable
1206setStackedBackgroundDrawable()} and {@link android.app.ActionBar#setSplitBackgroundDrawable
1207setSplitBackgroundDrawable()}.</p>
1208
1209
Scott Maine1e9e932011-10-13 23:36:19 -07001210<h4>Action provider</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -07001211
Scott Maine1e9e932011-10-13 23:36:19 -07001212<p>The new {@link android.view.ActionProvider} class allows you to create a specialized handler for
1213action items. An action provider can define an action view, a default action behavior, and a submenu
1214for each action item to which it is associated. When you want to create an action item that has
1215dynamic behaviors (such as a variable action view, default action, or submenu), extending {@link
1216android.view.ActionProvider} is a good solution in order to create a reusable component, rather than
1217handling the various action item transformations in your fragment or activity.</p>
1218
1219<p>For example, the {@link android.widget.ShareActionProvider} is an extension of {@link
Scott Mainb57769a2011-10-17 11:20:49 -07001220android.view.ActionProvider} that facilitates a “share" action from the action bar. Instead of using
Scott Maine1e9e932011-10-13 23:36:19 -07001221traditional action item that invokes the {@link android.content.Intent#ACTION_SEND} intent, you can
1222use this action provider to present an action view with a drop-down list of applications that handle
1223the {@link android.content.Intent#ACTION_SEND} intent. When the user selects an application to use
1224for the action, {@link android.widget.ShareActionProvider} remembers that selection and provides it
1225in the action view for faster access to sharing with that app.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001226
1227<p>To declare an action provider for an action item, include the {@code android:actionProviderClass}
Scott Maine1e9e932011-10-13 23:36:19 -07001228attribute in the <a href="{@docRoot}guide/topics/resources/menu-resource.html#item-element">{@code
1229&lt;item&gt;}</a> element for your activity’s options menu, with the class name of the action
1230provider as the value. For example:</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001231
1232<pre>
1233&lt;item android:id="@+id/menu_share"
1234 android:title="Share"
Scott Main1d6f70c2011-10-06 22:57:25 -07001235 android:showAsAction="ifRoom"
1236 android:actionProviderClass="android.widget.ShareActionProvider" /&gt;
1237</pre>
1238
1239<p>In your activity’s {@link android.app.Activity#onCreateOptionsMenu onCreateOptionsMenu()}
Scott Maine1e9e932011-10-13 23:36:19 -07001240callback method, retrieve an instance of the action provider from the menu item and set the
1241intent:</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001242
1243<pre>
1244public boolean onCreateOptionsMenu(Menu menu) {
1245 getMenuInflater().inflate(R.menu.options, menu);
1246 ShareActionProvider shareActionProvider =
1247 (ShareActionProvider) menu.findItem(R.id.menu_share).getActionProvider();
1248 // Set the share intent of the share action provider.
1249 shareActionProvider.setShareIntent(createShareIntent());
1250 ...
1251 return super.onCreateOptionsMenu(menu);
1252}
1253</pre>
1254
1255<p>For an example using the {@link android.widget.ShareActionProvider}, see the <a
Scott Mainb57769a2011-10-17 11:20:49 -07001256href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/
1257ActionBarActionProviderActivity.html">ActionBarActionProviderActivity</a>
Scott Main1d6f70c2011-10-06 22:57:25 -07001258class in ApiDemos.</p>
1259
1260
Scott Maine1e9e932011-10-13 23:36:19 -07001261<h4>Collapsible action views</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -07001262
Scott Maine1e9e932011-10-13 23:36:19 -07001263<p>Action items that provide an action view can now toggle between their action view state and
Scott Main1d6f70c2011-10-06 22:57:25 -07001264traditional action item state. Previously only the {@link android.widget.SearchView} supported
1265collapsing when used as an action view, but now you can add an action view for any action item and
1266switch between the expanded state (action view is visible) and collapsed state (action item is
1267visible).</p>
1268
1269<p>To declare that an action item that contains an action view be collapsible, include the {@code
Scott Mainb57769a2011-10-17 11:20:49 -07001270“collapseActionView"} flag in the {@code android:showAsAction} attribute for the <a
Scott Maine1e9e932011-10-13 23:36:19 -07001271href="{@docRoot}guide/topics/resources/menu-resource.html#item-element">{@code
1272&lt;item&gt;}</a> element in the menu’s XML file.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001273
1274<p>To receive callbacks when an action view switches between expanded and collapsed, register an
1275instance of {@link android.view.MenuItem.OnActionExpandListener} with the respective {@link
1276android.view.MenuItem} by calling {@link android.view.MenuItem#setOnActionExpandListener
1277setOnActionExpandListener()}. Typically, you should do so during the {@link
1278android.app.Activity#onCreateOptionsMenu onCreateOptionsMenu()} callback.</p>
1279
1280<p>To control a collapsible action view, you can call {@link
1281android.view.MenuItem#collapseActionView()} and {@link android.view.MenuItem#expandActionView()} on
1282the respective {@link android.view.MenuItem}.</p>
1283
1284<p>When creating a custom action view, you can also implement the new {@link
1285android.view.CollapsibleActionView} interface to receive callbacks when the view is expanded and
1286collapsed.</p>
1287
1288
Scott Maine1e9e932011-10-13 23:36:19 -07001289<h4>Other APIs for action bar</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -07001290<ul>
Scott Maine1e9e932011-10-13 23:36:19 -07001291<li>{@link android.app.ActionBar#setHomeButtonEnabled setHomeButtonEnabled()} allows you to specify
Scott Mainb57769a2011-10-17 11:20:49 -07001292whether 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 -07001293a button).</li>
1294
Scott Main1d6f70c2011-10-06 22:57:25 -07001295<li>{@link android.app.ActionBar#setIcon setIcon()} and {@link android.app.ActionBar#setLogo
Scott Maine1e9e932011-10-13 23:36:19 -07001296setLogo()} allow you to define the action bar icon or logo at runtime.</li>
1297
Scott Main1d6f70c2011-10-06 22:57:25 -07001298<li>{@link android.app.Fragment#setMenuVisibility Fragment.setMenuVisibility()} allows you to enable
Scott Maine1e9e932011-10-13 23:36:19 -07001299or disable the visibility of the options menu items declared by the fragment. This is useful if the
Scott Main1d6f70c2011-10-06 22:57:25 -07001300fragment has been added to the activity, but is not visible, so the menu items should be
1301hidden.</li>
Scott Maine1e9e932011-10-13 23:36:19 -07001302
Scott Main1d6f70c2011-10-06 22:57:25 -07001303<li>{@link android.app.FragmentManager#invalidateOptionsMenu
1304FragmentManager.invalidateOptionsMenu()}
1305allows you to invalidate the activity options menu during various states of the fragment lifecycle
1306in which using the equivalent method from {@link android.app.Activity} might not be available.</li>
1307</ul>
1308
1309
1310
1311
1312
1313
1314
1315
1316<h3 id="UI">User Interface and Views</h3>
1317
1318<p>Android 4.0 introduces a variety of new views and other UI components.</p>
1319
Scott Maine1e9e932011-10-13 23:36:19 -07001320
Scott Main1d6f70c2011-10-06 22:57:25 -07001321<h4>System UI</h4>
1322
1323<p>Since the early days of Android, the system has managed a UI component known as the <em>status
1324bar</em>, which resides at the top of handset devices to deliver information such as the carrier
1325signal, time, notifications, and so on. Android 3.0 added the <em>system bar</em> for tablet
1326devices, which resides at the bottom of the screen to provide system navigation controls (Home,
1327Back, and so forth) and also an interface for elements traditionally provided by the status bar. In
1328Android 4.0, the system provides a new type of system UI called the <em>navigation bar</em>. The
1329navigation bar shares some qualities with the system bar, because it provides navigation controls
1330for devices that don’t have hardware counterparts for navigating the system, but the navigation
Scott Maine1e9e932011-10-13 23:36:19 -07001331controls is all that the navigation bar offers (a device with the navigation bar, thus, also
1332includes the status bar at the top of the screen).</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001333
1334<p>To this day, you can hide the status bar on handsets using the {@link
1335android.view.WindowManager.LayoutParams#FLAG_FULLSCREEN} flag. In Android 4.0, the APIs that control
1336the system bar’s visibility have been updated to better reflect the behavior of both the system bar
1337and navigation bar:</p>
1338<ul>
1339<li>The {@link android.view.View#SYSTEM_UI_FLAG_LOW_PROFILE} flag replaces View.STATUS_BAR_HIDDEN
Scott Mainb57769a2011-10-17 11:20:49 -07001340flag. When set, this flag enables “low profile" mode for the system bar or
Scott Maine1e9e932011-10-13 23:36:19 -07001341navigation bar. Navigation buttons dim and other elements in the system bar also hide.</li>
1342
Scott Main1d6f70c2011-10-06 22:57:25 -07001343<li>The {@link android.view.View#SYSTEM_UI_FLAG_VISIBLE} flag replaces the {@code
Scott Maine1e9e932011-10-13 23:36:19 -07001344STATUS_BAR_VISIBLE} flag to request the system bar or navigation bar be visible.</li>
1345
Scott Main1d6f70c2011-10-06 22:57:25 -07001346<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 -07001347the navigation bar hide completely. Take note that this works only for the <em>navigation bar</em>
1348used by some handsets (it does <strong>not</strong> hide the system bar on tablets). The navigation
1349bar returns as soon as the system receives user input. As such, this mode is generally used for
1350video playback or other cases in which the whole screen is needed but user input is not
1351required.</li>
Scott Main1d6f70c2011-10-06 22:57:25 -07001352</ul>
1353
Scott Maine1e9e932011-10-13 23:36:19 -07001354<p>You can set each of these flags for the system bar and navigation bar by calling {@link
1355android.view.View#setSystemUiVisibility setSystemUiVisibility()} on any view in your activity. The
1356window manager will combine (OR-together) all flags from all views in your window and
Scott Main1d6f70c2011-10-06 22:57:25 -07001357apply them to the system UI as long as your window has input focus. When your window loses input
1358focus (the user navigates away from your app, or a dialog appears), your flags cease to have effect.
1359Similarly, if you remove those views from the view hierarchy their flags no longer apply.</p>
1360
1361<p>To synchronize other events in your activity with visibility changes to the system UI (for
Scott Maine1e9e932011-10-13 23:36:19 -07001362example, hide the action bar or other UI controls when the system UI hides), you should register a
1363{@link android.view.View.OnSystemUiVisibilityChangeListener} to be notified when the visibility
1364of the system bar or navigation bar changes.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001365
1366<p>See the <a
Scott Mainb57769a2011-10-17 11:20:49 -07001367href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/view/OverscanActivity.html">
Scott Main1d6f70c2011-10-06 22:57:25 -07001368OverscanActivity</a> class for a demonstration of different system UI options.</p>
1369
1370
1371<h4>GridLayout</h4>
1372
1373<p>{@link android.widget.GridLayout} is a new view group that places child views in a rectangular
Scott Maine1e9e932011-10-13 23:36:19 -07001374grid. Unlike {@link android.widget.TableLayout}, {@link android.widget.GridLayout} relies on a flat
Scott Main1d6f70c2011-10-06 22:57:25 -07001375hierarchy and does not make use of intermediate views such as table rows for providing structure.
1376Instead, children specify which row(s) and column(s) they should occupy (cells can span multiple
1377rows and/or columns), and by default are laid out sequentially across the grid’s rows and columns.
1378The {@link android.widget.GridLayout} orientation determines whether sequential children are by
1379default laid out horizontally or vertically. Space between children may be specified either by using
1380instances of the new {@link android.widget.Space} view or by setting the relevant margin parameters
1381on children.</p>
1382
1383<p>See <a
Scott Mainb57769a2011-10-17 11:20:49 -07001384href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/view/index.html">ApiDemos</a
1385>
Scott Main1d6f70c2011-10-06 22:57:25 -07001386for samples using {@link android.widget.GridLayout}.</p>
1387
1388
1389
1390<h4>TextureView</h4>
1391
1392<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 -07001393as a video or an OpenGL scene. Although similar to {@link android.view.SurfaceView}, {@link
Scott Main1d6f70c2011-10-06 22:57:25 -07001394android.view.TextureView} is unique in that it behaves like a regular view, rather than creating a
1395separate window, so you can treat it like any other {@link android.view.View} object. For example,
Scott Maine1e9e932011-10-13 23:36:19 -07001396you can apply transforms, animate it using {@link android.view.ViewPropertyAnimator}, or
Scott Main1d6f70c2011-10-06 22:57:25 -07001397adjust its opacity with {@link android.view.View#setAlpha setAlpha()}.</p>
1398
1399<p>Beware that {@link android.view.TextureView} works only within a hardware accelerated window.</p>
1400
1401<p>For more information, see the {@link android.view.TextureView} documentation.</p>
1402
1403
Scott Maine1e9e932011-10-13 23:36:19 -07001404<h4>Switch widget</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -07001405
1406<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 -07001407side or the other (or simply tap) to toggle an option between two states.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001408
Scott Maine1e9e932011-10-13 23:36:19 -07001409<p>You can use the {@code android:textOn} and {@code android:textOff} attributes to specify the text
1410to appear on the switch when in the on and off setting. The {@code android:text} attribute also
1411allows you to place a label alongside the switch.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001412
1413<p>For a sample using switches, see the <a
Scott Mainb57769a2011-10-17 11:20:49 -07001414href="{@docRoot}resources/samples/ApiDemos/res/layout/switches.html">switches.xml</a> layout file
Scott Main1d6f70c2011-10-06 22:57:25 -07001415and respective <a
Scott Mainb57769a2011-10-17 11:20:49 -07001416href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/view/Switches.html">Switches
Scott Main1d6f70c2011-10-06 22:57:25 -07001417</a> activity.</p>
1418
1419
Scott Maine1e9e932011-10-13 23:36:19 -07001420<h4>Popup menus</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -07001421
1422<p>Android 3.0 introduced {@link android.widget.PopupMenu} to create short contextual menus that pop
Scott Maine1e9e932011-10-13 23:36:19 -07001423up at an anchor point you specify (usually at the point of the item selected). Android 4.0 extends
1424the {@link android.widget.PopupMenu} with a couple useful features:</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001425<ul>
1426<li>You can now easily inflate the contents of a popup menu from an XML <a
Scott Mainb57769a2011-10-17 11:20:49 -07001427href="{@docRoot}guide/topics/resources/menu-resource.html">menu resource</a> with {@link
Scott Main1d6f70c2011-10-06 22:57:25 -07001428android.widget.PopupMenu#inflate inflate()}, passing it the menu resource ID.</li>
1429<li>You can also now create a {@link android.widget.PopupMenu.OnDismissListener} that receives a
1430callback when the menu is dismissed.</li>
1431</ul>
1432
Scott Maine1e9e932011-10-13 23:36:19 -07001433
Scott Main1d6f70c2011-10-06 22:57:25 -07001434<h4>Preferences</h4>
1435
1436<p>A new {@link android.preference.TwoStatePreference} abstract class serves as the basis for
1437preferences that provide a two-state selection option. The new {@link
1438android.preference.SwitchPreference} is an extension of {@link
1439android.preference.TwoStatePreference} that provides a {@link android.widget.Switch} widget in the
1440preference view to allow users to toggle a setting on or off without the need to open an additional
1441preference screen or dialog. For example, the Settings application uses a {@link
1442android.preference.SwitchPreference} for the Wi-Fi and Bluetooth settings.</p>
1443
1444
Scott Maine1e9e932011-10-13 23:36:19 -07001445<h4>Hover events</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -07001446
Scott Mainb57769a2011-10-17 11:20:49 -07001447<p>The {@link android.view.View} class now supports “hover" events to enable richer interactions
Scott Maine1e9e932011-10-13 23:36:19 -07001448through the use of pointer devices (such as a mouse or other devices that drive an on-screen
Scott Main1d6f70c2011-10-06 22:57:25 -07001449cursor).</p>
1450
1451<p>To receive hover events on a view, implement the {@link android.view.View.OnHoverListener} and
1452register it with {@link android.view.View#setOnHoverListener setOnHoverListener()}. When a hover
1453event occurs on the view, your listener receives a call to {@link
1454android.view.View.OnHoverListener#onHover onHover()}, providing the {@link android.view.View} that
1455received the event and a {@link android.view.MotionEvent} that describes the type of hover event
1456that occurred. The hover event can be one of the following:</p>
1457<ul>
1458<li>{@link android.view.MotionEvent#ACTION_HOVER_ENTER}</li>
1459<li>{@link android.view.MotionEvent#ACTION_HOVER_EXIT}</li>
1460<li>{@link android.view.MotionEvent#ACTION_HOVER_MOVE}</li>
1461</ul>
1462
1463<p>Your {@link android.view.View.OnHoverListener} should return true from {@link
1464android.view.View.OnHoverListener#onHover onHover()} if it handles the hover event. If your
1465listener returns false, then the hover event will be dispatched to the parent view as usual.</p>
1466
1467<p>If your application uses buttons or other widgets that change their appearance based on the
Scott Maine1e9e932011-10-13 23:36:19 -07001468current state, you can now use the {@code android:state_hovered} attribute in a <a
Scott Mainb57769a2011-10-17 11:20:49 -07001469href="{@docRoot}guide/topics/resources/drawable-resource.html#StateList">state list drawable</a> to
Scott Main1d6f70c2011-10-06 22:57:25 -07001470provide a different background drawable when a cursor hovers over the view.</p>
1471
1472<p>For a demonstration of the new hover events, see the <a
Scott Mainb57769a2011-10-17 11:20:49 -07001473href="{@docRoot}samples/ApiDemos/src/com/example/android/apis/view/Hover.html">Hover</a> class in
Scott Main1d6f70c2011-10-06 22:57:25 -07001474ApiDemos.</p>
1475
1476
Scott Maine1e9e932011-10-13 23:36:19 -07001477<h4>Stylus and mouse button events</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -07001478
1479<p>Android now provides APIs for receiving input from a stylus input device such as a digitizer
Scott Maine1e9e932011-10-13 23:36:19 -07001480tablet peripheral or a stylus-enabled touch screen.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001481
1482<p>Stylus input operates in a similar manner to touch or mouse input. When the stylus is in contact
1483with the digitizer, applications receive touch events just like they would when a finger is used to
1484touch the display. When the stylus is hovering above the digitizer, applications receive hover
1485events just like they would when a mouse pointer was being moved across the display when no buttons
1486are pressed.</p>
1487
1488<p>Your application can distinguish between finger, mouse, stylus and eraser input by querying the
Scott Mainb57769a2011-10-17 11:20:49 -07001489“tool type" associated with each pointer in a {@link android.view.MotionEvent} using {@link
Scott Main1d6f70c2011-10-06 22:57:25 -07001490android.view.MotionEvent#getToolType getToolType()}. The currently defined tool types are: {@link
1491android.view.MotionEvent#TOOL_TYPE_UNKNOWN}, {@link android.view.MotionEvent#TOOL_TYPE_FINGER},
1492{@link android.view.MotionEvent#TOOL_TYPE_MOUSE}, {@link android.view.MotionEvent#TOOL_TYPE_STYLUS},
1493and {@link android.view.MotionEvent#TOOL_TYPE_ERASER}. By querying the tool type, your application
1494can choose to handle stylus input in different ways from finger or mouse input.</p>
1495
1496<p>Your application can also query which mouse or stylus buttons are pressed by querying the “button
Scott Mainb57769a2011-10-17 11:20:49 -07001497state" of a {@link android.view.MotionEvent} using {@link android.view.MotionEvent#getButtonState
Scott Main1d6f70c2011-10-06 22:57:25 -07001498getButtonState()}. The currently defined button states are: {@link
Scott Maine1e9e932011-10-13 23:36:19 -07001499android.view.MotionEvent#BUTTON_PRIMARY}, {@link android.view.MotionEvent#BUTTON_SECONDARY}, {@link
1500android.view.MotionEvent#BUTTON_TERTIARY}, {@link android.view.MotionEvent#BUTTON_BACK}, and {@link
1501android.view.MotionEvent#BUTTON_FORWARD}. For convenience, the back and forward mouse buttons are
1502automatically mapped to the {@link android.view.KeyEvent#KEYCODE_BACK} and {@link
1503android.view.KeyEvent#KEYCODE_FORWARD} keys. Your application can handle these keys to support
1504mouse button based back and forward navigation.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001505
1506<p>In addition to precisely measuring the position and pressure of a contact, some stylus input
Scott Maine1e9e932011-10-13 23:36:19 -07001507devices also report the distance between the stylus tip and the digitizer, the stylus tilt angle,
1508and the stylus orientation angle. Your application can query this information using {@link
Scott Main1d6f70c2011-10-06 22:57:25 -07001509android.view.MotionEvent#getAxisValue getAxisValue()} with the axis codes {@link
1510android.view.MotionEvent#AXIS_DISTANCE}, {@link android.view.MotionEvent#AXIS_TILT}, and {@link
1511android.view.MotionEvent#AXIS_ORIENTATION}.</p>
1512
1513<p>For a demonstration of tool types, button states and the new axis codes, see the <a
Scott Mainb57769a2011-10-17 11:20:49 -07001514href="{@docRoot}samples/ApiDemos/src/com/example/android/apis/graphics/TouchPaint.html">TouchPaint
Scott Main1d6f70c2011-10-06 22:57:25 -07001515</a> class in ApiDemos.</p>
1516
1517
1518
1519
1520
1521
1522<h3 id="Properties">Properties</h3>
1523
1524<p>The new {@link android.util.Property} class provides a fast, efficient, and easy way to specify a
1525property on any object that allows callers to generically set/get values on target objects. It also
1526allows the functionality of passing around field/method references and allows code to set/get values
1527of the property without knowing the details of what the fields/methods are.</p>
1528
1529<p>For example, if you want to set the value of field {@code bar} on object {@code foo}, you would
1530previously do this:</p>
1531<pre>
1532foo.bar = value;
1533</pre>
1534
1535<p>If you want to call the setter for an underlying private field {@code bar}, you would previously
1536do this:</p>
1537<pre>
1538foo.setBar(value);
1539</pre>
1540
1541<p>However, if you want to pass around the {@code foo} instance and have some other code set the
1542{@code bar} value, there is really no way to do it prior to Android 4.0.</p>
1543
1544<p>Using the {@link android.util.Property} class, you can declare a {@link android.util.Property}
1545object {@code BAR} on class {@code Foo} so that you can set the field on instance {@code foo} of
1546class {@code Foo} like this:</p>
1547<pre>
1548BAR.set(foo, value);
1549</pre>
1550
1551<p>The {@link android.view.View} class now leverages the {@link android.util.Property} class to
1552allow you to set various fields, such as transform properties that were added in Android 3.0 ({@link
1553android.view.View#ROTATION}, {@link android.view.View#ROTATION_X}, {@link
1554android.view.View#TRANSLATION_X}, etc.).</p>
1555
1556<p>The {@link android.animation.ObjectAnimator} class also uses the {@link android.util.Property}
1557class, so you can create an {@link android.animation.ObjectAnimator} with a {@link
1558android.util.Property}, which is faster, more efficient, and more type-safe than the string-based
1559approach.</p>
1560
1561
1562
1563
1564
1565
1566<h3 id="HwAccel">Hardware Acceleration</h3>
1567
1568<p>Beginning with Android 4.0, hardware acceleration for all windows is enabled by default if your
1569application has set either <a
1570href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code targetSdkVersion}</a> or
1571<a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code minSdkVersion}</a> to
Scott Mainb57769a2011-10-17 11:20:49 -07001572{@code “14"} or higher. Hardware acceleration generally results in smoother animations, smoother
Scott Main1d6f70c2011-10-06 22:57:25 -07001573scrolling, and overall better performance and response to user interaction.</p>
1574
1575<p>If necessary, you can manually disable hardware acceleration with the <a
Scott Mainb57769a2011-10-17 11:20:49 -07001576href="{@docRoot}guide/topics/manifest/activity-element.html#hwaccel">{@code hardwareAccelerated}</a>
Scott Main1d6f70c2011-10-06 22:57:25 -07001577attribute for individual <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code
1578&lt;activity&gt;}</a> elements or the <a
1579href="{@docRoot}guide/topics/manifest/application-element.html">{@code &lt;application&gt;}</a>
1580element. You can alternatively disable hardware acceleration for individual views by calling {@link
1581android.view.View#setLayerType setLayerType(LAYER_TYPE_SOFTWARE)}.</p>
1582
Scott Maine1e9e932011-10-13 23:36:19 -07001583<p>For more information about hardware acceleration, including a list of unsupported drawing
1584operations, see the <a href="{@docRoot}guide/topics/graphics/hardware-accel.html">Hardware
1585Acceleration</a> document.</p>
1586
1587
Scott Main1d6f70c2011-10-06 22:57:25 -07001588
1589<h3 id="Jni">JNI Changes</h3>
1590
Scott Maine1e9e932011-10-13 23:36:19 -07001591<p>In previous versions of Android, JNI local references weren’t indirect handles; Android used
1592direct pointers. This wasn't a problem as long as the garbage collector didn't move objects, but it
1593seemed to work because it made it possible to write buggy code. In Android 4.0, the system now uses
1594indirect references in order to detect these bugs.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001595
Scott Mainb57769a2011-10-17 11:20:49 -07001596<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 -07001597href="{@docRoot}guide/practices/design/jni.html">JNI Tips</a>. In Android 4.0, <a
1598href="http://android-developers.blogspot.com/2011/07/debugging-android-jni-with-checkjni.html">
1599CheckJNI</a> has been enhanced to detect these errors. Watch the <a
Scott Mainb57769a2011-10-17 11:20:49 -07001600href="http://android-developers.blogspot.com/">Android Developers Blog</a> for an upcoming post
Scott Maine1e9e932011-10-13 23:36:19 -07001601about common errors with JNI references and how you can fix them.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001602
1603<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 -07001604the <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code
1605targetSdkVersion}</a> or <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code
Scott Mainb57769a2011-10-17 11:20:49 -07001606minSdkVersion}</a> to {@code “14"} or higher. If you’ve set these attributes to any lower value,
Scott Maine1e9e932011-10-13 23:36:19 -07001607then JNI local references behave the same as in previous versions.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001608
1609
1610
1611
1612
1613<h3 id="WebKit">WebKit</h3>
1614<ul>
1615<li>WebKit updated to version 534.30</li>
1616<li>Support for Indic fonts (Devanagari, Bengali, and Tamil, including the complex character support
1617needed for combining glyphs) in {@link android.webkit.WebView} and the built-in Browser</li>
1618<li>Support for Ethiopic, Georgian, and Armenian fonts in {@link android.webkit.WebView} and the
1619built-in Browser</li>
1620<li>Support for <a
1621href="http://google-opensource.blogspot.com/2009/05/introducing-webdriver.html">WebDriver</a> makes
1622it easier for you to test apps that use {@link android.webkit.WebView}</li>
1623</ul>
1624
1625
1626<h4>Android Browser</h4>
1627
1628<p>The Browser application adds the following features to support web applications:</p>
1629<ul>
1630<li>Updated V8 JavaScript compiler for faster performance</li>
1631<li>Plus other notable enhancements carried over from <a
Scott Mainb57769a2011-10-17 11:20:49 -07001632href="{@docRoot}sdk/android-3.0.html">Android
Scott Main1d6f70c2011-10-06 22:57:25 -070016333.0</a> are now available for handsets:
1634<ul>
1635<li>Support for fixed position elements on all pages</li>
1636<li><a href="http://dev.w3.org/2009/dap/camera/">HTML media capture</a></li>
1637<li><a href="http://dev.w3.org/geo/api/spec-source-orientation.html">Device orientation
1638events</a></li>
1639<li><a href="http://www.w3.org/TR/css3-3d-transforms/">CSS 3D transformations</a></li>
1640</ul>
1641</li>
1642</ul>
1643
1644
1645
1646<h3 id="Permissions">Permissions</h3>
1647
1648<p>The following are new permissions:</p>
1649<ul>
1650<li>{@link android.Manifest.permission#ADD_VOICEMAIL}: Allows a voicemail service to add voicemail
1651messages to the device.</li>
1652<li>{@link android.Manifest.permission#BIND_TEXT_SERVICE}: A service that implements {@link
1653android.service.textservice.SpellCheckerService} must require this permission for itself.</li>
1654<li>{@link android.Manifest.permission#BIND_VPN_SERVICE}: A service that implements {@link
1655android.net.VpnService} must require this permission for itself.</li>
1656<li>{@link android.Manifest.permission#READ_PROFILE}: Provides read access to the {@link
1657android.provider.ContactsContract.Profile} provider.</li>
1658<li>{@link android.Manifest.permission#WRITE_PROFILE}: Provides write access to the {@link
1659android.provider.ContactsContract.Profile} provider.</li>
1660</ul>
1661
1662
1663
1664<h3 id="DeviceFeatures">Device Features</h3>
1665
1666<p>The following are new device features:</p>
1667<ul>
1668<li>{@link android.content.pm.PackageManager#FEATURE_WIFI_DIRECT}: Declares that the application
1669uses
1670Wi-Fi for peer-to-peer communications.</li>
1671</ul>
1672
1673
1674
Scott Maine1e9e932011-10-13 23:36:19 -07001675<h2 id="Honeycomb">Previous APIs</h2>
Scott Main1d6f70c2011-10-06 22:57:25 -07001676
Scott Maine1e9e932011-10-13 23:36:19 -07001677<p>In addition to everything above, Android 4.0 naturally supports all APIs from previous releases.
1678Because the Android 3.x (Honeycomb) platform is available only for large-screen devices, if you've
1679been developing primarily for handsets, then you might not be aware of all the APIs added to Android
1680in these recent releases.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001681
Scott Maine1e9e932011-10-13 23:36:19 -07001682<p>Here's a look at some of the most notable APIs you might have missed that are now available
1683on handsets as well:</p>
1684
1685<dl>
1686 <dt><a href="android-3.0.html">Android 3.0</a></dt>
1687 <dd>
1688 <ul>
1689 <li>{@link android.app.Fragment}: A framework component that allows you to separate distinct
1690elements of an activity into self-contained modules that define their own UI and lifecycle. See the
1691<a href="{@docRoot}guide/topics/fundamentals/fragments.html">Fragments</a> developer guide.</li>
1692 <li>{@link android.app.ActionBar}: A replacement for the traditional title bar at the top of
1693the activity window. It includes the application logo in the left corner and provides a new
1694interface for menu items. See the
1695<a href="{@docRoot}guide/topics/ui/actionbar.html">Action Bar</a> developer guide.</li>
1696 <li>{@link android.content.Loader}: A framework component that facilitates asynchronour
1697loading of data in combination with UI components to dynamically load data without blocking the
1698main thread. See the
1699<a href="{@docRoot}guide/topics/fundamentals/loaders.html">Loaders</a> developer guide.</li>
1700 <li>System clipboard: Applications can copy and paste data (beyond mere text) to and from
1701the system-wide clipboard. Clipped data can be plain text, a URI, or an intent. See the
1702<a href="{@docRoot}guide/topics/clipboard/copy-paste.html">Copy and Paste</a> developer guide.</li>
1703 <li>Drag and drop: A set of APIs built into the view framework that facilitates drag and drop
1704operations. See the
1705<a href="{@docRoot}guide/topics/ui/drag-drop.html">Drag and Drop</a> developer guide.</li>
1706 <li>An all new flexible animation framework allows you to animate arbitrary properties of any
1707object (View, Drawable, Fragment, Object, or anything else) and define animation aspects such
1708as duration, interpolation, repeat and more. The new framework makes Animations in Android
1709simpler than ever. See the
1710<a href="{@docRoot}guide/topics/graphics/property-animation.html">Property Animation</a> developer
1711guide.</li>
1712 <li>RenderScript graphics and compute engine: RenderScript offers a high performance 3D
1713graphics rendering and compute API at the native level, which you write in the C (C99 standard),
1714providing the type of performance you expect from a native environment while remaining portable
1715across various CPUs and GPUs. See the
1716<a href="{@docRoot}guide/topics/renderscript/index.html">RenderScript</a> developer
1717guide.</li>
1718 <li>Hardware accelerated 2D graphics: You can now enable the OpenGL renderer for your
1719application by setting {android:hardwareAccelerated="true"} in your manifest element's <a
1720href="{@docRoot}guide/topics/manifest/application-element.html"><code>&lt;application&gt;</code></a>
1721element or for individual <a
1722href="{@docRoot}guide/topics/manifest/activity-element.html"><code>&lt;activity&gt;</code></a>
1723elements. This results
1724in smoother animations, smoother scrolling, and overall better performance and response to user
1725interaction.
1726 <p class="note"><strong>Note:</strong> If you set your application's <a
1727href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code minSdkVersion}</a> or <a
1728href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code targetSdkVersion}</a> to
1729{@code "14"} or higher, hardware acceleration is enabled by default.</p></li>
1730 <li>And much, much more. See the <a href="android-3.0.html">Android 3.0 Platform</a>
1731notes for more information.</li>
1732 </ul>
1733 </dd>
1734
1735 <dt><a href="android-3.1.html">Android 3.1</a></dt>
1736 <dd>
1737 <ul>
1738 <li>USB APIs: Powerful new APIs for integrating connected peripherals with
1739Android applications. The APIs are based on a USB stack and services that are
1740built into the platform, including support for both USB host and device interactions. See the <a
1741href="{@docRoot}guide/topics/usb/index.html">USB Host and Accessory</a> developer guide.</li>
1742 <li>MTP/PTP APIs: Applications can interact directly with connected cameras and other PTP
1743devices to receive notifications when devices are attached and removed, manage files and storage on
1744those devices, and transfer files and metadata to and from them. The MTP API implements the PTP
1745(Picture Transfer Protocol) subset of the MTP (Media Transfer Protocol) specification. See the
1746{@link android.mtp} documentation.</li>
1747 <li>RTP APIs: Android exposes an API to its built-in RTP (Real-time Transport Protocol) stack,
1748which applications can use to manage on-demand or interactive data streaming. In particular, apps
1749that provide VOIP, push-to-talk, conferencing, and audio streaming can use the API to initiate
1750sessions and transmit or receive data streams over any available network. See the {@link
1751android.net.rtp} documentation.</li>
1752 <li>Support for joysticks and other generic motion inputs.</li>
1753 <li>See the <a href="android-3.1.html">Android 3.1 Platform</a>
1754notes for many more new APIs.</li>
1755 </ul>
1756 </dd>
1757
1758 <dt><a href="android-3.2.html">Android 3.2</a></dt>
1759 <dd>
1760 <ul>
1761 <li>New screens support APIs that give you more control over how your applications are
1762displayed across different screen sizes. The API extends the existing screen support model with the
1763ability to precisely target specific screen size ranges by dimensions, measured in
1764density-independent pixel units (such as 600dp or 720dp wide), rather than by their generalized
1765screen sizes (such as large or xlarge). For example, this is important in order to help you
1766distinguish between a 5" device and a 7" device, which would both traditionally be bucketed as
1767"large" screens. See the blog post, <a
1768href="http://android-developers.blogspot.com/2011/07/new-tools-for-managing-screen-sizes.html">
1769New Tools for Managing Screen Sizes</a>.</li>
1770 <li>New constants for <a
1771href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code &lt;uses-feature&gt;}</a> to
1772declare landscape or portrait screen orientation requirements.</li>
1773 <li>The device "screen size" configuration now changes during a screen orientation
1774change. If your app targets API level 13 or higher, you must handle the {@code "screenSize"}
1775configuration change if you also want to handle the {@code "orientation"} configuration change. See
1776<a href="{@docRoot}guide/topics/manifest/activity-element.html#config">{@code
1777android:configChanges}</a> for more information.</li>
1778 <li>See the <a href="android-3.2.html">Android 3.2 Platform</a>
1779notes for other new APIs.</li>
1780 </ul>
1781 </dd>
1782
1783</dl>
Scott Main1d6f70c2011-10-06 22:57:25 -07001784
1785
1786
1787
1788
1789
1790<h2 id="api-diff">API Differences Report</h2>
1791
Scott Maine1e9e932011-10-13 23:36:19 -07001792<p>For a detailed view of all API changes in Android {@sdkPlatformVersion} (API Level
Scott Main1d6f70c2011-10-06 22:57:25 -07001793{@sdkPlatformApiLevel}), see the <a
Scott Maine1e9e932011-10-13 23:36:19 -07001794href="{@docRoot}sdk/api_diff/{@sdkPlatformApiLevel}/changes.html">API Differences Report</a>.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001795
1796
1797
1798<h2 id="api-level">API Level</h2>
1799
Scott Maine1e9e932011-10-13 23:36:19 -07001800<p>The Android {@sdkPlatformVersion} API is assigned an integer
1801identifier&mdash;<strong>{@sdkPlatformApiLevel}</strong>&mdash;that is stored in the system itself.
1802This identifier, called the "API level", allows the system to correctly determine whether an
1803application is compatible with the system, prior to installing the application. </p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001804
1805<p>To use APIs introduced in Android {@sdkPlatformVersion} in your application, you need compile the
Scott Maine1e9e932011-10-13 23:36:19 -07001806application against an Android platform that supports API level {@sdkPlatformApiLevel} or
1807higher. Depending on your needs, you might also need to add an
Scott Main1d6f70c2011-10-06 22:57:25 -07001808<code>android:minSdkVersion="{@sdkPlatformApiLevel}"</code> attribute to the
Scott Maine1e9e932011-10-13 23:36:19 -07001809<a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html">{@code &lt;uses-sdk&gt;}</a>
1810element.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001811
Scott Maine1e9e932011-10-13 23:36:19 -07001812<p>For more information, see the <a href="{@docRoot}guide/appendix/api-levels.html">API Levels</a>
1813document. </p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001814
1815
1816<h2 id="apps">Built-in Applications</h2>
1817
1818<p>The system image included in the downloadable platform provides these
1819built-in applications:</p>
1820
1821<table style="border:0;padding-bottom:0;margin-bottom:0;">
1822<tr>
1823<td style="border:0;padding-bottom:0;margin-bottom:0;">
1824<ul>
1825<li>API Demos</li>
1826<li>Browser</li>
1827<li>Calculator</li>
Scott Maine1e9e932011-10-13 23:36:19 -07001828<li>Calendar</li>
Scott Main1d6f70c2011-10-06 22:57:25 -07001829<li>Camera</li>
1830<li>Clock</li>
1831<li>Custom Locale</li>
1832<li>Dev Tools</li>
1833<li>Downloads</li>
1834<li>Email</li>
1835<li>Gallery</li>
1836</ul>
1837</td>
1838<td style="border:0;padding-bottom:0;margin-bottom:0;padding-left:5em;">
1839<ul>
1840<li>Gestures Builder</li>
1841<li>Messaging</li>
1842<li>Music</li>
1843<li>People</li>
1844<li>Phone</li>
1845<li>Search</li>
1846<li>Settings</li>
Scott Maine1e9e932011-10-13 23:36:19 -07001847<li>Speech Recorder</li>
Scott Main1d6f70c2011-10-06 22:57:25 -07001848<li>Speech Recorder</li>
1849<li>Widget Preview</li>
1850</ul>
1851</td>
1852</tr>
1853</table>
1854
1855
1856<h2 id="locs" style="margin-top:.75em;">Locales</h2>
1857
Scott Maine1e9e932011-10-13 23:36:19 -07001858<p>The system image included in the downloadable SDK platform provides a variety of built-in
1859locales. In some cases, region-specific strings are available for the locales. In other cases, a
1860default version of the language is used. The languages that are available in the Android 3.0 system
1861image are listed below (with <em>language</em>_<em>country/region</em> locale descriptor).</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001862
1863<table style="border:0;padding-bottom:0;margin-bottom:0;">
1864<tr>
1865<td style="border:0;padding-bottom:0;margin-bottom:0;">
1866<ul>
1867<li>Arabic, Egypt (ar_EG)</li>
1868<li>Arabic, Israel (ar_IL)</li>
1869<li>Bulgarian, Bulgaria (bg_BG)</li>
1870<li>Catalan, Spain (ca_ES)</li>
1871<li>Czech, Czech Republic (cs_CZ)</li>
1872<li>Danish, Denmark(da_DK)</li>
1873<li>German, Austria (de_AT)</li>
1874<li>German, Switzerland (de_CH)</li>
1875<li>German, Germany (de_DE)</li>
1876<li>German, Liechtenstein (de_LI)</li>
1877<li>Greek, Greece (el_GR)</li>
1878<li>English, Australia (en_AU)</li>
1879<li>English, Canada (en_CA)</li>
1880<li>English, Britain (en_GB)</li>
1881<li>English, Ireland (en_IE)</li>
1882<li>English, India (en_IN)</li>
1883<li>English, New Zealand (en_NZ)</li>
1884<li>English, Singapore(en_SG)</li>
1885<li>English, US (en_US)</li>
1886<li>English, Zimbabwe (en_ZA)</li>
1887<li>Spanish (es_ES)</li>
1888<li>Spanish, US (es_US)</li>
1889<li>Finnish, Finland (fi_FI)</li>
1890<li>French, Belgium (fr_BE)</li>
1891<li>French, Canada (fr_CA)</li>
1892<li>French, Switzerland (fr_CH)</li>
1893<li>French, France (fr_FR)</li>
1894<li>Hebrew, Israel (he_IL)</li>
1895<li>Hindi, India (hi_IN)</li>
1896</ul>
1897</td>
1898<td style="border:0;padding-bottom:0;margin-bottom:0;padding-left:5em;">
1899<li>Croatian, Croatia (hr_HR)</li>
1900<li>Hungarian, Hungary (hu_HU)</li>
1901<li>Indonesian, Indonesia (id_ID)</li>
1902<li>Italian, Switzerland (it_CH)</li>
1903<li>Italian, Italy (it_IT)</li>
1904<li>Japanese (ja_JP)</li>
1905<li>Korean (ko_KR)</li>
1906<li>Lithuanian, Lithuania (lt_LT)</li>
1907<li>Latvian, Latvia (lv_LV)</li>
1908<li>Norwegian bokmål, Norway (nb_NO)</li>
1909<li>Dutch, Belgium (nl_BE)</li>
1910<li>Dutch, Netherlands (nl_NL)</li>
1911<li>Polish (pl_PL)</li>
1912<li>Portuguese, Brazil (pt_BR)</li>
1913<li>Portuguese, Portugal (pt_PT)</li>
1914<li>Romanian, Romania (ro_RO)</li>
1915<li>Russian (ru_RU)</li></li>
1916<li>Slovak, Slovakia (sk_SK)</li>
1917<li>Slovenian, Slovenia (sl_SI)</li>
1918<li>Serbian (sr_RS)</li>
1919<li>Swedish, Sweden (sv_SE)</li>
1920<li>Thai, Thailand (th_TH)</li>
1921<li>Tagalog, Philippines (tl_PH)</li>
1922<li>Turkish, Turkey (tr_TR)</li>
1923<li>Ukrainian, Ukraine (uk_UA)</li>
1924<li>Vietnamese, Vietnam (vi_VN)</li>
1925<li>Chinese, PRC (zh_CN)</li>
1926<li>Chinese, Taiwan (zh_TW)</li>
1927</td>
1928</tr>
1929</table>
1930
1931<p class="note"><strong>Note:</strong> The Android platform may support more
1932locales than are included in the SDK system image. All of the supported locales
1933are available in the <a href="http://source.android.com/">Android Open Source
1934Project</a>.</p>
1935
1936<h2 id="skins">Emulator Skins</h2>
1937
Scott Maine1e9e932011-10-13 23:36:19 -07001938<p>The downloadable platform includes the following emulator skins:</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001939
1940<ul>
1941 <li>
Scott Maine1e9e932011-10-13 23:36:19 -07001942 QVGA (240x320, low density, small screen)
1943 </li>
1944 <li>
1945 WQVGA400 (240x400, low density, normal screen)
1946 </li>
1947 <li>
1948 WQVGA432 (240x432, low density, normal screen)
1949 </li>
1950 <li>
1951 HVGA (320x480, medium density, normal screen)
1952 </li>
1953 <li>
1954 WVGA800 (480x800, high density, normal screen)
1955 </li>
1956 <li>
1957 WVGA854 (480x854 high density, normal screen)
1958 </li>
1959 <li>
1960 WXGA720 (1280x720, extra-high density, normal screen) <span class="new">new</span>
1961 </li>
1962 <li>
1963 WSVGA (1024x600, medium density, large screen) <span class="new">new</span>
1964 </li>
1965 <li>
1966 WXGA (1280x800, medium density, xlarge screen)
Scott Main1d6f70c2011-10-06 22:57:25 -07001967 </li>
1968</ul>
1969
Scott Maine1e9e932011-10-13 23:36:19 -07001970<p>To test your application on an emulator that represents the latest Android device, you can create
1971an AVD with the new WXGA720 skin (it's an xhdpi, normal screen device). Note that the emulator
1972currently doesn't support the new on-screen navigation bar for devices without hardware navigation
1973buttons, so when using this skin, you must use keyboard keys <em>Home</em> for the Home button,
1974<em>ESC</em> for the Back button, and <em>F2</em> or <em>Page-up</em> for the Menu button.</p>
1975
1976<p>However, due to performance issues in the emulator when running high-resolution screens such as
1977the one for the WXGA720 skin, we recommend that you primarily use the traditional WVGA800 skin
1978(hdpi, normal screen) to test your application.</p>
1979