blob: ade3d8b2e9e8c9863c2b0bf2c67888a194d94fa6 [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-level">API Level</a></li>
15 <li><a href="#apps">Built-in Applications</a></li>
16 <li><a href="#locs">Locales</a></li>
17 <li><a href="#skins">Emulator Skins</a></li>
18</ol>
19
20<h2>Reference</h2>
21<ol>
22<li><a
23href="{@docRoot}sdk/api_diff/14/changes.html">API
24Differences Report &raquo;</a> </li>
25</ol>
26
27</div>
28</div>
29
30
31<p><em>API Level:</em>&nbsp;<strong>{@sdkPlatformApiLevel}</strong></p>
32
Scott Main423aca12011-10-17 16:31:11 -070033<p>Android 4.0 is a major platform release that adds a variety of new features for users and app
34developers. Besides all the new features and APIs discussed below, Android 4.0 is an important
35platform release because it brings the extensive set of APIs and Holographic themes from Android 3.x
36to smaller screens. As an app developer, you now have a single platform and unified API framework
37that enables you to develop and publish your application with a single APK that provides an
38optimized user experience for handsets, tablets, and more, when running the same version of
39Android&mdash;Android 4.0 (API level 14) or greater. </p>
Scott Main1d6f70c2011-10-06 22:57:25 -070040
Scott Main423aca12011-10-17 16:31:11 -070041<p>The Android {@sdkPlatformVersion} platform is available as a
42downloadable component for the Android SDK so you can begin developing and testing your
43applications on Android 4.0 with the Android emulator. The downloadable platform includes
Scott Main1d6f70c2011-10-06 22:57:25 -070044an Android library and system image, as well as a set of emulator skins and
Scott Main423aca12011-10-17 16:31:11 -070045more. The downloadable platform does not include any external libraries.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -070046
47<p>To start developing or testing against Android {@sdkPlatformVersion},
48use the Android SDK Manager to download the platform into your SDK. For more
49information, see <a href="{@docRoot}sdk/adding-components.html">Adding SDK
50Components</a>. If you are new to Android, <a
51href="{@docRoot}sdk/index.html">download the SDK Starter Package</a> first.</p>
52
Scott Main1d6f70c2011-10-06 22:57:25 -070053<p class="note"><strong>Reminder:</strong> If you've already published an
54Android application, please test your application on Android {@sdkPlatformVersion} as
55soon as possible to be sure your application provides the best
56experience possible on the latest Android-powered devices.</p>
57
Scott Main423aca12011-10-17 16:31:11 -070058<p>For a high-level overview of the new user and developer features in Android 4.0, see the
Scott Maine1e9e932011-10-13 23:36:19 -070059<a href="http://developer.android.com/sdk/android-4.0-highlights.html">Platform Highlights</a>.</p>
60
Scott Main1d6f70c2011-10-06 22:57:25 -070061
Scott Main423aca12011-10-17 16:31:11 -070062
Scott Main1d6f70c2011-10-06 22:57:25 -070063<h2 id="relnotes">Revisions</h2>
64
65<p>To determine what revision of the Android {@sdkPlatformVersion} platform you
66have installed, refer to the "Installed Packages" listing in the Android SDK Manager.</p>
67
68
69<div class="toggle-content opened" style="padding-left:1em;">
70
71 <p><a href="#" onclick="return toggleContent(this)">
72 <img src="{@docRoot}assets/images/triangle-opened.png"
73class="toggle-content-img" alt="" />
74 Android {@sdkPlatformVersion}, Revision 1</a> <em>(October 2011)</em>
75 </a></p>
76
77 <div class="toggle-content-toggleme" style="padding-left:2em;">
78
79<dl>
Scott Maine1e9e932011-10-13 23:36:19 -070080<dt>Initial release. SDK Tools r14 or higher is recommended.</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 Main423aca12011-10-17 16:31:11 -0700101 <li><a href="#Contacts">Social APIs in Contacts Provider</a></li>
Scott Maine1e9e932011-10-13 23:36:19 -0700102 <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="#Multimedia">Multimedia</a></li>
Scott Main423aca12011-10-17 16:31:11 -0700105 <li><a href="#Camera">Camera</a></li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700106 <li><a href="#AndroidBeam">Android Beam (NDEF Push with NFC)</a></li>
Scott Maine09743272011-10-14 11:25:46 -0700107 <li><a href="#WiFiDirect">Wi-Fi Direct</a></li>
Scott Main423aca12011-10-17 16:31:11 -0700108 <li><a href="#Bluetooth">Bluetooth Health Devices</a></li>
109 <li><a href="#A11y">Accessibility</a></li>
110 <li><a href="#SpellChecker">Spell Checker Services</a></li>
111 <li><a href="#TTS">Text-to-speech Engines</a></li>
Scott Maine09743272011-10-14 11:25:46 -0700112 <li><a href="#NetworkUsage">Network Usage</a></li>
Scott Maine1e9e932011-10-13 23:36:19 -0700113 <li><a href="#RenderScript">RenderScript</a></li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700114 <li><a href="#Enterprise">Enterprise</a></li>
Scott Maine1e9e932011-10-13 23:36:19 -0700115 <li><a href="#Sensors">Device Sensors</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>
Scott Main423aca12011-10-17 16:31:11 -0700118 <li><a href="#Input">Input Framework</a></li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700119 <li><a href="#Properties">Properties</a></li>
120 <li><a href="#HwAccel">Hardware Acceleration</a></li>
121 <li><a href="#Jni">JNI Changes</a></li>
122 <li><a href="#WebKit">WebKit</a></li>
123 <li><a href="#Permissions">Permissions</a></li>
124 <li><a href="#DeviceFeatures">Device Features</a></li>
125 </ol>
126 </div>
127</div>
128
129
130
131
132
Scott Main423aca12011-10-17 16:31:11 -0700133<h3 id="Contacts">Social APIs in Contacts Provider</h3>
Scott Main1d6f70c2011-10-06 22:57:25 -0700134
Scott Main423aca12011-10-17 16:31:11 -0700135<p>The contact APIs defined by the {@link android.provider.ContactsContract} provider have been
136extended to support new social-oriented features such as a personal profile for the device owner and
137the ability for users to invite individual contacts to social networks that are installed on the
138device.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700139
140
141<h4>User Profile</h4>
142
143<p>Android now includes a personal profile that represents the device owner, as defined by the
Scott Maine1e9e932011-10-13 23:36:19 -0700144{@link android.provider.ContactsContract.Profile} table. Social apps that maintain a user identity
145can contribute to the user's profile data by creating a new {@link
Scott Main1d6f70c2011-10-06 22:57:25 -0700146android.provider.ContactsContract.RawContacts} entry within the {@link
147android.provider.ContactsContract.Profile}. That is, raw contacts that represent the device user do
148not belong in the traditional raw contacts table defined by the {@link
149android.provider.ContactsContract.RawContacts} Uri; instead, you must add a profile raw contact in
150the table at {@link android.provider.ContactsContract.Profile#CONTENT_RAW_CONTACTS_URI}. Raw
Scott Maine1e9e932011-10-13 23:36:19 -0700151contacts in this table are then aggregated into the single user-visible profile labeled "Me".</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700152
153<p>Adding a new raw contact for the profile requires the {@link
154android.Manifest.permission#WRITE_PROFILE} permission. Likewise, in order to read from the profile
155table, you must request the {@link android.Manifest.permission#READ_PROFILE} permission. However,
Scott Maine1e9e932011-10-13 23:36:19 -0700156most apps should need to read the user profile, even when contributing data to the
157profile. Reading the user profile is a sensitive permission and you should expect users to be
158skeptical of apps that request it.</p>
159
Scott Main1d6f70c2011-10-06 22:57:25 -0700160
Scott Main1d6f70c2011-10-06 22:57:25 -0700161<h4>Invite Intent</h4>
162
Scott Maine1e9e932011-10-13 23:36:19 -0700163<p>The {@link android.provider.ContactsContract.Intents#INVITE_CONTACT} intent action allows an app
164to invoke an action that indicates the user wants to add a contact to a social network. The app
165receiving the app uses it to invite the specified contact to that
166social network. Most apps will be on the receiving-end of this operation. For example, the
167built-in People app invokes the invite intent when the user selects "Add connection" for a specific
168social app that's listed in a person's contact details.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700169
Scott Maine1e9e932011-10-13 23:36:19 -0700170<p>To make your app visible as in the "Add connection" list, your app must provide a sync adapter to
171sync contact information from your social network. You must then indicate to the system that your
172app responds to the {@link android.provider.ContactsContract.Intents#INVITE_CONTACT} intent by
173adding the {@code inviteContactActivity} attribute to your app’s sync configuration file, with a
174fully-qualified name of the activity that the system should start when sending the invite intent.
175The activity that starts can then retrieve the URI for the contact in question from the intent’s
176data and perform the necessary work to invite that contact to the network or add the person to the
177user’s connections.</p>
178
179<p>See the <a href="{@docRoot}resources/samples/SampleSyncAdapter/index.html">Sample Sync
180Adapter</a> app for an example (specifically, see the <a
181href="{@docRoot}resources/samples/SampleSyncAdapter/res/xml-v14/contacts.html">contacts.xml</a>
182file).</p>
183
Scott Main1d6f70c2011-10-06 22:57:25 -0700184
Scott Main423aca12011-10-17 16:31:11 -0700185<h4>Large photos</h4>
186
187<p>Android now supports high resolution photos for contacts. Now, when you push a photo into a
188contact record, the system processes it into both a 96x96 thumbnail (as it has previously) and a
189256x256 "display photo" that's stored in a new file-based photo store (the exact dimensions that the
190system chooses may vary in the future). You can add a large photo to a contact by putting a large
191photo in the usual {@link android.provider.ContactsContract.CommonDataKinds.Photo#PHOTO} column of a
192data row, which the system will then process into the appropriate thumbnail and display photo
193records.</p>
194
195
Scott Main1d6f70c2011-10-06 22:57:25 -0700196<h4>Contact Usage Feedback</h4>
197
198<p>The new {@link android.provider.ContactsContract.DataUsageFeedback} APIs allow you to help track
199how often the user uses particular methods of contacting people, such as how often the user uses
200each phone number or e-mail address. This information helps improve the ranking for each contact
Scott Maine1e9e932011-10-13 23:36:19 -0700201method associated with each person and provide better suggestions for contacting each person.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700202
203
204
205
206
Scott Maine1e9e932011-10-13 23:36:19 -0700207<h3 id="Calendar">Calendar Provider</h3>
Scott Main1d6f70c2011-10-06 22:57:25 -0700208
Scott Mainb57769a2011-10-17 11:20:49 -0700209<p>The new calendar APIs allow you to read, add, modify and delete calendars, events, attendees,
210reminders and alerts, which are stored in the Calendar Provider.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700211
Scott Maine1e9e932011-10-13 23:36:19 -0700212<p>A variety of apps and widgets can use these APIs to read and modify calendar events. However,
213some of the most compelling use cases are sync adapters that synchronize the user's calendar from
Scott Mainb57769a2011-10-17 11:20:49 -0700214other calendar services with the Calendar Provider, in order to offer a unified location for all the
215user's events. Google Calendar events, for example, are synchronized with the Calendar Provider by
216the Google Calendar Sync Adapter, allowing these events to be viewed with Android's built-in
Scott Maine1e9e932011-10-13 23:36:19 -0700217Calendar app.</p>
218
219<p>The data model for calendars and event-related information in the Calendar Provider is
220defined by {@link android.provider.CalendarContract}. All the user’s calendar data is stored in a
221number of tables defined by various subclasses of {@link android.provider.CalendarContract}:</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700222
223<ul>
224<li>The {@link android.provider.CalendarContract.Calendars} table holds the calendar-specific
225information. Each row in this table contains the details for a single calendar, such as the name,
226color, sync information, and so on.</li>
227
228<li>The {@link android.provider.CalendarContract.Events} table holds event-specific information.
Scott Maine1e9e932011-10-13 23:36:19 -0700229Each row in this table contains the information for a single event, such as the
230event title, location, start time, end time, and so on. The event can occur one time or recur
231multiple times. Attendees, reminders, and extended properties are stored in separate tables and
232use the event’s {@code _ID} to link them with the event.</li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700233
234<li>The {@link android.provider.CalendarContract.Instances} table holds the start and end time for
235occurrences of an event. Each row in this table represents a single occurrence. For one-time events
236there is a one-to-one mapping of instances to events. For recurring events, multiple rows are
237automatically generated to correspond to the multiple occurrences of that event.</li>
238
239<li>The {@link android.provider.CalendarContract.Attendees} table holds the event attendee or guest
240information. Each row represents a single guest of an event. It specifies the type of guest the
Scott Maine1e9e932011-10-13 23:36:19 -0700241person is and the person’s response for the event.</li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700242
243<li>The {@link android.provider.CalendarContract.Reminders} table holds the alert/notification data.
244Each row represents a single alert for an event. An event can have multiple reminders. The number of
Scott Maine1e9e932011-10-13 23:36:19 -0700245reminders per event is specified in {@code MAX_REMINDERS}, which is set by the sync adapter that
246owns the given calendar. Reminders are specified in number-of-minutes before the event is
247scheduled and specify an alarm method such as to use an alert, email, or SMS to remind
248the user.</li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700249
250<li>The {@link android.provider.CalendarContract.ExtendedProperties} table hold opaque data fields
Scott Maine1e9e932011-10-13 23:36:19 -0700251used by the sync adapter. The provider takes no action with items in this table except to delete
252them when their related events are deleted.</li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700253</ul>
254
Scott Maine1e9e932011-10-13 23:36:19 -0700255<p>To access a user’s calendar data with the Calendar Provider, your application must request
256the {@link android.Manifest.permission#READ_CALENDAR} permission (for read access) and
257{@link android.Manifest.permission#WRITE_CALENDAR} (for write access).</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700258
Scott Main1d6f70c2011-10-06 22:57:25 -0700259
Scott Maine1e9e932011-10-13 23:36:19 -0700260<h4>Event intent</h4>
261
262<p>If all you want to do is add an event to the user’s calendar, you can use an
263{@link android.content.Intent#ACTION_INSERT} intent with a {@code "vnd.android.cursor.item/event"}
264MIME type to start an activity in the Calendar app that creates new events. Using the intent does
265not require any permission and you can specify event details with the following extras:</p>
266
267<ul>
268 <li>{@link android.provider.CalendarContract.EventsColumns#TITLE Events.TITLE}: Name for the
269event</li>
270 <li>{@link
271android.provider.CalendarContract#EXTRA_EVENT_BEGIN_TIME CalendarContract.EXTRA_EVENT_BEGIN_TIME}:
272Event begin time in milliseconds from the
273epoch</li>
274 <li>{@link
275android.provider.CalendarContract#EXTRA_EVENT_END_TIME CalendarContract.EXTRA_EVENT_END_TIME}: Event
276end time in milliseconds from the epoch</li>
277 <li>{@link android.provider.CalendarContract.EventsColumns#EVENT_LOCATION Events.EVENT_LOCATION}:
278Location of the event</li>
279 <li>{@link android.provider.CalendarContract.EventsColumns#DESCRIPTION Events.DESCRIPTION}: Event
280description</li>
281 <li>{@link android.content.Intent#EXTRA_EMAIL Intent.EXTRA_EMAIL}: Email addresses of those to
282invite</li>
283 <li>{@link android.provider.CalendarContract.EventsColumns#RRULE Events.RRULE}: The recurrence
284rule for the event</li>
285 <li>{@link android.provider.CalendarContract.EventsColumns#ACCESS_LEVEL Events.ACCESS_LEVEL}:
286Whether the event is private or public</li>
287 <li>{@link android.provider.CalendarContract.EventsColumns#AVAILABILITY Events.AVAILABILITY}:
288Whether the time period of this event allows for other events to be scheduled at the same time</li>
289</ul>
290
291
292
293
294<h3 id="Voicemail">Voicemail Provider</h3>
295
Scott Main423aca12011-10-17 16:31:11 -0700296<p>The new Voicemail Provider allows applications to add voicemails to the
297device, in order to present all the user's voicemails in a single visual presentation. For instance,
298it’s possible that a user has multiple voicemail sources, such as
299one from the phone’s service provider and others from VoIP or other alternative voice
300services. These apps can use the Voicemail Provider APIs to add their voicemails to the device. The
301built-in Phone application then presents all voicemails to the user in a unified presentation.
Scott Maine1e9e932011-10-13 23:36:19 -0700302Although 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
Scott Main423aca12011-10-17 16:31:11 -0700306<p>Because the APIs currently do not allow third-party apps to read all the voicemails from the
307system, the only third-party apps that should use the voicemail APIs are those that have voicemail
308to deliver to the user.</p>
309
Scott Maine1e9e932011-10-13 23:36:19 -0700310<p>The {@link android.provider.VoicemailContract} class defines the content provider for the
Scott Main423aca12011-10-17 16:31:11 -0700311Voicemail Provder. The subclasses {@link android.provider.VoicemailContract.Voicemails} and {@link
312android.provider.VoicemailContract.Status} provide tables in which apps can
Scott Maine1e9e932011-10-13 23:36:19 -0700313insert voicemail data for storage on the device. For an example of a voicemail provider app, see the
Scott Mainb57769a2011-10-17 11:20:49 -0700314<a href="{@docRoot}resources/samples/VoicemailProviderDemo/index.html">Voicemail Provider
Scott Maine1e9e932011-10-13 23:36:19 -0700315Demo</a>.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700316
317
318
319
Scott Main423aca12011-10-17 16:31:11 -0700320
321<h3 id="Multimedia">Multimedia</h3>
322
323<p>Android 4.0 adds several new APIs for applications that interact with media such as photos,
324videos, and music.</p>
325
326
327<h4>Media Effects</h4>
328
329<p>A new media effects framework allows you to apply a variety of visual effects to images and
330videos. For example, image effects allow you to easily fix red-eye, convert an image to grayscale,
331adjust brightness, adjust saturation, rotate an image, apply a fisheye effect, and much more. The
332system performs all effects processing on the GPU to obtain maximum performance.</p>
333
334<p>For maximum performance, effects are applied directly to OpenGL textures, so your application
335must have a valid OpenGL context before it can use the effects APIs. The textures to which you apply
336effects may be from bitmaps, videos or even the camera. However, there are certain restrictions that
337textures must meet:</p>
338<ol>
339<li>They must be bound to a {@link android.opengl.GLES20#GL_TEXTURE_2D} texture image</li>
340<li>They must contain at least one mipmap level</li>
341</ol>
342
343<p>An {@link android.media.effect.Effect} object defines a single media effect that you can apply to
344an image frame. The basic workflow to create an {@link android.media.effect.Effect} is:</p>
345
346<ol>
347<li>Call {@link android.media.effect.EffectContext#createWithCurrentGlContext
348EffectContext.createWithCurrentGlContext()} from your OpenGL ES 2.0 context.</li>
349<li>Use the returned {@link android.media.effect.EffectContext} to call {@link
350android.media.effect.EffectContext#getFactory EffectContext.getFactory()}, which returns an instance
351of {@link android.media.effect.EffectFactory}.</li>
352<li>Call {@link android.media.effect.EffectFactory#createEffect createEffect()}, passing it an
353effect name from @link android.media.effect.EffectFactory}, such as {@link
354android.media.effect.EffectFactory#EFFECT_FISHEYE} or {@link
355android.media.effect.EffectFactory#EFFECT_VIGNETTE}.</li>
356</ol>
357
358<p>You can adjust an effect’s parameters by calling {@link android.media.effect.Effect#setParameter
359setParameter()} and passing a parameter name and parameter value. Each type of effect accepts
360different parameters, which are documented with the effect name. For example, {@link
361android.media.effect.EffectFactory#EFFECT_FISHEYE} has one parameter for the {@code scale} of the
362distortion.</p>
363
364<p>To apply an effect on a texture, call {@link android.media.effect.Effect#apply apply()} on the
365{@link
366android.media.effect.Effect} and pass in the input texture, it’s width and height, and the output
367texture. The input texture must be bound to a {@link android.opengl.GLES20#GL_TEXTURE_2D} texture
368image (usually done by calling the {@link android.opengl.GLES20#glTexImage2D glTexImage2D()}
369function). You may provide multiple mipmap levels. If the output texture has not been bound to a
370texture image, it will be automatically bound by the effect as a {@link
371android.opengl.GLES20#GL_TEXTURE_2D} and with one mipmap level (0), which will have the same
372size as the input.</p>
373
374<p>All effects listed in {@link android.media.effect.EffectFactory} are guaranteed to be supported.
375However, some additional effects available from external libraries are not supported by all devices,
376so you must first check if the desired effect from the external library is supported by calling
377{@link android.media.effect.EffectFactory#isEffectSupported isEffectSupported()}.</p>
378
379
380<h4>Remote control client</h4>
381
382<p>The new {@link android.media.RemoteControlClient} allows media players to enable playback
383controls from remote control clients such as the device lock screen. Media players can also expose
384information about the media currently playing for display on the remote control, such as track
385information and album art.</p>
386
387<p>To enable remote control clients for your media player, instantiate a {@link
388android.media.RemoteControlClient} with its constructor, passing it a {@link
389android.app.PendingIntent} that broadcasts {@link
390android.content.Intent#ACTION_MEDIA_BUTTON}. The intent must also declare the explicit {@link
391android.content.BroadcastReceiver} component in your app that handles the {@link
392android.content.Intent#ACTION_MEDIA_BUTTON} event.</p>
393
394<p>To declare which media control inputs your player can handle, you must call {@link
395android.media.RemoteControlClient#setTransportControlFlags setTransportControlFlags()} on your
396{@link android.media.RemoteControlClient}, passing a set of {@code FLAG_KEY_MEDIA_*} flags, such as
397{@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_PREVIOUS} and {@link
398android.media.RemoteControlClient#FLAG_KEY_MEDIA_NEXT}.</p>
399
400<p>You must then register your {@link android.media.RemoteControlClient} by passing it to {@link
401android.media.AudioManager#registerRemoteControlClient MediaManager.registerRemoteControlClient()}.
402Once registered, the broadcast receiver you declared when you instantiated the {@link
403android.media.RemoteControlClient} will receive {@link android.content.Intent#ACTION_MEDIA_BUTTON}
404events when a button is pressed from a remote control. The intent you receive includes the {@link
405android.view.KeyEvent} for the media key pressed, which you can retrieve from the intent with {@link
406android.content.Intent#getParcelableExtra getParcelableExtra(Intent.EXTRA_KEY_EVENT)}.</p>
407
408<p>To display information on the remote control about the media playing, call {@link
409android.media.RemoteControlClient#editMetadata editMetaData()} and add metadata to the returned
410{@link android.media.RemoteControlClient.MetadataEditor}. You can supply a bitmap for media artwork,
411numerical information such as elapsed time, and text information such as the track title. For
412information on available keys see the {@code METADATA_KEY_*} flags in {@link
413android.media.MediaMetadataRetriever}.</p>
414
415<p>For a sample implementation, see the <a
416href="{@docRoot}resources/samples/RandomMusicPlayer/index.html">Random Music Player</a>, which
417provides compatibility logic such that it enables the remote control client on Android 4.0
418devices while continuing to support devices back to Android 2.1.</p>
419
420
421<h4>Media player</h4>
422
423<ul>
424<li>Streaming online media from {@link android.media.MediaPlayer} now requires the {@link
425android.Manifest.permission#INTERNET} permission. If you use {@link android.media.MediaPlayer} to
426play content from the Internet, be sure to add the {@link android.Manifest.permission#INTERNET}
427permission to your manifest or else your media playback will not work beginning with Android
4284.0.</li>
429
430<li>{@link android.media.MediaPlayer#setSurface(Surface) setSurface()} allows you define a {@link
431android.view.Surface} to behave as the video sink.</li>
432
433<li>{@link android.media.MediaPlayer#setDataSource(Context,Uri,Map) setDataSource()} allows you to
434send additional HTTP headers with your request, which can be useful for HTTP(S) live streaming</li>
435
436<li>HTTP(S) live streaming now respects HTTP cookies across requests</li>
437</ul>
438
439
440<h4>Media types</h4>
441
442<p>Android 4.0 adds support for:</p>
443<ul>
444<li>HTTP/HTTPS live streaming protocol version 3 </li>
445<li>ADTS raw AAC audio encoding</li>
446<li>WEBP images</li>
447<li>Matroska video</li>
448</ul>
449<p>For more info, see <a href="{@docRoot}guide/appendix/media-formats.html">Supported Media
450Formats</a>.</p>
451
452
453
454
455
Scott Main1d6f70c2011-10-06 22:57:25 -0700456<h3 id="Camera">Camera</h3>
457
Scott Maine1e9e932011-10-13 23:36:19 -0700458<p>The {@link android.hardware.Camera} class now includes APIs for detecting faces and controlling
459focus and metering areas.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700460
Scott Main1d6f70c2011-10-06 22:57:25 -0700461
Scott Maine1e9e932011-10-13 23:36:19 -0700462<h4>Face detection</h4>
463
464<p>Camera apps can now enhance their abilities with Android’s face detection APIs, which not
465only detect the face of a subject, but also specific facial features, such as the eyes and mouth.
466</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700467
468<p>To detect faces in your camera application, you must register a {@link
469android.hardware.Camera.FaceDetectionListener} by calling {@link
470android.hardware.Camera#setFaceDetectionListener setFaceDetectionListener()}. You can then start
471your camera surface and start detecting faces by calling {@link
472android.hardware.Camera#startFaceDetection}.</p>
473
Scott Maine1e9e932011-10-13 23:36:19 -0700474<p>When the system detects one or more faces in the camera scene, it calls the {@link
Scott Main1d6f70c2011-10-06 22:57:25 -0700475android.hardware.Camera.FaceDetectionListener#onFaceDetection onFaceDetection()} callback in your
476implementation of {@link android.hardware.Camera.FaceDetectionListener}, including an array of
477{@link android.hardware.Camera.Face} objects.</p>
478
479<p>An instance of the {@link android.hardware.Camera.Face} class provides various information about
Scott Maine1e9e932011-10-13 23:36:19 -0700480the face detected, including:</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700481<ul>
482<li>A {@link android.graphics.Rect} that specifies the bounds of the face, relative to the camera's
483current field of view</li>
Scott Mainb57769a2011-10-17 11:20:49 -0700484<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 -0700485human face</li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700486<li>A unique ID so you can track multiple faces</li>
487<li>Several {@link android.graphics.Point} objects that indicate where the eyes and mouth are
488located</li>
489</ul>
490
Scott Mainb57769a2011-10-17 11:20:49 -0700491<p class="note"><strong>Note:</strong> Face detection may not be supported on some
492devices, so you should check by calling {@link
493android.hardware.Camera.Parameters#getMaxNumDetectedFaces()} and ensure the return
494value is greater than zero. Also, some devices may not support identification of eyes and mouth,
495in which case, those fields in the {@link android.hardware.Camera.Face} object will be null.</p>
496
Scott Maine1e9e932011-10-13 23:36:19 -0700497
498<h4>Focus and metering areas</h4>
Robert Ly6cf7d9a2011-10-12 15:30:35 -0700499
Scott Maine1e9e932011-10-13 23:36:19 -0700500<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 -0700501balance
Scott Maine1e9e932011-10-13 23:36:19 -0700502and auto-exposure. Both features use the new {@link android.hardware.Camera.Area} class to specify
503the region of the camera’s current view that should be focused or metered. An instance of the {@link
504android.hardware.Camera.Area} class defines the bounds of the area with a {@link
505android.graphics.Rect} and the area's weight&mdash;representing the level of importance of that
506area, relative to other areas in consideration&mdash;with an integer.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700507
508<p>Before setting either a focus area or metering area, you should first call {@link
509android.hardware.Camera.Parameters#getMaxNumFocusAreas} or {@link
510android.hardware.Camera.Parameters#getMaxNumMeteringAreas}, respectively. If these return zero, then
Scott Maine1e9e932011-10-13 23:36:19 -0700511the device does not support the corresponding feature.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700512
513<p>To specify the focus or metering areas to use, simply call {@link
514android.hardware.Camera.Parameters#setFocusAreas setFocusAreas()} or {@link
515android.hardware.Camera.Parameters#setFocusAreas setMeteringAreas()}. Each take a {@link
516java.util.List} of {@link android.hardware.Camera.Area} objects that indicate the areas to consider
517for focus or metering. For example, you might implement a feature that allows the user to set the
518focus area by touching an area of the preview, which you then translate to an {@link
Scott Maine1e9e932011-10-13 23:36:19 -0700519android.hardware.Camera.Area} object and request that the camera focus on that area of the scene.
520The focus or exposure in that area will continually update as the scene in the area changes.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700521
522
Scott Mainb57769a2011-10-17 11:20:49 -0700523<h4>Continuous auto focus for photos</h4>
524
525<p>You can now enable continuous auto focusing (CAF) when taking photos. To enable CAF in your
526camera app, pass {@link android.hardware.Camera.Parameters#FOCUS_MODE_CONTINUOUS_PICTURE}
527to {@link android.hardware.Camera.Parameters#setFocusMode setFocusMode()}. When ready to capture
528a photo, call {@link android.hardware.Camera#autoFocus autoFocus()}. Your {@link
529android.hardware.Camera.AutoFocusCallback} immediately receives a callback to indicate whether
Scott Main423aca12011-10-17 16:31:11 -0700530focus was achieved. To resume CAF after receiving the callback, you must call {@link
Scott Mainb57769a2011-10-17 11:20:49 -0700531android.hardware.Camera#cancelAutoFocus()}.</p>
532
533<p class="note"><strong>Note:</strong> Continuous auto focus is also supported when capturing
534video, using {@link android.hardware.Camera.Parameters#FOCUS_MODE_CONTINUOUS_VIDEO}, which was
535added in API level 9.</p>
536
537
Scott Maine1e9e932011-10-13 23:36:19 -0700538<h4>Other camera features</h4>
539
Scott Mainb57769a2011-10-17 11:20:49 -0700540<ul>
Scott Maine1e9e932011-10-13 23:36:19 -0700541<li>While recording video, you can now call {@link android.hardware.Camera#takePicture
542takePicture()} to save a photo without interrupting the video session. Before doing so, you should
543call {@link android.hardware.Camera.Parameters#isVideoSnapshotSupported} to be sure the hardware
544supports it.</li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700545
Scott Mainb57769a2011-10-17 11:20:49 -0700546<li>You can now lock auto exposure and white balance with {@link
Scott Main1d6f70c2011-10-06 22:57:25 -0700547android.hardware.Camera.Parameters#setAutoExposureLock setAutoExposureLock()} and {@link
Scott Mainb57769a2011-10-17 11:20:49 -0700548android.hardware.Camera.Parameters#setAutoWhiteBalanceLock setAutoWhiteBalanceLock()} to prevent
Scott Main1d6f70c2011-10-06 22:57:25 -0700549these properties from changing.</li>
Scott Mainb57769a2011-10-17 11:20:49 -0700550
551<li>You can now call {@link android.hardware.Camera#setDisplayOrientation
552setDisplayOrientation()} while the camera preview is running. Previously, you could call this
553only before beginning the preview, but you can now change the orientation at any time.</li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700554</ul>
555
Scott Maine1e9e932011-10-13 23:36:19 -0700556
557<h4>Camera broadcast intents</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -0700558
559<ul>
Scott Maine1e9e932011-10-13 23:36:19 -0700560<li>{@link android.hardware.Camera#ACTION_NEW_PICTURE Camera.ACTION_NEW_PICTURE}:
561This indicates that the user has captured a new photo. The built-in Camera app invokes this
Scott Main1d6f70c2011-10-06 22:57:25 -0700562broadcast after a photo is captured and third-party camera apps should also broadcast this intent
563after capturing a photo.</li>
Scott Maine1e9e932011-10-13 23:36:19 -0700564<li>{@link android.hardware.Camera#ACTION_NEW_VIDEO Camera.ACTION_NEW_VIDEO}:
565This indicates that the user has captured a new video. The built-in Camera app invokes this
Scott Main1d6f70c2011-10-06 22:57:25 -0700566broadcast after a video is recorded and third-party camera apps should also broadcast this intent
567after capturing a video.</li>
568</ul>
569
Scott Main1d6f70c2011-10-06 22:57:25 -0700570
Robert Ly6cf7d9a2011-10-12 15:30:35 -0700571
572
573
Scott Main1d6f70c2011-10-06 22:57:25 -0700574<h3 id="AndroidBeam">Android Beam (NDEF Push with NFC)</h3>
575
Scott Maine1e9e932011-10-13 23:36:19 -0700576<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 -0700577another (a process also known as “NDEF Push"). The data transfer is initiated when two
Scott Main1d6f70c2011-10-06 22:57:25 -0700578Android-powered devices that support Android Beam are in close proximity (about 4 cm), usually with
579their backs touching. The data inside the NDEF message can contain any data that you wish to share
580between devices. For example, the People app shares contacts, YouTube shares videos, and Browser
581shares URLs using Android Beam.</p>
582
583<p>To transmit data between devices using Android Beam, you need to create an {@link
584android.nfc.NdefMessage} that contains the information you want to share while your activity is in
Scott Maine1e9e932011-10-13 23:36:19 -0700585the foreground. You must then pass the {@link android.nfc.NdefMessage} to the system in one of two
586ways:</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700587
588<ul>
Scott Maine1e9e932011-10-13 23:36:19 -0700589<li>Define a single {@link android.nfc.NdefMessage} to push while in the activity:
Scott Main1d6f70c2011-10-06 22:57:25 -0700590<p>Call {@link android.nfc.NfcAdapter#setNdefPushMessage setNdefPushMessage()} at any time to set
Scott Maine1e9e932011-10-13 23:36:19 -0700591the message you want to send. For instance, you might call this method and pass it your {@link
Scott Main1d6f70c2011-10-06 22:57:25 -0700592android.nfc.NdefMessage} during your activity’s {@link android.app.Activity#onCreate onCreate()}
Scott Maine1e9e932011-10-13 23:36:19 -0700593method. Then, whenever Android Beam is activated with another device while the activity is in the
594foreground, the system sends the {@link android.nfc.NdefMessage} to the other device.</p></li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700595
Scott Maine1e9e932011-10-13 23:36:19 -0700596<li>Define the {@link android.nfc.NdefMessage} to push at the time that Android Beam is initiated:
597<p>Implement {@link android.nfc.NfcAdapter.CreateNdefMessageCallback}, in which your
598implementation of the {@link
599android.nfc.NfcAdapter.CreateNdefMessageCallback#createNdefMessage createNdefMessage()}
Scott Main1d6f70c2011-10-06 22:57:25 -0700600method returns the {@link android.nfc.NdefMessage} you want to send. Then pass the {@link
Scott Maine1e9e932011-10-13 23:36:19 -0700601android.nfc.NfcAdapter.CreateNdefMessageCallback} implementation to {@link
602android.nfc.NfcAdapter#setNdefPushMessageCallback setNdefPushMessageCallback()}.</p>
603<p>In this case, when Android Beam is activated with another device while your activity is in the
604foreground, the system calls {@link
605android.nfc.NfcAdapter.CreateNdefMessageCallback#createNdefMessage createNdefMessage()} to retrieve
606the {@link android.nfc.NdefMessage} you want to send. This allows you to define the {@link
607android.nfc.NdefMessage} to deliver only once Android Beam is initiated, in case the contents
608of the message might vary throughout the life of the activity.</p></li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700609</ul>
610
611<p>In case you want to run some specific code once the system has successfully delivered your NDEF
612message to the other device, you can implement {@link
613android.nfc.NfcAdapter.OnNdefPushCompleteCallback} and set it with {@link
614android.nfc.NfcAdapter#setOnNdefPushCompleteCallback setNdefPushCompleteCallback()}. The system will
615then call {@link android.nfc.NfcAdapter.OnNdefPushCompleteCallback#onNdefPushComplete
616onNdefPushComplete()} when the message is delivered.</p>
617
618<p>On the receiving device, the system dispatches NDEF Push messages in a similar way to regular NFC
619tags. The system invokes an intent with the {@link android.nfc.NfcAdapter#ACTION_NDEF_DISCOVERED}
620action to start an activity, with either a URL or a MIME type set according to the first {@link
621android.nfc.NdefRecord} in the {@link android.nfc.NdefMessage}. For the activity you want to
Scott Maine1e9e932011-10-13 23:36:19 -0700622respond, you can declare intent filters for the URLs or MIME types your app cares about. For more
Scott Main1d6f70c2011-10-06 22:57:25 -0700623information about Tag Dispatch see the <a
Scott Mainb57769a2011-10-17 11:20:49 -0700624href="{@docRoot}guide/topics/nfc/index.html#dispatch">NFC</a> developer guide.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700625
626<p>If you want your {@link android.nfc.NdefMessage} to carry a URI, you can now use the convenience
627method {@link android.nfc.NdefRecord#createUri createUri} to construct a new {@link
628android.nfc.NdefRecord} based on either a string or a {@link android.net.Uri} object. If the URI is
629a special format that you want your application to also receive during an Android Beam event, you
630should create an intent filter for your activity using the same URI scheme in order to receive the
631incoming NDEF message.</p>
632
Scott Mainb57769a2011-10-17 11:20:49 -0700633<p>You should also pass an “Android application record" with your {@link android.nfc.NdefMessage} in
Scott Maine1e9e932011-10-13 23:36:19 -0700634order to guarantee that your application handles the incoming NDEF message, even if other
635applications filter for the same intent action. You can create an Android application record by
636calling {@link android.nfc.NdefRecord#createApplicationRecord createApplicationRecord()}, passing it
637your application’s package name. When the other device receives the NDEF message with the
638application record and multiple applications contain activities that handle the specified intent,
639the system always delivers the message to the activity in your application (based on the matching
640application record). If the target device does not currently have your application installed, the
641system uses the Android application record to launch Android Market and take the user to the
642application in order to install it.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700643
644<p>If your application doesn’t use NFC APIs to perform NDEF Push messaging, then Android provides a
645default behavior: When your application is in the foreground on one device and Android Beam is
646invoked with another Android-powered device, then the other device receives an NDEF message with an
647Android application record that identifies your application. If the receiving device has the
648application installed, the system launches it; if it’s not installed, Android Market opens and takes
Scott Maine1e9e932011-10-13 23:36:19 -0700649the user to your application in order to install it.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700650
Scott Main423aca12011-10-17 16:31:11 -0700651<p>You can read more about Android Beam and other NFC features in the <a
652href="{@docRoot}guide/topics/nfc/nfc.html">NFC Basics</a> developer guide. For some example code
653using Android Beam, see the <a
Scott Maine1e9e932011-10-13 23:36:19 -0700654href="{@docRoot}resources/samples/AndroidBeamDemo/src/com/example/android/beam/Beam.html">Android
Scott Main423aca12011-10-17 16:31:11 -0700655Beam Demo</a>.</p>
656
Scott Main1d6f70c2011-10-06 22:57:25 -0700657
658
659
660
Scott Maine09743272011-10-14 11:25:46 -0700661<h3 id="WiFiDirect">Wi-Fi Direct</h3>
Scott Main1d6f70c2011-10-06 22:57:25 -0700662
Scott Maine1e9e932011-10-13 23:36:19 -0700663<p>Android now supports Wi-Fi Direct for peer-to-peer (P2P) connections between Android-powered
Scott Main1d6f70c2011-10-06 22:57:25 -0700664devices and other device types without a hotspot or Internet connection. The Android framework
665provides 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 -0700666device supports Wi-Fi Direct, then communicate over a speedy connection across distances much longer
667than a Bluetooth connection.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700668
669<p>A new package, {@link android.net.wifi.p2p}, contains all the APIs for performing peer-to-peer
670connections with Wi-Fi. The primary class you need to work with is {@link
Scott Maine1e9e932011-10-13 23:36:19 -0700671android.net.wifi.p2p.WifiP2pManager}, which you can acquire by calling {@link
Scott Main1d6f70c2011-10-06 22:57:25 -0700672android.app.Activity#getSystemService getSystemService(WIFI_P2P_SERVICE)}. The {@link
Scott Maine1e9e932011-10-13 23:36:19 -0700673android.net.wifi.p2p.WifiP2pManager} includes APIs that allow you to:</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700674<ul>
675<li>Initialize your application for P2P connections by calling {@link
676android.net.wifi.p2p.WifiP2pManager#initialize initialize()}</li>
Scott Maine1e9e932011-10-13 23:36:19 -0700677
Scott Main1d6f70c2011-10-06 22:57:25 -0700678<li>Discover nearby devices by calling {@link android.net.wifi.p2p.WifiP2pManager#discoverPeers
679discoverPeers()}</li>
Scott Maine1e9e932011-10-13 23:36:19 -0700680
Scott Main1d6f70c2011-10-06 22:57:25 -0700681<li>Start a P2P connection by calling {@link android.net.wifi.p2p.WifiP2pManager#connect
682connect()}</li>
683<li>And more</li>
684</ul>
685
686<p>Several other interfaces and classes are necessary as well, such as:</p>
687<ul>
688<li>The {@link android.net.wifi.p2p.WifiP2pManager.ActionListener} interface allows you to receive
689callbacks when an operation such as discovering peers or connecting to them succeeds or fails.</li>
Scott Maine1e9e932011-10-13 23:36:19 -0700690
Scott Main1d6f70c2011-10-06 22:57:25 -0700691<li>{@link android.net.wifi.p2p.WifiP2pManager.PeerListListener} interface allows you to receive
692information about discovered peers. The callback provides a {@link
693android.net.wifi.p2p.WifiP2pDeviceList}, from which you can retrieve a {@link
694android.net.wifi.p2p.WifiP2pDevice} object for each device within range and get information such as
695the device name, address, device type, the WPS configurations the device supports, and more.</li>
Scott Maine1e9e932011-10-13 23:36:19 -0700696
Scott Main1d6f70c2011-10-06 22:57:25 -0700697<li>The {@link android.net.wifi.p2p.WifiP2pManager.GroupInfoListener} interface allows you to
Scott Maine1e9e932011-10-13 23:36:19 -0700698receive information about a P2P group. The callback provides a {@link
699android.net.wifi.p2p.WifiP2pGroup} object, which provides group information such as the owner, the
700network name, and passphrase.</li>
701
Scott Main1d6f70c2011-10-06 22:57:25 -0700702<li>{@link android.net.wifi.p2p.WifiP2pManager.ConnectionInfoListener} interface allows you to
Scott Maine1e9e932011-10-13 23:36:19 -0700703receive information about the current connection. The callback provides a {@link
Scott Main1d6f70c2011-10-06 22:57:25 -0700704android.net.wifi.p2p.WifiP2pInfo} object, which has information such as whether a group has been
705formed and who is the group owner.</li>
706</ul>
707
708<p>In order to use the Wi-Fi P2P APIs, your app must request the following user permissions:</p>
709<ul>
710<li>{@link android.Manifest.permission#ACCESS_WIFI_STATE}</li>
711<li>{@link android.Manifest.permission#CHANGE_WIFI_STATE}</li>
Scott Maine1e9e932011-10-13 23:36:19 -0700712<li>{@link android.Manifest.permission#INTERNET} (although your app doesn’t technically connect
Scott Mainb57769a2011-10-17 11:20:49 -0700713to the Internet, communicating to Wi-Fi Direct peers with standard java sockets requires Internet
714permission).</li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700715</ul>
716
717<p>The Android system also broadcasts several different actions during certain Wi-Fi P2P events:</p>
718<ul>
719<li>{@link android.net.wifi.p2p.WifiP2pManager#WIFI_P2P_CONNECTION_CHANGED_ACTION}: The P2P
Scott Maine1e9e932011-10-13 23:36:19 -0700720connection state has changed. This carries {@link
721android.net.wifi.p2p.WifiP2pManager#EXTRA_WIFI_P2P_INFO} with a {@link
722android.net.wifi.p2p.WifiP2pInfo} object and {@link
Scott Main1d6f70c2011-10-06 22:57:25 -0700723android.net.wifi.p2p.WifiP2pManager#EXTRA_NETWORK_INFO} with a {@link android.net.NetworkInfo}
724object.</li>
Scott Maine1e9e932011-10-13 23:36:19 -0700725
Scott Main1d6f70c2011-10-06 22:57:25 -0700726<li>{@link android.net.wifi.p2p.WifiP2pManager#WIFI_P2P_STATE_CHANGED_ACTION}: The P2P state has
Scott Maine1e9e932011-10-13 23:36:19 -0700727changed between enabled and disabled. It carries {@link
Scott Main1d6f70c2011-10-06 22:57:25 -0700728android.net.wifi.p2p.WifiP2pManager#EXTRA_WIFI_STATE} with either {@link
729android.net.wifi.p2p.WifiP2pManager#WIFI_P2P_STATE_DISABLED} or {@link
730android.net.wifi.p2p.WifiP2pManager#WIFI_P2P_STATE_ENABLED}</li>
Scott Maine1e9e932011-10-13 23:36:19 -0700731
Scott Main1d6f70c2011-10-06 22:57:25 -0700732<li>{@link android.net.wifi.p2p.WifiP2pManager#WIFI_P2P_PEERS_CHANGED_ACTION}: The list of peer
Scott Maine1e9e932011-10-13 23:36:19 -0700733devices has changed.</li>
734
Scott Main1d6f70c2011-10-06 22:57:25 -0700735<li>{@link android.net.wifi.p2p.WifiP2pManager#WIFI_P2P_THIS_DEVICE_CHANGED_ACTION}: The details for
736this device have changed.</li>
737</ul>
738
739<p>See the {@link android.net.wifi.p2p.WifiP2pManager} documentation for more information. Also
Scott Mainb57769a2011-10-17 11:20:49 -0700740look at the <a href="{@docRoot}resources/samples/WiFiDirectDemo/index.html">Wi-Fi Direct Demo</a>
Scott Maine1e9e932011-10-13 23:36:19 -0700741sample application.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700742
743
744
745
746
Scott Main423aca12011-10-17 16:31:11 -0700747<h3 id="Bluetooth">Bluetooth Health Devices</h3>
Scott Main1d6f70c2011-10-06 22:57:25 -0700748
Scott Main423aca12011-10-17 16:31:11 -0700749<p>Android now supports Bluetooth Health Profile devices, so you can create applications that use
750Bluetooth to communicate with health devices that support Bluetooth, such as heart-rate monitors,
751blood meters, thermometers, and scales.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700752
Scott Main423aca12011-10-17 16:31:11 -0700753<p>Similar to regular headset and A2DP profile devices, you must call {@link
754android.bluetooth.BluetoothAdapter#getProfileProxy getProfileProxy()} with a {@link
755android.bluetooth.BluetoothProfile.ServiceListener} and the {@link
756android.bluetooth.BluetoothProfile#HEALTH} profile type to establish a connection with the profile
757proxy object.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700758
Scott Main423aca12011-10-17 16:31:11 -0700759<p>Once you’ve acquired the Health Profile proxy (the {@link android.bluetooth.BluetoothHealth}
760object), connecting to and communicating with paired health devices involves the following new
761Bluetooth classes:</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700762<ul>
Scott Main423aca12011-10-17 16:31:11 -0700763<li>{@link android.bluetooth.BluetoothHealthCallback}: You must extend this class and implement the
764callback methods to receive updates about changes in the application’s registration state and
765Bluetooth channel state.</li>
766<li>{@link android.bluetooth.BluetoothHealthAppConfiguration}: During callbacks to your {@link
767android.bluetooth.BluetoothHealthCallback}, you’ll receive an instance of this object, which
768provides configuration information about the available Bluetooth health device, which you must use
769to perform various operations such as initiate and terminate connections with the {@link
770android.bluetooth.BluetoothHealth} APIs.</li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700771</ul>
772
Scott Main423aca12011-10-17 16:31:11 -0700773<p>For more information about using the Bluetooth Health Profile, see the documentation for {@link
774android.bluetooth.BluetoothHealth}.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700775
776
777
778
779
780<h3 id="A11y">Accessibility</h3>
781
Scott Maine1e9e932011-10-13 23:36:19 -0700782<p>Android 4.0 improves accessibility for sight-impaired users with new explore-by-touch mode
783and extended APIs that allow you to provide more information about view content or
784develop advanced accessibility services.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700785
786
Scott Maine1e9e932011-10-13 23:36:19 -0700787<h4>Explore-by-touch mode</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -0700788
Scott Maine1e9e932011-10-13 23:36:19 -0700789<p>Users with vision loss can now explore the screen by touching and dragging a finger across the
790screen to hear voice descriptions of the content. Because the explore-by-touch mode works like a
791virtual cursor, it allows screen readers to identify the descriptive text the same way that screen
792readers can when the user navigates with a d-pad or trackball&mdash;by reading information provided
793by {@link android.R.attr#contentDescription android:contentDescription} and {@link
794android.view.View#setContentDescription setContentDescription()} upon a simulated "hover" event. So,
795consider this is a reminder that you should provide descriptive text for the views in your
796application, especially for {@link android.widget.ImageButton}, {@link android.widget.EditText},
797{@link android.widget.ImageView} and other widgets that might not naturally contain descriptive
798text.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700799
Scott Main1d6f70c2011-10-06 22:57:25 -0700800
Scott Maine1e9e932011-10-13 23:36:19 -0700801<h4>Accessibility for views</h4>
802
803<p>To enhance the information available to accessibility services such as screen readers, you can
804implement new callback methods for accessibility events in your custom {@link
805android.view.View} components.</p>
806
807<p>It's important to first note that the behavior of the {@link
808android.view.View#sendAccessibilityEvent sendAccessibilityEvent()} method has changed in Android
8094.0. As with previous version of Android, when the user enables accessibility services on the device
810and an input event such as a click or hover occurs, the respective view is notified with a call to
811{@link android.view.View#sendAccessibilityEvent sendAccessibilityEvent()}. Previously, the
812implementation of {@link android.view.View#sendAccessibilityEvent sendAccessibilityEvent()} would
813initialize an {@link android.view.accessibility.AccessibilityEvent} and send it to {@link
814android.view.accessibility.AccessibilityManager}. The new behavior involves some additional callback
815methods that allow the view and its parents to add more contextual information to the event:
Scott Main1d6f70c2011-10-06 22:57:25 -0700816<ol>
Scott Maine1e9e932011-10-13 23:36:19 -0700817 <li>When invoked, the {@link
818android.view.View#sendAccessibilityEvent sendAccessibilityEvent()} and {@link
819android.view.View#sendAccessibilityEventUnchecked sendAccessibilityEventUnchecked()} methods defer
820to {@link android.view.View#onInitializeAccessibilityEvent onInitializeAccessibilityEvent()}.
821 <p>Custom implementations of {@link android.view.View} might want to implement {@link
822android.view.View#onInitializeAccessibilityEvent onInitializeAccessibilityEvent()} to
823attach additional accessibility information to the {@link
824android.view.accessibility.AccessibilityEvent}, but should also call the super implementation to
825provide default information such as the standard content description, item index, and more.
826However, you should not add additional text content in this callback&mdash;that happens
827next.</p></li>
828 <li>Once initialized, if the event is one of several types that should be populated with text
829information, the view then receives a call to {@link
830android.view.View#dispatchPopulateAccessibilityEvent dispatchPopulateAccessibilityEvent()}, which
831defers to the {@link android.view.View#onPopulateAccessibilityEvent onPopulateAccessibilityEvent()}
832callback.
833 <p>Custom implementations of {@link android.view.View} should usually implement {@link
834android.view.View#onPopulateAccessibilityEvent onPopulateAccessibilityEvent()} to add additional
835text content to the {@link android.view.accessibility.AccessibilityEvent} if the {@link
836android.R.attr#contentDescription android:contentDescription} text is missing or
837insufficient. To add more text description to the
838{@link android.view.accessibility.AccessibilityEvent}, call {@link
839android.view.accessibility.AccessibilityEvent#getText()}.{@link java.util.List#add add()}.</p>
840</li>
841 <li>At this point, the {@link android.view.View} passes the event up the view hierarchy by calling
842{@link android.view.ViewGroup#requestSendAccessibilityEvent requestSendAccessibilityEvent()} on the
843parent view. Each parent view then has the chance to augment the accessibility information by
844adding an {@link android.view.accessibility.AccessibilityRecord}, until it
845ultimately reaches the root view, which sends the event to the {@link
846android.view.accessibility.AccessibilityManager} with {@link
847android.view.accessibility.AccessibilityManager#sendAccessibilityEvent
848sendAccessibilityEvent()}.</li>
Scott Main1d6f70c2011-10-06 22:57:25 -0700849</ol>
850
Scott Maine1e9e932011-10-13 23:36:19 -0700851<p>In addition to the new methods above, which are useful when extending the {@link
852android.view.View} class, you can also intercept these event callbacks on any {@link
853android.view.View} by extending {@link
854android.view.View.AccessibilityDelegate AccessibilityDelegate} and setting it on the view with
855{@link android.view.View#setAccessibilityDelegate setAccessibilityDelegate()}.
856When you do, each accessibility method in the view defers the call to the corresponding method in
857the delegate. For example, when the view receives a call to {@link
858android.view.View#onPopulateAccessibilityEvent onPopulateAccessibilityEvent()}, it passes it to the
859same method in the {@link android.view.View.AccessibilityDelegate}. Any methods not handled by
860the delegate are given right back to the view for default behavior. This allows you to override only
861the methods necessary for any given view without extending the {@link android.view.View} class.</p>
862
863
864<p>If you want to maintain compatibility with Android versions prior to 4.0, while also supporting
865the new the accessibility APIs, you can do so with the latest version of the <em>v4 support
866library</em> (in <a href="{@docRoot}sdk/compatibility-library.html">Compatibility Package, r4</a>)
867using a set of utility classes that provide the new accessibility APIs in a backward-compatible
868design.</p>
869
870
871
Scott Main423aca12011-10-17 16:31:11 -0700872
Scott Maine1e9e932011-10-13 23:36:19 -0700873<h4>Accessibility services</h4>
874
875<p>If you're developing an accessibility service, the information about various accessibility events
876has been significantly expanded to enable more advanced accessibility feedback for users. In
877particular, events are generated based on view composition, providing better context information and
878allowing accessibility services to traverse view hierarchies to get additional view information and
879deal with special cases.</p>
880
881<p>If you're developing an accessibility service (such as a screen reader), you can access
882additional content information and traverse view hierarchies with the following procedure:</p>
883<ol>
884<li>Upon receiving an {@link android.view.accessibility.AccessibilityEvent} from an application,
885call the {@link android.view.accessibility.AccessibilityEvent#getRecord(int)
886AccessibilityEvent.getRecord()} to retrieve a specific {@link
887android.view.accessibility.AccessibilityRecord} (there may be several records attached to the
888event).</li>
889
890<li>From either {@link android.view.accessibility.AccessibilityEvent} or an individual {@link
891android.view.accessibility.AccessibilityRecord}, you can call {@link
892android.view.accessibility.AccessibilityRecord#getSource() getSource()} to retrieve a {@link
893android.view.accessibility.AccessibilityNodeInfo} object.
894 <p>An {@link android.view.accessibility.AccessibilityNodeInfo} represents a single node
895of the window content in a format that allows you to query accessibility information about that
896node. The {@link android.view.accessibility.AccessibilityNodeInfo} object returned from {@link
897android.view.accessibility.AccessibilityEvent} describes the event source, whereas the source from
898an {@link android.view.accessibility.AccessibilityRecord} describes the predecessor of the event
899source.</p></li>
900
901<li>With the {@link android.view.accessibility.AccessibilityNodeInfo}, you can query information
902about it, call {@link
903android.view.accessibility.AccessibilityNodeInfo#getParent getParent()} or {@link
904android.view.accessibility.AccessibilityNodeInfo#getChild getChild()} to traverse the view
905hierarchy, and even add child views to the node.</li>
906</ol>
907
908<p>In order for your application to publish itself to the system as an accessibility service, it
909must declare an XML configuration file that corresponds to {@link
910android.accessibilityservice.AccessibilityServiceInfo}. For more information about creating an
911accessibility service, see {@link
Scott Main1d6f70c2011-10-06 22:57:25 -0700912android.accessibilityservice.AccessibilityService} and {@link
913android.accessibilityservice.AccessibilityService#SERVICE_META_DATA
Scott Maine1e9e932011-10-13 23:36:19 -0700914SERVICE_META_DATA} for information about the XML configuration.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700915
916
Scott Maine1e9e932011-10-13 23:36:19 -0700917<h4>Other accessibility APIs</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -0700918
Scott Maine1e9e932011-10-13 23:36:19 -0700919<p>If you're interested in the device's accessibility state, the {@link
920android.view.accessibility.AccessibilityManager} has some new APIs such as:</p>
921<ul>
922 <li>{@link android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener}
923is an interface that allows you to receive a callback whenever accessibility is enabled or
924disabled.</li>
925 <li>{@link android.view.accessibility.AccessibilityManager#getEnabledAccessibilityServiceList
926 getEnabledAccessibilityServiceList()} provides information about which accessibility services
927 are currently enabled.</li>
928 <li>{@link android.view.accessibility.AccessibilityManager#isTouchExplorationEnabled()} tells
929 you whether the explore-by-touch mode is enabled.</li>
930</ul>
Scott Main1d6f70c2011-10-06 22:57:25 -0700931
932
933
Scott Main1d6f70c2011-10-06 22:57:25 -0700934
935
936
Scott Main423aca12011-10-17 16:31:11 -0700937<h3 id="SpellChecker">Spell Checker Services</h3>
Scott Main1d6f70c2011-10-06 22:57:25 -0700938
Scott Main423aca12011-10-17 16:31:11 -0700939<p>A new spell checker framework allows apps to create spell checkers in a manner similar to the
940input method framework (for IMEs). To create a new spell checker, you must implement a service that
941extends
942{@link android.service.textservice.SpellCheckerService} and extend the {@link
943android.service.textservice.SpellCheckerService.Session} class to provide spelling suggestions based
944on text provided by the interface's callback methods. In the {@link
945android.service.textservice.SpellCheckerService.Session} callback methods, you must return the
946spelling suggestions as {@link android.view.textservice.SuggestionsInfo} objects. </p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700947
Scott Main423aca12011-10-17 16:31:11 -0700948<p>Applications with a spell checker service must declare the {@link
949android.Manifest.permission#BIND_TEXT_SERVICE} permission as required by the service.
950The service must also declare an intent filter with {@code &lt;action
951android:name="android.service.textservice.SpellCheckerService" />} as the intent’s action and should
952include a {@code &lt;meta-data&gt;} element that declares configuration information for the spell
953checker. </p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700954
Scott Main423aca12011-10-17 16:31:11 -0700955<p>See the <a href="{@docRoot}resources/samples/SampleSpellCheckerService/index.html">Spell
956Checker</a> sample app for example code.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700957
958
959
960
961<h3 id="TTS">Text-to-speech Engines</h3>
962
Scott Maine1e9e932011-10-13 23:36:19 -0700963<p>Android’s text-to-speech (TTS) APIs have been significantly extended to allow applications to
964more easily implement custom TTS engines, while applications that want to use a TTS engine have a
965couple new APIs for selecting an engine.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700966
967
968<h4>Using text-to-speech engines</h4>
969
970<p>In previous versions of Android, you could use the {@link android.speech.tts.TextToSpeech} class
Scott Maine1e9e932011-10-13 23:36:19 -0700971to perform text-to-speech (TTS) operations using the TTS engine provided by the system or set a
972custom engine using {@link android.speech.tts.TextToSpeech#setEngineByPackageName
973setEngineByPackageName()}. In Android 4.0, the {@link
974android.speech.tts.TextToSpeech#setEngineByPackageName setEngineByPackageName()} method has been
975deprecated and you can now specify the engine to use with a new {@link
976android.speech.tts.TextToSpeech} constructor that accepts the package name of a TTS engine.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700977
978<p>You can also query the available TTS engines with {@link
979android.speech.tts.TextToSpeech#getEngines()}. This method returns a list of {@link
980android.speech.tts.TextToSpeech.EngineInfo} objects, which include meta data such as the engine’s
981icon, label, and package name.</p>
982
983
984<h4>Building text-to-speech engines</h4>
985
Scott Maine1e9e932011-10-13 23:36:19 -0700986<p>Previously, custom engines required that the engine be built using an undocumented native header
987file. In Android 4.0, there is a complete set of framework APIs for building TTS engines. </p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700988
989<p>The basic setup requires an implementation of {@link android.speech.tts.TextToSpeechService} that
990responds to the {@link android.speech.tts.TextToSpeech.Engine#INTENT_ACTION_TTS_SERVICE} intent. The
991primary work for a TTS engine happens during the {@link
Scott Maine1e9e932011-10-13 23:36:19 -0700992android.speech.tts.TextToSpeechService#onSynthesizeText onSynthesizeText()} callback in a service
993that extends {@link android.speech.tts.TextToSpeechService}. The system delivers this method two
994objects:</p>
Scott Main1d6f70c2011-10-06 22:57:25 -0700995<ul>
996<li>{@link android.speech.tts.SynthesisRequest}: This contains various data including the text to
997synthesize, the locale, the speech rate, and voice pitch.</li>
998<li>{@link android.speech.tts.SynthesisCallback}: This is the interface by which your TTS engine
Scott Maine1e9e932011-10-13 23:36:19 -0700999delivers the resulting speech data as streaming audio. First the engine must call {@link
Scott Main1d6f70c2011-10-06 22:57:25 -07001000android.speech.tts.SynthesisCallback#start start()} to indicate that the engine is ready to deliver
Scott Maine1e9e932011-10-13 23:36:19 -07001001the audio, then call {@link android.speech.tts.SynthesisCallback#audioAvailable audioAvailable()},
1002passing it the audio data in a byte buffer. Once your engine has passed all audio through the
1003buffer, call {@link android.speech.tts.SynthesisCallback#done()}.</li>
Scott Main1d6f70c2011-10-06 22:57:25 -07001004</ul>
1005
Scott Maine1e9e932011-10-13 23:36:19 -07001006<p>Now that the framework supports a true API for creating TTS engines, support for the native code
1007implementation has been removed. Look for a blog post about a compatibility layer
1008that you can use to convert your old TTS engines to the new framework.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001009
1010<p>For an example TTS engine using the new APIs, see the <a
Scott Mainb57769a2011-10-17 11:20:49 -07001011href="{@docRoot}resources/samples/TtsEngine/index.html">Text To Speech Engine</a> sample app.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001012
1013
1014
1015
1016
1017
Scott Main423aca12011-10-17 16:31:11 -07001018<h3 id="NetworkUsage">Network Usage</h3>
Scott Maine1e9e932011-10-13 23:36:19 -07001019
Scott Main423aca12011-10-17 16:31:11 -07001020<p>Android 4.0 gives users precise visibility of how much network data their applications are using.
1021The Settings app provides controls that allow users to manage set limits for network data usage and
1022even disable the use of background data for individual apps. In order to avoid users disabling your
1023app’s access to data from the background, you should develop strategies to use use the data
1024connection efficiently and adjust your usage depending on the type of connection available.</p>
Scott Maine1e9e932011-10-13 23:36:19 -07001025
Scott Main423aca12011-10-17 16:31:11 -07001026<p>If your application performs a lot of network transactions, you should provide user settings that
1027allow users to control your app’s data habits, such as how often your app syncs data, whether to
1028perform uploads/downloads only when on Wi-Fi, whether to use data while roaming, etc. With these
1029controls available to them, users are much less likely to disable your app’s access to data when
1030they approach their limits, because they can instead precisely control how much data your app uses.
1031If you provide a preference activity with these settings, you should include in its manifest
1032declaration an intent filter for the {@link android.content.Intent#ACTION_MANAGE_NETWORK_USAGE}
1033action. For example:</p>
1034
1035<pre>
1036&lt;activity android:name="DataPreferences" android:label="@string/title_preferences">
1037 &lt;intent-filter>
1038 &lt;action android:name="android.intent.action.MANAGE_NETWORK_USAGE" />
1039 &lt;category android:name="android.intent.category.DEFAULT" />
1040 &lt;/intent-filter>
1041&lt;/activity>
1042</pre>
1043
1044<p>This intent filter indicates to the system that this is the activity that controls your
1045application’s data usage. Thus, when the user inspects how much data your app is using from the
1046Settings app, a “View application settings" button is available that launches your
1047preference activity so the user can refine how much data your app uses.</p>
1048
1049<p>Also beware that {@link android.net.ConnectivityManager#getBackgroundDataSetting()} is now
1050deprecated and always returns true&mdash;use {@link
1051android.net.ConnectivityManager#getActiveNetworkInfo()} instead. Before you attempt any network
1052transactions, you should always call {@link android.net.ConnectivityManager#getActiveNetworkInfo()}
1053to get the {@link android.net.NetworkInfo} that represents the current network and query {@link
1054android.net.NetworkInfo#isConnected()} to check whether the device has a
1055connection. You can then check other connection properties, such as whether the device is
1056roaming or connected to Wi-Fi.</p>
Scott Maine1e9e932011-10-13 23:36:19 -07001057
1058
1059
1060
Scott Main1d6f70c2011-10-06 22:57:25 -07001061
1062
1063
1064
Scott Main423aca12011-10-17 16:31:11 -07001065<h3 id="RenderScript">RenderScript</h3>
1066
1067<p>Three major features have been added to RenderScript:</p>
1068
1069<ul>
1070 <li>Off-screen rendering to a framebuffer object</li>
1071 <li>Rendering inside a view</li>
1072 <li>RS for each from the framework APIs</li>
1073</ul>
1074
1075<p>The {@link android.renderscript.Allocation} class now supports a {@link
1076android.renderscript.Allocation#USAGE_GRAPHICS_RENDER_TARGET} memory space, which allows you to
1077render things directly into the {@link android.renderscript.Allocation} and use it as a framebuffer
1078object.</p>
1079
1080<p>{@link android.renderscript.RSTextureView} provides a means to display RenderScript graphics
1081inside of a {@link android.view.View}, unlike {@link android.renderscript.RSSurfaceView}, which
1082creates a separate window. This key difference allows you to do things such as move, transform, or
1083animate an {@link android.renderscript.RSTextureView} as well as draw RenderScript graphics inside
1084a view that lies within an activity layout.</p>
1085
1086<p>The {@link android.renderscript.Script#forEach Script.forEach()} method allows you to call
1087RenderScript compute scripts from the VM level and have them automatically delegated to available
1088cores on the device. You do not use this method directly, but any compute RenderScript that you
1089write will have a {@link android.renderscript.Script#forEach forEach()} method that you can call in
1090the reflected RenderScript class. You can call the reflected {@link
1091android.renderscript.Script#forEach forEach()} method by passing in an input {@link
1092android.renderscript.Allocation} to process, an output {@link android.renderscript.Allocation} to
1093write the result to, and a {@link android.renderscript.FieldPacker} data structure in case the
1094RenderScript needs more information. Only one of the {@link android.renderscript.Allocation}s is
1095necessary and the data structure is optional.</p>
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105<h3 id="Enterprise">Enterprise</h3>
1106
1107<p>Android 4.0 expands the capabilities for enterprise application with the following features.</p>
1108
1109<h4>VPN services</h4>
1110
1111<p>The new {@link android.net.VpnService} allows applications to build their own VPN (Virtual
1112Private Network), running as a {@link android.app.Service}. A VPN service creates an interface for a
1113virtual network with its own address and routing rules and performs all reading and writing with a
1114file descriptor.</p>
1115
1116<p>To create a VPN service, use {@link android.net.VpnService.Builder}, which allows you to specify
1117the network address, DNS server, network route, and more. When complete, you can establish the
1118interface by calling {@link android.net.VpnService.Builder#establish()}, which returns a {@link
1119android.os.ParcelFileDescriptor}. </p>
1120
1121<p>Because a VPN service can intercept packets, there are security implications. As such, if you
1122implement {@link android.net.VpnService}, then your service must require the {@link
1123android.Manifest.permission#BIND_VPN_SERVICE} to ensure that only the system can bind to it (only
1124the system is granted this permission&mdash;apps cannot request it). To then use your VPN service,
1125users must manually enable it in the system settings.</p>
1126
1127
1128<h4>Device policies</h4>
1129
1130<p>Applications that manage the device restrictions can now disable the camera using {@link
1131android.app.admin.DevicePolicyManager#setCameraDisabled setCameraDisabled()} and the {@link
1132android.app.admin.DeviceAdminInfo#USES_POLICY_DISABLE_CAMERA} property (applied with a {@code
1133&lt;disable-camera /&gt;} element in the policy configuration file).</p>
1134
1135
1136<h4>Certificate management</h4>
1137
1138<p>The new {@link android.security.KeyChain} class provides APIs that allow you to import and access
1139certificates in the system key store. Certificates streamline the installation of both client
1140certificates (to validate the identity of the user) and certificate authority certificates (to
1141verify server identity). Applications such as web browsers or email clients can access the installed
1142certificates to authenticate users to servers. See the {@link android.security.KeyChain}
1143documentation for more information.</p>
1144
1145
1146
1147
1148
1149
1150
1151<h3 id="Sensors">Device Sensors</h3>
1152
1153<p>Two new sensor types have been added in Android 4.0:</p>
1154
1155<ul>
1156 <li>{@link android.hardware.Sensor#TYPE_AMBIENT_TEMPERATURE}: A temperature sensor that provides
1157the ambient (room) temperature in degrees Celsius.</li>
1158 <li>{@link android.hardware.Sensor#TYPE_RELATIVE_HUMIDITY}: A humidity sensor that provides the
1159relative ambient (room) humidity as a percentage.</li>
1160</ul>
1161
1162<p>If a device has both {@link android.hardware.Sensor#TYPE_AMBIENT_TEMPERATURE} and {@link
1163android.hardware.Sensor#TYPE_RELATIVE_HUMIDITY} sensors, you can use them to calculate the dew point
1164and the absolute humidity.</p>
1165
1166<p>The previous temperature sensor, {@link android.hardware.Sensor#TYPE_TEMPERATURE}, has been
1167deprecated. You should use the {@link android.hardware.Sensor#TYPE_AMBIENT_TEMPERATURE} sensor
1168instead.</p>
1169
1170<p>Additionally, Android’s three synthetic sensors have been greatly improved so they now have lower
1171latency and smoother output. These sensors include the gravity sensor ({@link
1172android.hardware.Sensor#TYPE_GRAVITY}), rotation vector sensor ({@link
1173android.hardware.Sensor#TYPE_ROTATION_VECTOR}), and linear acceleration sensor ({@link
1174android.hardware.Sensor#TYPE_LINEAR_ACCELERATION}). The improved sensors rely on the gyroscope
1175sensor to improve their output, so the sensors appear only on devices that have a gyroscope.</p>
1176
1177
1178
1179
Scott Main1d6f70c2011-10-06 22:57:25 -07001180
1181<h3 id="ActionBar">Action Bar</h3>
1182
1183<p>The {@link android.app.ActionBar} has been updated to support several new behaviors. Most
1184importantly, the system gracefully manages the action bar’s size and configuration when running on
Scott Maine1e9e932011-10-13 23:36:19 -07001185smaller screens in order to provide an optimal user experience on all screen sizes. For example,
1186when the screen is narrow (such as when a handset is in portrait orientation), the action bar’s
Scott Mainb57769a2011-10-17 11:20:49 -07001187navigation tabs appear in a “stacked bar," which appears directly below the main action bar. You can
1188also 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 -07001189of the screen when the screen is narrow.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001190
1191
Scott Maine1e9e932011-10-13 23:36:19 -07001192<h4>Split action bar</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -07001193
Scott Maine1e9e932011-10-13 23:36:19 -07001194<p>If your action bar includes several action items, not all of them will fit into the action bar on
1195a 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 -07001196allows 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 -07001197separate bar at the bottom of the screen. To enable split action bar, add {@link
Scott Mainb57769a2011-10-17 11:20:49 -07001198android.R.attr#uiOptions android:uiOptions} with {@code "splitActionBarWhenNarrow"} to either your
Scott Maine1e9e932011-10-13 23:36:19 -07001199<a href="guide/topics/manifest/application-element.html">{@code &lt;application&gt;}</a> tag or
1200individual <a href="guide/topics/manifest/activity-element.html">{@code &lt;activity&gt;}</a> tags
1201in your manifest file. When enabled, the system will add an additional bar at the bottom of the
1202screen for all action items when the screen is narrow (no action items will appear in the primary
1203action bar).</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001204
1205<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 -07001206but don’t need the main action bar on top (you want only the tabs to appear at the top), then enable
1207the split action bar as described above and also call {@link
1208android.app.ActionBar#setDisplayShowHomeEnabled setDisplayShowHomeEnabled(false)} to disable the
1209application icon in the action bar. With nothing left in the main action bar, it
1210disappears&mdash;all that’s left are the navigation tabs at the top and the action items at the
1211bottom of the screen.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001212
1213
Scott Maine1e9e932011-10-13 23:36:19 -07001214<h4>Action bar styles</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -07001215
1216<p>If you want to apply custom styling to the action bar, you can use new style properties {@link
1217android.R.attr#backgroundStacked} and {@link android.R.attr#backgroundSplit} to apply a background
1218drawable or color to the stacked bar and split bar, respectively. You can also set these styles at
1219runtime with {@link android.app.ActionBar#setStackedBackgroundDrawable
1220setStackedBackgroundDrawable()} and {@link android.app.ActionBar#setSplitBackgroundDrawable
1221setSplitBackgroundDrawable()}.</p>
1222
1223
Scott Maine1e9e932011-10-13 23:36:19 -07001224<h4>Action provider</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -07001225
Scott Maine1e9e932011-10-13 23:36:19 -07001226<p>The new {@link android.view.ActionProvider} class allows you to create a specialized handler for
1227action items. An action provider can define an action view, a default action behavior, and a submenu
1228for each action item to which it is associated. When you want to create an action item that has
1229dynamic behaviors (such as a variable action view, default action, or submenu), extending {@link
1230android.view.ActionProvider} is a good solution in order to create a reusable component, rather than
1231handling the various action item transformations in your fragment or activity.</p>
1232
1233<p>For example, the {@link android.widget.ShareActionProvider} is an extension of {@link
Scott Mainb57769a2011-10-17 11:20:49 -07001234android.view.ActionProvider} that facilitates a “share" action from the action bar. Instead of using
Scott Maine1e9e932011-10-13 23:36:19 -07001235traditional action item that invokes the {@link android.content.Intent#ACTION_SEND} intent, you can
1236use this action provider to present an action view with a drop-down list of applications that handle
1237the {@link android.content.Intent#ACTION_SEND} intent. When the user selects an application to use
1238for the action, {@link android.widget.ShareActionProvider} remembers that selection and provides it
1239in the action view for faster access to sharing with that app.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001240
1241<p>To declare an action provider for an action item, include the {@code android:actionProviderClass}
Scott Maine1e9e932011-10-13 23:36:19 -07001242attribute in the <a href="{@docRoot}guide/topics/resources/menu-resource.html#item-element">{@code
1243&lt;item&gt;}</a> element for your activity’s options menu, with the class name of the action
1244provider as the value. For example:</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001245
1246<pre>
1247&lt;item android:id="@+id/menu_share"
1248 android:title="Share"
Scott Main1d6f70c2011-10-06 22:57:25 -07001249 android:showAsAction="ifRoom"
1250 android:actionProviderClass="android.widget.ShareActionProvider" /&gt;
1251</pre>
1252
1253<p>In your activity’s {@link android.app.Activity#onCreateOptionsMenu onCreateOptionsMenu()}
Scott Maine1e9e932011-10-13 23:36:19 -07001254callback method, retrieve an instance of the action provider from the menu item and set the
1255intent:</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001256
1257<pre>
1258public boolean onCreateOptionsMenu(Menu menu) {
1259 getMenuInflater().inflate(R.menu.options, menu);
1260 ShareActionProvider shareActionProvider =
1261 (ShareActionProvider) menu.findItem(R.id.menu_share).getActionProvider();
1262 // Set the share intent of the share action provider.
1263 shareActionProvider.setShareIntent(createShareIntent());
1264 ...
1265 return super.onCreateOptionsMenu(menu);
1266}
1267</pre>
1268
1269<p>For an example using the {@link android.widget.ShareActionProvider}, see the <a
Scott Mainb57769a2011-10-17 11:20:49 -07001270href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/
1271ActionBarActionProviderActivity.html">ActionBarActionProviderActivity</a>
Scott Main1d6f70c2011-10-06 22:57:25 -07001272class in ApiDemos.</p>
1273
1274
Scott Maine1e9e932011-10-13 23:36:19 -07001275<h4>Collapsible action views</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -07001276
Scott Maine1e9e932011-10-13 23:36:19 -07001277<p>Action items that provide an action view can now toggle between their action view state and
Scott Main1d6f70c2011-10-06 22:57:25 -07001278traditional action item state. Previously only the {@link android.widget.SearchView} supported
1279collapsing when used as an action view, but now you can add an action view for any action item and
1280switch between the expanded state (action view is visible) and collapsed state (action item is
1281visible).</p>
1282
1283<p>To declare that an action item that contains an action view be collapsible, include the {@code
Scott Mainb57769a2011-10-17 11:20:49 -07001284“collapseActionView"} flag in the {@code android:showAsAction} attribute for the <a
Scott Maine1e9e932011-10-13 23:36:19 -07001285href="{@docRoot}guide/topics/resources/menu-resource.html#item-element">{@code
1286&lt;item&gt;}</a> element in the menu’s XML file.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001287
1288<p>To receive callbacks when an action view switches between expanded and collapsed, register an
1289instance of {@link android.view.MenuItem.OnActionExpandListener} with the respective {@link
1290android.view.MenuItem} by calling {@link android.view.MenuItem#setOnActionExpandListener
1291setOnActionExpandListener()}. Typically, you should do so during the {@link
1292android.app.Activity#onCreateOptionsMenu onCreateOptionsMenu()} callback.</p>
1293
1294<p>To control a collapsible action view, you can call {@link
1295android.view.MenuItem#collapseActionView()} and {@link android.view.MenuItem#expandActionView()} on
1296the respective {@link android.view.MenuItem}.</p>
1297
1298<p>When creating a custom action view, you can also implement the new {@link
1299android.view.CollapsibleActionView} interface to receive callbacks when the view is expanded and
1300collapsed.</p>
1301
1302
Scott Maine1e9e932011-10-13 23:36:19 -07001303<h4>Other APIs for action bar</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -07001304<ul>
Scott Maine1e9e932011-10-13 23:36:19 -07001305<li>{@link android.app.ActionBar#setHomeButtonEnabled setHomeButtonEnabled()} allows you to specify
Scott Mainb57769a2011-10-17 11:20:49 -07001306whether 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 -07001307a button).</li>
1308
Scott Main1d6f70c2011-10-06 22:57:25 -07001309<li>{@link android.app.ActionBar#setIcon setIcon()} and {@link android.app.ActionBar#setLogo
Scott Maine1e9e932011-10-13 23:36:19 -07001310setLogo()} allow you to define the action bar icon or logo at runtime.</li>
1311
Scott Main1d6f70c2011-10-06 22:57:25 -07001312<li>{@link android.app.Fragment#setMenuVisibility Fragment.setMenuVisibility()} allows you to enable
Scott Maine1e9e932011-10-13 23:36:19 -07001313or disable the visibility of the options menu items declared by the fragment. This is useful if the
Scott Main1d6f70c2011-10-06 22:57:25 -07001314fragment has been added to the activity, but is not visible, so the menu items should be
1315hidden.</li>
Scott Maine1e9e932011-10-13 23:36:19 -07001316
Scott Main1d6f70c2011-10-06 22:57:25 -07001317<li>{@link android.app.FragmentManager#invalidateOptionsMenu
1318FragmentManager.invalidateOptionsMenu()}
1319allows you to invalidate the activity options menu during various states of the fragment lifecycle
1320in which using the equivalent method from {@link android.app.Activity} might not be available.</li>
1321</ul>
1322
1323
1324
1325
1326
1327
1328
1329
1330<h3 id="UI">User Interface and Views</h3>
1331
1332<p>Android 4.0 introduces a variety of new views and other UI components.</p>
1333
Scott Maine1e9e932011-10-13 23:36:19 -07001334
Scott Main1d6f70c2011-10-06 22:57:25 -07001335<h4>GridLayout</h4>
1336
1337<p>{@link android.widget.GridLayout} is a new view group that places child views in a rectangular
Scott Maine1e9e932011-10-13 23:36:19 -07001338grid. Unlike {@link android.widget.TableLayout}, {@link android.widget.GridLayout} relies on a flat
Scott Main1d6f70c2011-10-06 22:57:25 -07001339hierarchy and does not make use of intermediate views such as table rows for providing structure.
1340Instead, children specify which row(s) and column(s) they should occupy (cells can span multiple
1341rows and/or columns), and by default are laid out sequentially across the grid’s rows and columns.
1342The {@link android.widget.GridLayout} orientation determines whether sequential children are by
1343default laid out horizontally or vertically. Space between children may be specified either by using
1344instances of the new {@link android.widget.Space} view or by setting the relevant margin parameters
1345on children.</p>
1346
1347<p>See <a
Scott Mainb57769a2011-10-17 11:20:49 -07001348href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/view/index.html">ApiDemos</a
1349>
Scott Main1d6f70c2011-10-06 22:57:25 -07001350for samples using {@link android.widget.GridLayout}.</p>
1351
1352
1353
1354<h4>TextureView</h4>
1355
1356<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 -07001357as a video or an OpenGL scene. Although similar to {@link android.view.SurfaceView}, {@link
Scott Main1d6f70c2011-10-06 22:57:25 -07001358android.view.TextureView} is unique in that it behaves like a regular view, rather than creating a
1359separate window, so you can treat it like any other {@link android.view.View} object. For example,
Scott Maine1e9e932011-10-13 23:36:19 -07001360you can apply transforms, animate it using {@link android.view.ViewPropertyAnimator}, or
Scott Main1d6f70c2011-10-06 22:57:25 -07001361adjust its opacity with {@link android.view.View#setAlpha setAlpha()}.</p>
1362
1363<p>Beware that {@link android.view.TextureView} works only within a hardware accelerated window.</p>
1364
1365<p>For more information, see the {@link android.view.TextureView} documentation.</p>
1366
1367
Scott Maine1e9e932011-10-13 23:36:19 -07001368<h4>Switch widget</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -07001369
1370<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 -07001371side or the other (or simply tap) to toggle an option between two states.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001372
Scott Maine1e9e932011-10-13 23:36:19 -07001373<p>You can use the {@code android:textOn} and {@code android:textOff} attributes to specify the text
1374to appear on the switch when in the on and off setting. The {@code android:text} attribute also
1375allows you to place a label alongside the switch.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001376
1377<p>For a sample using switches, see the <a
Scott Mainb57769a2011-10-17 11:20:49 -07001378href="{@docRoot}resources/samples/ApiDemos/res/layout/switches.html">switches.xml</a> layout file
Scott Main1d6f70c2011-10-06 22:57:25 -07001379and respective <a
Scott Mainb57769a2011-10-17 11:20:49 -07001380href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/view/Switches.html">Switches
Scott Main1d6f70c2011-10-06 22:57:25 -07001381</a> activity.</p>
1382
1383
Scott Maine1e9e932011-10-13 23:36:19 -07001384<h4>Popup menus</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -07001385
1386<p>Android 3.0 introduced {@link android.widget.PopupMenu} to create short contextual menus that pop
Scott Maine1e9e932011-10-13 23:36:19 -07001387up at an anchor point you specify (usually at the point of the item selected). Android 4.0 extends
1388the {@link android.widget.PopupMenu} with a couple useful features:</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001389<ul>
1390<li>You can now easily inflate the contents of a popup menu from an XML <a
Scott Mainb57769a2011-10-17 11:20:49 -07001391href="{@docRoot}guide/topics/resources/menu-resource.html">menu resource</a> with {@link
Scott Main1d6f70c2011-10-06 22:57:25 -07001392android.widget.PopupMenu#inflate inflate()}, passing it the menu resource ID.</li>
1393<li>You can also now create a {@link android.widget.PopupMenu.OnDismissListener} that receives a
1394callback when the menu is dismissed.</li>
1395</ul>
1396
Scott Maine1e9e932011-10-13 23:36:19 -07001397
Scott Main1d6f70c2011-10-06 22:57:25 -07001398<h4>Preferences</h4>
1399
1400<p>A new {@link android.preference.TwoStatePreference} abstract class serves as the basis for
1401preferences that provide a two-state selection option. The new {@link
1402android.preference.SwitchPreference} is an extension of {@link
1403android.preference.TwoStatePreference} that provides a {@link android.widget.Switch} widget in the
1404preference view to allow users to toggle a setting on or off without the need to open an additional
1405preference screen or dialog. For example, the Settings application uses a {@link
1406android.preference.SwitchPreference} for the Wi-Fi and Bluetooth settings.</p>
1407
1408
Scott Main423aca12011-10-17 16:31:11 -07001409
1410<h4>System themes</h4>
1411
1412<p>The default theme for all applications that target Android 4.0 (by setting either <a
1413href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code targetSdkVersion}</a> or
1414<a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code minSdkVersion}</a> to
1415{@code “14"} or higher) is now the
1416"device default" theme: {@link android.R.style#Theme_DeviceDefault Theme.DeviceDefault}. This may be
1417the dark Holo theme or a different dark theme defined by the specific device.</p>
1418
1419<p>The {@link android.R.style#Theme_Holo Theme.Holo} family of themes are guaranteed to not change
1420from one device to another when running the same version of Android. If you explicitly
1421apply any of the {@link android.R.style#Theme_Holo Theme.Holo} themes to your activities, you can
1422rest assured that these themes will not change character on different devices within the same
1423platform version.</p>
1424
1425<p>If you wish for your app to blend in with the overall device theme (such as when different OEMs
1426provide different default themes for the system), you should explicitly apply themes from the {@link
1427android.R.style#Theme_DeviceDefault Theme.DeviceDefault} family.</p>
1428
1429
1430<h4>Options menu button</h4>
1431
1432<p>Beginning with Android 4.0, you'll notice that handsets no longer require a Menu hardware button.
1433However, there's no need for you to worry about this if your existing application provides an <a
1434href="{@docRoot}guide/topics/ui/menus.html#options-menu">options menu</a> and expects there to be a
1435Menu button. To ensure that existing apps continue to work as they expect, the system provides an
1436on-screen Menu button for apps that were designed for older versions of Android.</p>
1437
1438<p>For the best user experience, new and updated apps should instead use the {@link
1439android.app.ActionBar} to provide access to menu items and set <a
1440href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code targetSdkVersion}</a> to
1441{@code "14"} to take advantage of the latest framework default behaviors.</p>
1442
1443
1444
1445<h4>Controls for system UI visibility</h4>
1446
1447<p>Since the early days of Android, the system has managed a UI component known as the <em>status
1448bar</em>, which resides at the top of handset devices to deliver information such as the carrier
1449signal, time, notifications, and so on. Android 3.0 added the <em>system bar</em> for tablet
1450devices, which resides at the bottom of the screen to provide system navigation controls (Home,
1451Back, and so forth) and also an interface for elements traditionally provided by the status bar. In
1452Android 4.0, the system provides a new type of system UI called the <em>navigation bar</em>. You
1453might consider the navigation bar a re-tuned version of the system bar designed for
1454handsets&mdash;it provides navigation controls
1455for devices that don’t have hardware counterparts for navigating the system, but it leaves out the
1456system bar's notification UI and setting controls. As such, a device that provides the navigation
1457bar also has the status bar at the top.</p>
1458
1459<p>To this day, you can hide the status bar on handsets using the {@link
1460android.view.WindowManager.LayoutParams#FLAG_FULLSCREEN} flag. In Android 4.0, the APIs that control
1461the system bar’s visibility have been updated to better reflect the behavior of both the system bar
1462and navigation bar:</p>
1463<ul>
1464<li>The {@link android.view.View#SYSTEM_UI_FLAG_LOW_PROFILE} flag replaces the {@code
1465STATUS_BAR_HIDDEN} flag. When set, this flag enables “low profile" mode for the system bar or
1466navigation bar. Navigation buttons dim and other elements in the system bar also hide. Enabling
1467this is useful for creating more immersive games without distraction for the system navigation
1468buttons.</li>
1469
1470<li>The {@link android.view.View#SYSTEM_UI_FLAG_VISIBLE} flag replaces the {@code
1471STATUS_BAR_VISIBLE} flag to request the system bar or navigation bar be visible.</li>
1472
1473<li>The {@link android.view.View#SYSTEM_UI_FLAG_HIDE_NAVIGATION} is a new flag that requests
1474the navigation bar hide completely. Be aware that this works only for the <em>navigation bar</em>
1475used by some handsets (it does <strong>not</strong> hide the system bar on tablets). The navigation
1476bar returns to view as soon as the system receives user input. As such, this mode is useful
1477primarily for video playback or other cases in which the whole screen is needed but user input is
1478not required.</li>
1479</ul>
1480
1481<p>You can set each of these flags for the system bar and navigation bar by calling {@link
1482android.view.View#setSystemUiVisibility setSystemUiVisibility()} on any view in your activity. The
1483window manager combines (OR-together) all flags from all views in your window and
1484apply them to the system UI as long as your window has input focus. When your window loses input
1485focus (the user navigates away from your app, or a dialog appears), your flags cease to have effect.
1486Similarly, if you remove those views from the view hierarchy their flags no longer apply.</p>
1487
1488<p>To synchronize other events in your activity with visibility changes to the system UI (for
1489example, hide the action bar or other UI controls when the system UI hides), you should register a
1490{@link android.view.View.OnSystemUiVisibilityChangeListener} to be notified when the visibility
1491of the system bar or navigation bar changes.</p>
1492
1493<p>See the <a
1494href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/view/OverscanActivity.html">
1495OverscanActivity</a> class for a demonstration of different system UI options.</p>
1496
1497
1498
1499
1500
1501<h3 id="Input">Input Framework</h3>
1502
1503<p>Android 4.0 adds support for cursor hover events and new stylus and mouse button events.</p>
1504
Scott Maine1e9e932011-10-13 23:36:19 -07001505<h4>Hover events</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -07001506
Scott Mainb57769a2011-10-17 11:20:49 -07001507<p>The {@link android.view.View} class now supports “hover" events to enable richer interactions
Scott Maine1e9e932011-10-13 23:36:19 -07001508through the use of pointer devices (such as a mouse or other devices that drive an on-screen
Scott Main1d6f70c2011-10-06 22:57:25 -07001509cursor).</p>
1510
1511<p>To receive hover events on a view, implement the {@link android.view.View.OnHoverListener} and
1512register it with {@link android.view.View#setOnHoverListener setOnHoverListener()}. When a hover
1513event occurs on the view, your listener receives a call to {@link
1514android.view.View.OnHoverListener#onHover onHover()}, providing the {@link android.view.View} that
1515received the event and a {@link android.view.MotionEvent} that describes the type of hover event
1516that occurred. The hover event can be one of the following:</p>
1517<ul>
1518<li>{@link android.view.MotionEvent#ACTION_HOVER_ENTER}</li>
1519<li>{@link android.view.MotionEvent#ACTION_HOVER_EXIT}</li>
1520<li>{@link android.view.MotionEvent#ACTION_HOVER_MOVE}</li>
1521</ul>
1522
1523<p>Your {@link android.view.View.OnHoverListener} should return true from {@link
1524android.view.View.OnHoverListener#onHover onHover()} if it handles the hover event. If your
1525listener returns false, then the hover event will be dispatched to the parent view as usual.</p>
1526
1527<p>If your application uses buttons or other widgets that change their appearance based on the
Scott Maine1e9e932011-10-13 23:36:19 -07001528current state, you can now use the {@code android:state_hovered} attribute in a <a
Scott Mainb57769a2011-10-17 11:20:49 -07001529href="{@docRoot}guide/topics/resources/drawable-resource.html#StateList">state list drawable</a> to
Scott Main1d6f70c2011-10-06 22:57:25 -07001530provide a different background drawable when a cursor hovers over the view.</p>
1531
1532<p>For a demonstration of the new hover events, see the <a
Scott Mainb57769a2011-10-17 11:20:49 -07001533href="{@docRoot}samples/ApiDemos/src/com/example/android/apis/view/Hover.html">Hover</a> class in
Scott Main1d6f70c2011-10-06 22:57:25 -07001534ApiDemos.</p>
1535
1536
Scott Maine1e9e932011-10-13 23:36:19 -07001537<h4>Stylus and mouse button events</h4>
Scott Main1d6f70c2011-10-06 22:57:25 -07001538
1539<p>Android now provides APIs for receiving input from a stylus input device such as a digitizer
Scott Maine1e9e932011-10-13 23:36:19 -07001540tablet peripheral or a stylus-enabled touch screen.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001541
1542<p>Stylus input operates in a similar manner to touch or mouse input. When the stylus is in contact
1543with the digitizer, applications receive touch events just like they would when a finger is used to
1544touch the display. When the stylus is hovering above the digitizer, applications receive hover
1545events just like they would when a mouse pointer was being moved across the display when no buttons
1546are pressed.</p>
1547
1548<p>Your application can distinguish between finger, mouse, stylus and eraser input by querying the
Scott Mainb57769a2011-10-17 11:20:49 -07001549“tool type" associated with each pointer in a {@link android.view.MotionEvent} using {@link
Scott Main1d6f70c2011-10-06 22:57:25 -07001550android.view.MotionEvent#getToolType getToolType()}. The currently defined tool types are: {@link
1551android.view.MotionEvent#TOOL_TYPE_UNKNOWN}, {@link android.view.MotionEvent#TOOL_TYPE_FINGER},
1552{@link android.view.MotionEvent#TOOL_TYPE_MOUSE}, {@link android.view.MotionEvent#TOOL_TYPE_STYLUS},
1553and {@link android.view.MotionEvent#TOOL_TYPE_ERASER}. By querying the tool type, your application
1554can choose to handle stylus input in different ways from finger or mouse input.</p>
1555
1556<p>Your application can also query which mouse or stylus buttons are pressed by querying the “button
Scott Mainb57769a2011-10-17 11:20:49 -07001557state" of a {@link android.view.MotionEvent} using {@link android.view.MotionEvent#getButtonState
Scott Main1d6f70c2011-10-06 22:57:25 -07001558getButtonState()}. The currently defined button states are: {@link
Scott Maine1e9e932011-10-13 23:36:19 -07001559android.view.MotionEvent#BUTTON_PRIMARY}, {@link android.view.MotionEvent#BUTTON_SECONDARY}, {@link
1560android.view.MotionEvent#BUTTON_TERTIARY}, {@link android.view.MotionEvent#BUTTON_BACK}, and {@link
1561android.view.MotionEvent#BUTTON_FORWARD}. For convenience, the back and forward mouse buttons are
1562automatically mapped to the {@link android.view.KeyEvent#KEYCODE_BACK} and {@link
1563android.view.KeyEvent#KEYCODE_FORWARD} keys. Your application can handle these keys to support
1564mouse button based back and forward navigation.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001565
1566<p>In addition to precisely measuring the position and pressure of a contact, some stylus input
Scott Maine1e9e932011-10-13 23:36:19 -07001567devices also report the distance between the stylus tip and the digitizer, the stylus tilt angle,
1568and the stylus orientation angle. Your application can query this information using {@link
Scott Main1d6f70c2011-10-06 22:57:25 -07001569android.view.MotionEvent#getAxisValue getAxisValue()} with the axis codes {@link
1570android.view.MotionEvent#AXIS_DISTANCE}, {@link android.view.MotionEvent#AXIS_TILT}, and {@link
1571android.view.MotionEvent#AXIS_ORIENTATION}.</p>
1572
1573<p>For a demonstration of tool types, button states and the new axis codes, see the <a
Scott Mainb57769a2011-10-17 11:20:49 -07001574href="{@docRoot}samples/ApiDemos/src/com/example/android/apis/graphics/TouchPaint.html">TouchPaint
Scott Main1d6f70c2011-10-06 22:57:25 -07001575</a> class in ApiDemos.</p>
1576
1577
1578
1579
1580
1581
1582<h3 id="Properties">Properties</h3>
1583
1584<p>The new {@link android.util.Property} class provides a fast, efficient, and easy way to specify a
1585property on any object that allows callers to generically set/get values on target objects. It also
1586allows the functionality of passing around field/method references and allows code to set/get values
1587of the property without knowing the details of what the fields/methods are.</p>
1588
1589<p>For example, if you want to set the value of field {@code bar} on object {@code foo}, you would
1590previously do this:</p>
1591<pre>
1592foo.bar = value;
1593</pre>
1594
1595<p>If you want to call the setter for an underlying private field {@code bar}, you would previously
1596do this:</p>
1597<pre>
1598foo.setBar(value);
1599</pre>
1600
1601<p>However, if you want to pass around the {@code foo} instance and have some other code set the
1602{@code bar} value, there is really no way to do it prior to Android 4.0.</p>
1603
1604<p>Using the {@link android.util.Property} class, you can declare a {@link android.util.Property}
1605object {@code BAR} on class {@code Foo} so that you can set the field on instance {@code foo} of
1606class {@code Foo} like this:</p>
1607<pre>
1608BAR.set(foo, value);
1609</pre>
1610
1611<p>The {@link android.view.View} class now leverages the {@link android.util.Property} class to
1612allow you to set various fields, such as transform properties that were added in Android 3.0 ({@link
1613android.view.View#ROTATION}, {@link android.view.View#ROTATION_X}, {@link
1614android.view.View#TRANSLATION_X}, etc.).</p>
1615
1616<p>The {@link android.animation.ObjectAnimator} class also uses the {@link android.util.Property}
1617class, so you can create an {@link android.animation.ObjectAnimator} with a {@link
1618android.util.Property}, which is faster, more efficient, and more type-safe than the string-based
1619approach.</p>
1620
1621
1622
1623
1624
1625
1626<h3 id="HwAccel">Hardware Acceleration</h3>
1627
1628<p>Beginning with Android 4.0, hardware acceleration for all windows is enabled by default if your
1629application has set either <a
1630href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code targetSdkVersion}</a> or
1631<a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code minSdkVersion}</a> to
Scott Mainb57769a2011-10-17 11:20:49 -07001632{@code “14"} or higher. Hardware acceleration generally results in smoother animations, smoother
Scott Main1d6f70c2011-10-06 22:57:25 -07001633scrolling, and overall better performance and response to user interaction.</p>
1634
1635<p>If necessary, you can manually disable hardware acceleration with the <a
Scott Mainb57769a2011-10-17 11:20:49 -07001636href="{@docRoot}guide/topics/manifest/activity-element.html#hwaccel">{@code hardwareAccelerated}</a>
Scott Main1d6f70c2011-10-06 22:57:25 -07001637attribute for individual <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code
1638&lt;activity&gt;}</a> elements or the <a
1639href="{@docRoot}guide/topics/manifest/application-element.html">{@code &lt;application&gt;}</a>
1640element. You can alternatively disable hardware acceleration for individual views by calling {@link
1641android.view.View#setLayerType setLayerType(LAYER_TYPE_SOFTWARE)}.</p>
1642
Scott Maine1e9e932011-10-13 23:36:19 -07001643<p>For more information about hardware acceleration, including a list of unsupported drawing
1644operations, see the <a href="{@docRoot}guide/topics/graphics/hardware-accel.html">Hardware
1645Acceleration</a> document.</p>
1646
1647
Scott Main1d6f70c2011-10-06 22:57:25 -07001648
1649<h3 id="Jni">JNI Changes</h3>
1650
Scott Maine1e9e932011-10-13 23:36:19 -07001651<p>In previous versions of Android, JNI local references weren’t indirect handles; Android used
1652direct pointers. This wasn't a problem as long as the garbage collector didn't move objects, but it
1653seemed to work because it made it possible to write buggy code. In Android 4.0, the system now uses
1654indirect references in order to detect these bugs.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001655
Scott Mainb57769a2011-10-17 11:20:49 -07001656<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 -07001657href="{@docRoot}guide/practices/design/jni.html">JNI Tips</a>. In Android 4.0, <a
1658href="http://android-developers.blogspot.com/2011/07/debugging-android-jni-with-checkjni.html">
1659CheckJNI</a> has been enhanced to detect these errors. Watch the <a
Scott Mainb57769a2011-10-17 11:20:49 -07001660href="http://android-developers.blogspot.com/">Android Developers Blog</a> for an upcoming post
Scott Maine1e9e932011-10-13 23:36:19 -07001661about common errors with JNI references and how you can fix them.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001662
1663<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 -07001664the <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code
1665targetSdkVersion}</a> or <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code
Scott Mainb57769a2011-10-17 11:20:49 -07001666minSdkVersion}</a> to {@code “14"} or higher. If you’ve set these attributes to any lower value,
Scott Maine1e9e932011-10-13 23:36:19 -07001667then JNI local references behave the same as in previous versions.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001668
1669
1670
1671
1672
1673<h3 id="WebKit">WebKit</h3>
1674<ul>
1675<li>WebKit updated to version 534.30</li>
1676<li>Support for Indic fonts (Devanagari, Bengali, and Tamil, including the complex character support
1677needed for combining glyphs) in {@link android.webkit.WebView} and the built-in Browser</li>
1678<li>Support for Ethiopic, Georgian, and Armenian fonts in {@link android.webkit.WebView} and the
1679built-in Browser</li>
1680<li>Support for <a
1681href="http://google-opensource.blogspot.com/2009/05/introducing-webdriver.html">WebDriver</a> makes
1682it easier for you to test apps that use {@link android.webkit.WebView}</li>
1683</ul>
1684
1685
1686<h4>Android Browser</h4>
1687
1688<p>The Browser application adds the following features to support web applications:</p>
1689<ul>
1690<li>Updated V8 JavaScript compiler for faster performance</li>
1691<li>Plus other notable enhancements carried over from <a
Scott Mainb57769a2011-10-17 11:20:49 -07001692href="{@docRoot}sdk/android-3.0.html">Android
Scott Main1d6f70c2011-10-06 22:57:25 -070016933.0</a> are now available for handsets:
1694<ul>
1695<li>Support for fixed position elements on all pages</li>
1696<li><a href="http://dev.w3.org/2009/dap/camera/">HTML media capture</a></li>
1697<li><a href="http://dev.w3.org/geo/api/spec-source-orientation.html">Device orientation
1698events</a></li>
1699<li><a href="http://www.w3.org/TR/css3-3d-transforms/">CSS 3D transformations</a></li>
1700</ul>
1701</li>
1702</ul>
1703
1704
1705
1706<h3 id="Permissions">Permissions</h3>
1707
1708<p>The following are new permissions:</p>
1709<ul>
1710<li>{@link android.Manifest.permission#ADD_VOICEMAIL}: Allows a voicemail service to add voicemail
1711messages to the device.</li>
1712<li>{@link android.Manifest.permission#BIND_TEXT_SERVICE}: A service that implements {@link
1713android.service.textservice.SpellCheckerService} must require this permission for itself.</li>
1714<li>{@link android.Manifest.permission#BIND_VPN_SERVICE}: A service that implements {@link
1715android.net.VpnService} must require this permission for itself.</li>
1716<li>{@link android.Manifest.permission#READ_PROFILE}: Provides read access to the {@link
1717android.provider.ContactsContract.Profile} provider.</li>
1718<li>{@link android.Manifest.permission#WRITE_PROFILE}: Provides write access to the {@link
1719android.provider.ContactsContract.Profile} provider.</li>
1720</ul>
1721
1722
1723
1724<h3 id="DeviceFeatures">Device Features</h3>
1725
1726<p>The following are new device features:</p>
1727<ul>
1728<li>{@link android.content.pm.PackageManager#FEATURE_WIFI_DIRECT}: Declares that the application
1729uses
1730Wi-Fi for peer-to-peer communications.</li>
1731</ul>
1732
1733
Scott Main423aca12011-10-17 16:31:11 -07001734<div class="special" style="margin-top:3em">
1735<p>For a detailed view of all API changes in Android {@sdkPlatformVersion} (API Level
1736{@sdkPlatformApiLevel}), see the <a
1737href="{@docRoot}sdk/api_diff/{@sdkPlatformApiLevel}/changes.html">API Differences Report</a>.</p>
1738</div>
1739
Scott Main1d6f70c2011-10-06 22:57:25 -07001740
Scott Maine1e9e932011-10-13 23:36:19 -07001741<h2 id="Honeycomb">Previous APIs</h2>
Scott Main1d6f70c2011-10-06 22:57:25 -07001742
Scott Maine1e9e932011-10-13 23:36:19 -07001743<p>In addition to everything above, Android 4.0 naturally supports all APIs from previous releases.
Scott Main423aca12011-10-17 16:31:11 -07001744Because the Android 3.x platform is available only for large-screen devices, if you've
Scott Maine1e9e932011-10-13 23:36:19 -07001745been developing primarily for handsets, then you might not be aware of all the APIs added to Android
1746in these recent releases.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001747
Scott Maine1e9e932011-10-13 23:36:19 -07001748<p>Here's a look at some of the most notable APIs you might have missed that are now available
1749on handsets as well:</p>
1750
1751<dl>
1752 <dt><a href="android-3.0.html">Android 3.0</a></dt>
1753 <dd>
1754 <ul>
1755 <li>{@link android.app.Fragment}: A framework component that allows you to separate distinct
1756elements of an activity into self-contained modules that define their own UI and lifecycle. See the
1757<a href="{@docRoot}guide/topics/fundamentals/fragments.html">Fragments</a> developer guide.</li>
1758 <li>{@link android.app.ActionBar}: A replacement for the traditional title bar at the top of
1759the activity window. It includes the application logo in the left corner and provides a new
1760interface for menu items. See the
1761<a href="{@docRoot}guide/topics/ui/actionbar.html">Action Bar</a> developer guide.</li>
Scott Main423aca12011-10-17 16:31:11 -07001762 <li>{@link android.content.Loader}: A framework component that facilitates asynchronous
Scott Maine1e9e932011-10-13 23:36:19 -07001763loading of data in combination with UI components to dynamically load data without blocking the
1764main thread. See the
1765<a href="{@docRoot}guide/topics/fundamentals/loaders.html">Loaders</a> developer guide.</li>
1766 <li>System clipboard: Applications can copy and paste data (beyond mere text) to and from
1767the system-wide clipboard. Clipped data can be plain text, a URI, or an intent. See the
1768<a href="{@docRoot}guide/topics/clipboard/copy-paste.html">Copy and Paste</a> developer guide.</li>
1769 <li>Drag and drop: A set of APIs built into the view framework that facilitates drag and drop
1770operations. See the
1771<a href="{@docRoot}guide/topics/ui/drag-drop.html">Drag and Drop</a> developer guide.</li>
1772 <li>An all new flexible animation framework allows you to animate arbitrary properties of any
1773object (View, Drawable, Fragment, Object, or anything else) and define animation aspects such
1774as duration, interpolation, repeat and more. The new framework makes Animations in Android
1775simpler than ever. See the
1776<a href="{@docRoot}guide/topics/graphics/property-animation.html">Property Animation</a> developer
1777guide.</li>
1778 <li>RenderScript graphics and compute engine: RenderScript offers a high performance 3D
1779graphics rendering and compute API at the native level, which you write in the C (C99 standard),
1780providing the type of performance you expect from a native environment while remaining portable
1781across various CPUs and GPUs. See the
1782<a href="{@docRoot}guide/topics/renderscript/index.html">RenderScript</a> developer
1783guide.</li>
1784 <li>Hardware accelerated 2D graphics: You can now enable the OpenGL renderer for your
1785application by setting {android:hardwareAccelerated="true"} in your manifest element's <a
1786href="{@docRoot}guide/topics/manifest/application-element.html"><code>&lt;application&gt;</code></a>
1787element or for individual <a
1788href="{@docRoot}guide/topics/manifest/activity-element.html"><code>&lt;activity&gt;</code></a>
1789elements. This results
1790in smoother animations, smoother scrolling, and overall better performance and response to user
1791interaction.
1792 <p class="note"><strong>Note:</strong> If you set your application's <a
1793href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code minSdkVersion}</a> or <a
1794href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code targetSdkVersion}</a> to
1795{@code "14"} or higher, hardware acceleration is enabled by default.</p></li>
1796 <li>And much, much more. See the <a href="android-3.0.html">Android 3.0 Platform</a>
1797notes for more information.</li>
1798 </ul>
1799 </dd>
1800
1801 <dt><a href="android-3.1.html">Android 3.1</a></dt>
1802 <dd>
1803 <ul>
1804 <li>USB APIs: Powerful new APIs for integrating connected peripherals with
1805Android applications. The APIs are based on a USB stack and services that are
1806built into the platform, including support for both USB host and device interactions. See the <a
1807href="{@docRoot}guide/topics/usb/index.html">USB Host and Accessory</a> developer guide.</li>
1808 <li>MTP/PTP APIs: Applications can interact directly with connected cameras and other PTP
1809devices to receive notifications when devices are attached and removed, manage files and storage on
1810those devices, and transfer files and metadata to and from them. The MTP API implements the PTP
1811(Picture Transfer Protocol) subset of the MTP (Media Transfer Protocol) specification. See the
1812{@link android.mtp} documentation.</li>
1813 <li>RTP APIs: Android exposes an API to its built-in RTP (Real-time Transport Protocol) stack,
1814which applications can use to manage on-demand or interactive data streaming. In particular, apps
1815that provide VOIP, push-to-talk, conferencing, and audio streaming can use the API to initiate
1816sessions and transmit or receive data streams over any available network. See the {@link
1817android.net.rtp} documentation.</li>
1818 <li>Support for joysticks and other generic motion inputs.</li>
1819 <li>See the <a href="android-3.1.html">Android 3.1 Platform</a>
1820notes for many more new APIs.</li>
1821 </ul>
1822 </dd>
1823
1824 <dt><a href="android-3.2.html">Android 3.2</a></dt>
1825 <dd>
1826 <ul>
1827 <li>New screens support APIs that give you more control over how your applications are
1828displayed across different screen sizes. The API extends the existing screen support model with the
1829ability to precisely target specific screen size ranges by dimensions, measured in
1830density-independent pixel units (such as 600dp or 720dp wide), rather than by their generalized
1831screen sizes (such as large or xlarge). For example, this is important in order to help you
1832distinguish between a 5" device and a 7" device, which would both traditionally be bucketed as
1833"large" screens. See the blog post, <a
1834href="http://android-developers.blogspot.com/2011/07/new-tools-for-managing-screen-sizes.html">
1835New Tools for Managing Screen Sizes</a>.</li>
1836 <li>New constants for <a
1837href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code &lt;uses-feature&gt;}</a> to
1838declare landscape or portrait screen orientation requirements.</li>
1839 <li>The device "screen size" configuration now changes during a screen orientation
1840change. If your app targets API level 13 or higher, you must handle the {@code "screenSize"}
1841configuration change if you also want to handle the {@code "orientation"} configuration change. See
1842<a href="{@docRoot}guide/topics/manifest/activity-element.html#config">{@code
1843android:configChanges}</a> for more information.</li>
1844 <li>See the <a href="android-3.2.html">Android 3.2 Platform</a>
1845notes for other new APIs.</li>
1846 </ul>
1847 </dd>
1848
1849</dl>
Scott Main1d6f70c2011-10-06 22:57:25 -07001850
1851
1852
1853
Scott Main1d6f70c2011-10-06 22:57:25 -07001854<h2 id="api-level">API Level</h2>
1855
Scott Maine1e9e932011-10-13 23:36:19 -07001856<p>The Android {@sdkPlatformVersion} API is assigned an integer
1857identifier&mdash;<strong>{@sdkPlatformApiLevel}</strong>&mdash;that is stored in the system itself.
1858This identifier, called the "API level", allows the system to correctly determine whether an
1859application is compatible with the system, prior to installing the application. </p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001860
1861<p>To use APIs introduced in Android {@sdkPlatformVersion} in your application, you need compile the
Scott Maine1e9e932011-10-13 23:36:19 -07001862application against an Android platform that supports API level {@sdkPlatformApiLevel} or
1863higher. Depending on your needs, you might also need to add an
Scott Main1d6f70c2011-10-06 22:57:25 -07001864<code>android:minSdkVersion="{@sdkPlatformApiLevel}"</code> attribute to the
Scott Maine1e9e932011-10-13 23:36:19 -07001865<a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html">{@code &lt;uses-sdk&gt;}</a>
1866element.</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001867
Scott Maine1e9e932011-10-13 23:36:19 -07001868<p>For more information, see the <a href="{@docRoot}guide/appendix/api-levels.html">API Levels</a>
1869document. </p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001870
1871
1872<h2 id="apps">Built-in Applications</h2>
1873
1874<p>The system image included in the downloadable platform provides these
1875built-in applications:</p>
1876
1877<table style="border:0;padding-bottom:0;margin-bottom:0;">
1878<tr>
1879<td style="border:0;padding-bottom:0;margin-bottom:0;">
1880<ul>
1881<li>API Demos</li>
1882<li>Browser</li>
1883<li>Calculator</li>
Scott Maine1e9e932011-10-13 23:36:19 -07001884<li>Calendar</li>
Scott Main1d6f70c2011-10-06 22:57:25 -07001885<li>Camera</li>
1886<li>Clock</li>
1887<li>Custom Locale</li>
1888<li>Dev Tools</li>
1889<li>Downloads</li>
1890<li>Email</li>
1891<li>Gallery</li>
1892</ul>
1893</td>
1894<td style="border:0;padding-bottom:0;margin-bottom:0;padding-left:5em;">
1895<ul>
1896<li>Gestures Builder</li>
1897<li>Messaging</li>
1898<li>Music</li>
1899<li>People</li>
1900<li>Phone</li>
1901<li>Search</li>
1902<li>Settings</li>
Scott Maine1e9e932011-10-13 23:36:19 -07001903<li>Speech Recorder</li>
Scott Main1d6f70c2011-10-06 22:57:25 -07001904<li>Speech Recorder</li>
1905<li>Widget Preview</li>
1906</ul>
1907</td>
1908</tr>
1909</table>
1910
1911
1912<h2 id="locs" style="margin-top:.75em;">Locales</h2>
1913
Scott Maine1e9e932011-10-13 23:36:19 -07001914<p>The system image included in the downloadable SDK platform provides a variety of built-in
1915locales. In some cases, region-specific strings are available for the locales. In other cases, a
1916default version of the language is used. The languages that are available in the Android 3.0 system
1917image are listed below (with <em>language</em>_<em>country/region</em> locale descriptor).</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001918
1919<table style="border:0;padding-bottom:0;margin-bottom:0;">
1920<tr>
1921<td style="border:0;padding-bottom:0;margin-bottom:0;">
1922<ul>
1923<li>Arabic, Egypt (ar_EG)</li>
1924<li>Arabic, Israel (ar_IL)</li>
1925<li>Bulgarian, Bulgaria (bg_BG)</li>
1926<li>Catalan, Spain (ca_ES)</li>
1927<li>Czech, Czech Republic (cs_CZ)</li>
1928<li>Danish, Denmark(da_DK)</li>
1929<li>German, Austria (de_AT)</li>
1930<li>German, Switzerland (de_CH)</li>
1931<li>German, Germany (de_DE)</li>
1932<li>German, Liechtenstein (de_LI)</li>
1933<li>Greek, Greece (el_GR)</li>
1934<li>English, Australia (en_AU)</li>
1935<li>English, Canada (en_CA)</li>
1936<li>English, Britain (en_GB)</li>
1937<li>English, Ireland (en_IE)</li>
1938<li>English, India (en_IN)</li>
1939<li>English, New Zealand (en_NZ)</li>
1940<li>English, Singapore(en_SG)</li>
1941<li>English, US (en_US)</li>
1942<li>English, Zimbabwe (en_ZA)</li>
1943<li>Spanish (es_ES)</li>
1944<li>Spanish, US (es_US)</li>
1945<li>Finnish, Finland (fi_FI)</li>
1946<li>French, Belgium (fr_BE)</li>
1947<li>French, Canada (fr_CA)</li>
1948<li>French, Switzerland (fr_CH)</li>
1949<li>French, France (fr_FR)</li>
1950<li>Hebrew, Israel (he_IL)</li>
1951<li>Hindi, India (hi_IN)</li>
1952</ul>
1953</td>
1954<td style="border:0;padding-bottom:0;margin-bottom:0;padding-left:5em;">
1955<li>Croatian, Croatia (hr_HR)</li>
1956<li>Hungarian, Hungary (hu_HU)</li>
1957<li>Indonesian, Indonesia (id_ID)</li>
1958<li>Italian, Switzerland (it_CH)</li>
1959<li>Italian, Italy (it_IT)</li>
1960<li>Japanese (ja_JP)</li>
1961<li>Korean (ko_KR)</li>
1962<li>Lithuanian, Lithuania (lt_LT)</li>
1963<li>Latvian, Latvia (lv_LV)</li>
1964<li>Norwegian bokmål, Norway (nb_NO)</li>
1965<li>Dutch, Belgium (nl_BE)</li>
1966<li>Dutch, Netherlands (nl_NL)</li>
1967<li>Polish (pl_PL)</li>
1968<li>Portuguese, Brazil (pt_BR)</li>
1969<li>Portuguese, Portugal (pt_PT)</li>
1970<li>Romanian, Romania (ro_RO)</li>
1971<li>Russian (ru_RU)</li></li>
1972<li>Slovak, Slovakia (sk_SK)</li>
1973<li>Slovenian, Slovenia (sl_SI)</li>
1974<li>Serbian (sr_RS)</li>
1975<li>Swedish, Sweden (sv_SE)</li>
1976<li>Thai, Thailand (th_TH)</li>
1977<li>Tagalog, Philippines (tl_PH)</li>
1978<li>Turkish, Turkey (tr_TR)</li>
1979<li>Ukrainian, Ukraine (uk_UA)</li>
1980<li>Vietnamese, Vietnam (vi_VN)</li>
1981<li>Chinese, PRC (zh_CN)</li>
1982<li>Chinese, Taiwan (zh_TW)</li>
1983</td>
1984</tr>
1985</table>
1986
1987<p class="note"><strong>Note:</strong> The Android platform may support more
1988locales than are included in the SDK system image. All of the supported locales
1989are available in the <a href="http://source.android.com/">Android Open Source
1990Project</a>.</p>
1991
1992<h2 id="skins">Emulator Skins</h2>
1993
Scott Maine1e9e932011-10-13 23:36:19 -07001994<p>The downloadable platform includes the following emulator skins:</p>
Scott Main1d6f70c2011-10-06 22:57:25 -07001995
1996<ul>
1997 <li>
Scott Maine1e9e932011-10-13 23:36:19 -07001998 QVGA (240x320, low density, small screen)
1999 </li>
2000 <li>
2001 WQVGA400 (240x400, low density, normal screen)
2002 </li>
2003 <li>
2004 WQVGA432 (240x432, low density, normal screen)
2005 </li>
2006 <li>
2007 HVGA (320x480, medium density, normal screen)
2008 </li>
2009 <li>
2010 WVGA800 (480x800, high density, normal screen)
2011 </li>
2012 <li>
2013 WVGA854 (480x854 high density, normal screen)
2014 </li>
2015 <li>
2016 WXGA720 (1280x720, extra-high density, normal screen) <span class="new">new</span>
2017 </li>
2018 <li>
2019 WSVGA (1024x600, medium density, large screen) <span class="new">new</span>
2020 </li>
2021 <li>
2022 WXGA (1280x800, medium density, xlarge screen)
Scott Main1d6f70c2011-10-06 22:57:25 -07002023 </li>
2024</ul>
2025
Scott Maine1e9e932011-10-13 23:36:19 -07002026<p>To test your application on an emulator that represents the latest Android device, you can create
2027an AVD with the new WXGA720 skin (it's an xhdpi, normal screen device). Note that the emulator
2028currently doesn't support the new on-screen navigation bar for devices without hardware navigation
2029buttons, so when using this skin, you must use keyboard keys <em>Home</em> for the Home button,
2030<em>ESC</em> for the Back button, and <em>F2</em> or <em>Page-up</em> for the Menu button.</p>
2031
2032<p>However, due to performance issues in the emulator when running high-resolution screens such as
2033the one for the WXGA720 skin, we recommend that you primarily use the traditional WVGA800 skin
2034(hdpi, normal screen) to test your application.</p>
2035