blob: 441793acf6d5da01e93ff29a0f272df6016d93eb [file] [log] [blame]
Robert Ly20555292014-06-13 23:28:19 -07001page.title=L Developer Preview APIs
2excludeFromSuggestions=true
3sdk.platform.apiLevel=20
4@jd:body
5
6
7<div id="qv-wrapper">
8<div id="qv">
9
10<h2>In this document
11 <a href="#" onclick="hideNestedItems('#toc44',this);return false;" class="header-toggle">
12 <span class="more">show more</span>
13 <span class="less" style="display:none">show less</span></a></h2>
14
15<ol id="toc44" class="hide-nested">
16 <li><a href="#Behaviors">Important Behavior Changes</a>
17 <ol>
18 <li><a href="#BehaviorNotifications">If your app implements notifications...</a></li>
19 <li><a href="#BehaviorFullscreen">If your app uses fullScreenIntent...</a></li>
20 <li><a href="#BehaviorGetRecentTasks">If your app uses ActivityManager.getRecentTasks()...</a></li>
21 </ol>
22 </li>
23 <li><a href="#UI">User Interface</a>
24 <ol>
25 <li><a href="#MaterialDesign">Material design support</a></li>
26 <li><a href="#LockscreenNotifications">Lockscreen notifications</a></li>
27 <li><a href="#NotificationsMetadata">Notifications metadata</a></li>
28 <li><a href="#Recents">Concurrent documents and activities in Recents screen</a></li>
29 <li><a href="#WebView">WebView updates</a></li>
30 </ol>
31 </li>
32 <li><a href="#UserInput">User Input</a>
33 <ol>
34 <li><a href="#IME">IME bug fixes and improvements</a></li>
35 </ol>
36 </li>
37 <li><a href="#Animations">Animation &amp; Graphics</a>
38 <ol>
39 <li><a href="#OpenGLES-3-1">Support for OpenGL ES 3.1</a></li>
40 </ol>
41 </li>
42 <li><a href="#Multimedia">Multimedia</a>
43 <ol>
44 <li><a href="#Camera-v2">Camera V2</a></li>
45 <li><a href="#AudioPlayback">Audio playback</a></li>
46 <li><a href="#MediaPlaybackControl">Media playback control</a></li>
47 </ol>
48 </li>
49 <li><a href="#Storage">Storage</a>
50 <ol>
51 <li><a href="#DirectorySelection">Directory selection</a></li>
52 </ol>
53 </li>
54 <li><a href="#Wireless">Wireless and Connectivity</a>
55 <ol>
56 <li><a href="#Multinetwork">Dynamic network selection and seamless handoff</a></li>
57 <li><a href="#BluetoothBroadcasting">Bluetooth broadcasting</a></li>
58 <li><a href="#NFCEnhancements">NFC enhancements for payments</a></li>
59 </ol>
60 </li>
61 <li><a href="#Power">Power Efficiency</a>
62 <ol>
63 <li><a href="#JobScheduler">Scheduling Jobs</a></li>
64 <li><a href="#PowerMeasurementTools">Developer tools and APIs for power measurement</a>
65 </ol>
66 </li>
67 <li><a href="#Enterprise">Enterprise</a>
68 <ol>
69 <li><a href="#ManagedProvisioning">Managed provisioning</a></li>
70 </ol>
71 </li>
72 <li><a href="#Printing">Printing Framework</a>
73 <ol>
74 <li><a href="#PDFRender">PDF rendering</a></li>
75 </ol>
76 </li>
77 <li><a href="#TestingA11y">Testing &amp; Accessibility</a>
78 <ol>
79 <li><a href="#TestingA11yImprovements">Testing and accessibility improvements</a></li>
80 </ol>
81 </li>
82 <li><a href="#Manifest">Manifest Declarations</a>
83 <ol>
84 <li><a href="#ManifestFeatures">Declarable required features</a></li>
85 <li><a href="#ManifestPermissions">User permissions</a></li>
86 </ol>
87 </li>
88</ol>
89
90<h2>See also</h2>
91<ol>
92<li><a href="{@docRoot}sdk/api_diff/20/changes.html">API
93Differences Report &raquo;</a> </li>
94</ol>
95
96</div>
97</div>
98
99<p>L is an upcoming release for the Android platform
100that offers new features for users and app developers. This document provides
101an introduction to the most notable new APIs.</p>
102
103<p>L is currently available as a <strong>developer preview</strong> intended
104for early adopters and testers. If you are interested in influencing the
105direction of the Android framework,
106<a href="{@docRoot}preview/setup-sdk.html">give the L Developer Preview a
107try</a> and send us your feedback!</p>
108
109<p class="caution"><strong>Caution:</strong>You should not publish apps
110using L Developer Preview to the Google Play store.</p>
111
112<h2 id="Behaviors">Important Behavior Changes</h2>
113
114<p>If you have previously published an app for Android, be aware that your app
115 might be affected by changes in L.</p>
116
117<h3 id="BehaviorNotifications">If your app implements notifications...</h3>
118
119<p>Notifications will be drawn with dark text atop white (or very light)
120backgrounds to match the new material design widgets. Make sure that all your
121notifications look right with the new color scheme. You should remove or update
122assets and text styles that involve color. The system will automatically invert
123action icons in notifications. Use
124{@code android.app.Notification.Builder.setColor()} to set an accent color
125in a circle behind your {@code Notification.icon} image.</p>
126
127<p>The system will ignore all non-alpha channels in action icons and the main
128notification icon, so you should assume that these icons will be alpha-only.
129</p>
130
131<p>If you are currently adding sounds and vibrations to your notifications by
132using the {@link android.media.Ringtone}, {@link android.media.MediaPlayer},
133or {@link android.os.Vibrator} classes, make sure to remove this code so that
134the system can present notifications correctly in Do not disturb mode. You
135should use the {@link android.app.Notification.Builder} methods instead to add
136sounds and vibration.
137</p>
138
139<h3 id="BehaviorMediaControl">If your app uses RemoteControlClient...</h3>
140
141<p>Lockscreens in L will not show transport controls for your
142{@link android.media.RemoteControlClient}. Instead, your app can provide
143media playback control from the lockscreen through a media notification. This
144gives your app more control over the presentation of media buttons, while
145providing a consistent experience for users across the lockscreen and
146the unlocked device.</p>
147
148<p>You must call {@code Notification.Builder.setVisibility(Notification.VISIBILITY_PUBLIC)} to mark your media notification as safe to reveal, even when the lockscreen is secured
149with a PIN, pattern, or password.</p>
150
151<h3 id="BehaviorFullscreen">If your app uses fullScreenIntent...</h3>
152
153<p>Notifications now appear in a small floating window if all these conditions
154are met: the user’s activity is in fullscreen mode, the screen is on, and the
155device is unlocked. If your app implements fullscreen activities, make sure that
156these heads-up notifications are presented correctly.</p>
157
158<h3 id="BehaviorGetRecentTasks">If your app uses ActivityManager.getRecentTasks()...</h3>
159
160<p>With the introduction of the new document tasks feature in L (see below),
161the {@code android.app.ActivityManager.getRecentTasks()} method is now
162deprecated to improve user privacy. For backwards
163compatibility, it will still return a small subset of its data including the
164calling application’s own tasks and possibly some other non-sensitive tasks
165such as home. If your app is using this method to retrieve its own tasks,
166use {@code android.app.ActivityManager.getAppTasks()} instead to retrieve that
167information.</p>
168
169<h2 id="UI">User Interface</h2>
170
171<h3 id="MaterialDesign">Material design support</h3>
172
173<p>L adds support for the material design style. You can create
174material design apps that are visually dynamic and have UI element transitions
175which feel natural and delightful to users. This support includes:</p>
176<ul>
177 <li>Material design theme
178 <li>View shadows
179 <li>{@code RecyclerView} widget
180 <li>Drawable animation and styling effects
181 <li>Material design animation and activity transitions effects
182 <li>Ability to define animators to run on the view, with
183{@code android.animation.StateListAnimator}.
184 <li>Ability to change your status bar color to match the action bar and other
185UI elements with {@code android.view.Window.setStatusBarColor()}.
186</ul>
187<p>To learn more about adding material design functionality to your app, see
188<a href="{@docRoot}preview/quantum/index.html">Material design on Android</a>.</p>
189
190<h3 id="LockscreenNotifications">Lockscreen notifications</h3>
191<p>Lockscreens in L Developer Preview have the ability to present notifications.
192User can choose via <em>Settings</em> whether to allow sensitive notification
193content to be shown over a secure lockscreen.</p>
194
195<p>Your app can control the level of detail visible when its notifications are
196displayed over the secure lockscreen.To control the visibility level, call
197{@code android.app.Notification.Builder.setVisibility()} and specify one of these
198values:</p>
199<ul>
200<li>{@code VISIBILITY_PRIVATE}. Shows basic information, such as the
201notification’s icon, but hides the notification’s full content. If you want to
202provide a redacted public version of your notification for the system to display
203on a secure lockscreen, set the public notification object in the publicVersion
204field.
205<li>{@code VISIBILITY_PUBLIC}. Shows the notification’s full content. This is
206 the system default if visibility is left unspecified.
207<li>{@code VISIBILITY_SECRET}. Shows only the most minimal information,
208excluding even the notification’s icon.
209</ul>
210
211<h3 id="NotificationsMetadata">Notifications metadata</h3>
212<p>The L Developer Preview uses metadata associated with your app notifications
213to more intelligently sort your notifications. The metadata you set also
214controls how the system presents your app notifications when the user is in Do
215not disturb mode. When constructing your notification, you can call the
216following methods in {@code android.app.Notification.Builder}:</p>
217
218<ul>
219<li>{@code setCategory()}. Allows the system to handle your app notifications
220in Do not disturb mode (for example, if your notification represents an
221incoming call, instant message, or alarm).
222<li>{@code setPriority()}. Notifications with the priority field set to
223{@code PRIORITY_MAX} or {@code PRIORITY_HIGH} will appear in a small floating
224window if the notification also has sound or vibration.
225<li>{@code addPerson()}. Allows you to add a list of people to a notification.
226Your app can use this to signal to the system that it should group together
227notifications from the specified people, or rank notifications from these
228people as being more important.
229</ul>
230
231<h3 id="Recents">Concurrent documents and activities in Recents screen</h3>
232
233<p>In previous releases, the
234<a href="{@docRoot}design/get-started/ui-overview.html">Recents screen</a>
235could only display a single task for each app that the user interacted with
236most recently. The L Developer Preview allows your app to open additional tasks
237for concurrent activities or documents. This feature facilitates multitasking
238by letting users quickly switch between individual activities and documents
239from the Recents screen. Examples of such concurrent tasks might include web
240pages in a browser app, documents in a productivity app, concurrent matches in
241a game, or chats in a messaging app. Your app can manage its tasks
242through the {@code android.app.ActivityManager.AppTask} class.</p>
243
244<p>To insert a logical break so that the system treats your activity as a new
245document, use {@code android.content.Intent.FLAG_ACTIVITY_NEW_DOCUMENT} when
246launching the activity with {@link android.app.Activity#startActivity(android.content.Intent) startActivity()}. You can also get this behavior by declaring the
247<a href="{@docRoot}guide/topics/manifest/activity-element.html">&lt;activity&gt;</a>
248attribute {@code documentLaunchMode="intoExisting"} or {@code ="always"} in your
249manifest.</p>
250
251<p>You can also mark that a task should be removed from the Recents screen
252when all its activities are closed by using {@code android.content.Intent.FLAG_ACTIVITY_AUTO_REMOVE_FROM_RECENTS} when starting the root activity for
253the task. You can also set this behavior for an activity by declaring the
254<a href="{@docRoot}guide/topics/manifest/activity-element.html">&lt;activity&gt;</a>
255attribute {@code autoRemoveFromRecents=“true”} in your manifest.</p>
256
257<p>To avoid cluttering the Recents screen, you can set the maximum number of
258tasks from your app that can appear in the Recents screen through the
259<a href="{@docRoot}guide/topics/manifest/application-element.html">&lt;application&gt;</a> attribute {@code android:maxRecent}. The current maximum that can be specified
260is 100 tasks per user.</a></p>
261
262<h3 id="WebView">WebView updates</h3>
263<p>The L Developer Preview updates the {@link android.webkit.WebView}
264implementation to Chromium M36, bringing security and stability enhancements,
265as well as bug fixes. The default user-agent string for a
266{@link android.webkit.WebView} running on the L Developer Preview has
267been updated to incorporate 36.0.0.0 as the version number.</p>
268
269<p>Additionally, this release brings support for the
270<a href="https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html">WebAudio</a>, <a href="https://www.khronos.org/webgl/">WebGL</a>, and
271<a href="http://www.webrtc.org/">WebRTC</a> open standards. To learn more about
272the new features included in this release, see <a href="https://developer.chrome.com/multidevice/webview/overview">WebView for Android</a>.</p>
273
274<h2 id="UserInput">User Input</h2>
275
276<h3 id="IME">IME bug fixes and improvements</h3>
277
278<p>Beginning in the L Developer Preview, users can more easily switch between
279all input method editors (IME) <a href="{@docRoot}guide/topics/text/creating-input-method.html">supported by the platform</a>. Performing the designated
280switching action (usually touching a Globe icon on the soft keyboard) will cycle
281among all such IMEs. This change takes place in
282{@code android.view.inputmethod.InputMethodManager.shouldOfferSwitchingToNextInputMethod()}.</p>
283
284<p>In addition, the framework will now check whether the next IME includes a
285switching mechanism at all, thus supporting switching to the IME after it. An
286IME with a switching mechanism will not cycle to an IME without one. This
287change takes place in
288{@code android.view.inputmethod.InputMethodManager.switchToNextInputMethod()}.
289
290<p>To see an example of how to use the updated IME-switching APIs, refer to the
291updated soft-keyboard implementation sample in this release.</p>
292
293<h2 id="Animations">Animation &amp; Graphics</h2>
294
295<h3 id="OpenGLES-3-1">Support for OpenGL ES 3.1</h3>
296<p>The L Developer Preview adds Java interfaces and native support for OpenGL
297ES 3.1. Key new functionality provided in OpenGL ES 3.1 includes:</p>
298
299<ul>
300<li>Compute shaders
301<li>Separate shader objects
302<li>Indirect draw commands
303<li>Enhanced texturing functionality
304<li>Shading language improvements
305<li>Optional extensions for per-sample shading, advanced blending modes, and more
306<li>Backward compatibility with OpenGL ES 2.0 and 3.0
307</ul>
308
309<p>The Java interface for OpenGL ES 3.1 on Android is provided with GLES31. When using OpenGL ES 3.1, be sure that you declare it in your manifest file with the
310<a href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code &lt;uses-feature&gt;}</a> tag and the {@code android:glEsVversion} attribute. For example:</p>
311
312<pre>
313&lt;manifest&gt;
314 &lt;uses-feature android:glEsVersion="0x00030001" /&gt;
315 ...
316&lt;/manifest&gt;
317</pre>
318
319<p>For more information about using OpenGL ES, including how to check the device’s supported OpenGL ES version at runtime, see the <a href="{@docRoot}/guide/topics/graphics/opengl.html">OpenGL ES API guide</a>.</p>
320
321<h2 id="Multimedia">Multimedia</h2>
322
323<h3 id="Camera=v2">Camera v2 API</h3>
324
325<p>The L Developer Preview introduces the new {@code android.hardware.camera2}
326API to facilitate fine grain photo capture and image processing. You can now programmatically access the camera devices available to the system with {@code CameraManager.getCameraIdList()} and connect to a specific device with {@code CameraManager.openCamera()}. To start capturing images, you
327need to create a {@code CameraCaptureSession} and specify the
328{@link android.view.Surface} objects to send the captured images. The {@code CameraCaptureSession} can be configured to take single shots or multiple images
329in a burst.</p>
330
331<p>To be notified when new images are captured, implement the
332{@code CameraCaptureSession.CaptureListener()} interface and set it in your
333capture request. Now when the system completes the image capture request, your
334{@code CameraCaptureSession.CaptureListener()} receives a call to
335{@code onCaptureCompleted()}, providing you with the image capture metadata in a
336{@code CaptureResult}.</p>
337
338<h3 id="AudioPlayback">Audio playback</h3>
339<p>This release includes the following changes for
340 {@code android.media.AudioTrack}:</p>
341<ul>
342 <li>Your app can now supply audio data in floating-point format
343({@code android.media.AudioFormat.ENCODING_PCM_FLOAT}). This permits greater
344dynamic range, more consistent precision, and greater headroom. Floating-point arithmetic is especially useful during intermediate calculations. Playback
345end-points use integer format for audio data, and with lower bit-depth. In L
346Developer Preview, portions of the internal pipeline are not yet floating-point.
347 <li>Your app can now supply audio data as a {@code ByteBuffer}, in the same
348format as provided by {@code MediaCodec}.
349 <li>The {@code WRITE_NON_BLOCKING} option can simplify buffering and
350 multithreading for some apps.
351</ul>
352
353<h3 id="MediaPlaybackControl">Media playback control</h3>
354<p>You can now build your own media controller app with the new
355{@code android.media.session.MediaController} class, which provides
356simplified transport controls APIs that replace those in
357{@code android.media.RemoteControlClient}. The {@code MediaController} class
358allows thread-safe control of playback from a non UI process, making it easier
359to control your media playback service from your app’s user interface.
360
361<p>You can also create multiple controllers to send playback commands,
362media keys, and other events to the same ongoing
363{@code android.media.session.MediaSession}. When you add a controller, you must
364call {@code MediaSession.getSessionToken()} to request an access
365token in order for your app to interact with the session.</p>
366
367<p>Send transport commands such as "play", "stop", "skip", and
368"set rating" by using {@code MediaController.TransportControls}. To handle
369in-bound media transport commands from controllers attached to the session, you
370should override the callback methods in
371{@code MediaSession.TransportControlsCallback}.</p>
372
373<p>You can also create rich notifications that allow playback control tied to a
374media session with the new {@code android.app.Notification.MediaStyle} class.</p>
375
376<h2 id="Storage">Storage</h2>
377
378<h3 id="DirectorySelection">Directory selection</h3>
379
380<p>The L Developer Preview extends the <a href="{@docRoot}guide/topics/providers/document-provider.html">Storage Access Framework</a> to let users
381select an entire directory, rather than individual files, to give your app
382read/write access to media files. When a directory is selected, your app also
383has access to all its child directories and content.</p>
384
385<p>To get the absolute paths to directories on external storage devices where
386applications can store media files, call the
387{@code android.content.Context.getExternalMediaDirs()} method. No additional
388permissions are needed by your app to read or write to the returned paths.
389External storage devices here are those considered by the system to be a
390permanent part of the device, and includes emulated external storage and
391physical media slots such as SD cards in battery compartments.</p>
392
393<p>If you want to access a document in an existing directory, call the
394{@code android.provider.DocumentsContract.buildDocumentViaUri()} method and pass
395in a Uri representing the path to the parent directory and the target document
396ID. The method returns a new {@link android.net.Uri} with which your app can
397use to write media content with {@code DocumentsContract.createDocument()}.
398
399<h2 id="Wireless">Wireless &amp; Connectivity</h2>
400
401<h3 id="Multinetwork">Dynamic network selection and seamless handoff</h3>
402<p>The L Developer Preview provides new multi-networking APIs for your app to
403dynamically scan for available networks with specific capabilities, and
404establish a connection to them. This is useful when your app requires a
405specialized network, such as an SUPL, MMS, or carrier-billing network, or if
406you want to send data using a particular type of transport protocol.</p>
407
408<p>To select and connect to a network dynamically from your app, first
409instantiate a {@code android.net.ConnectivityManager}. Next, create a
410{@code android.net.NetworkRequest} to specify the network features and transport
411type your app is interested in. To start scanning for suitable networks, call
412{@code ConnectivityManager.requestNetwork()} or
413{@code ConnectivityManager.registerNetworkCallback(), and pass in the
414{@code NetworkRequest} object and an implementation of
415{@code ConnectivityManager.NetworkCallbackListener}.</p>
416
417<p>When the system detects a suitable network, it connects to the network and
418invokes the {@code NetworkCallbackListener.onAvailable()} callback. You can use
419the {@code android.net.Network} object from the callback to get additional
420information about the network, or to establish a socket connection.</p>
421
422<h3 id="BluetoothBroadcasting">Bluetooth broadcasting</h3>
423<p>Android 4.3 introduced platform support for <a href="{@docRoot}guide/topics/connectivity/bluetooth-le.html">Bluetooth Low Energy</a>
424(BLE) in the central role. In the L Developer Preview, an Android device can now
425act as a Bluetooth LE <em>peripheral device</em> and make its presence known to
426nearby devices. For instance, you can build apps that allow a device to
427function as a pedometer or health monitor and communicate its data with another
428BLE device.</p>
429
430<p>The new {@code android.bluetooth.le} APIs enable your apps to broadcast advertisements, scan for responses, and form connections with nearby BLE devices.
431You must add the {@code android.permission.BLUETOOTH_ADMIN} permission in your
432manifest in order for your app to use the new advertising and scanning features.</a>
433
434<p>To begin Bluetooth LE advertising so that other devices can discover the
435device running your app, call {@code android.bluetooth.le.BluetoothAdvertiser.startAdvisertising()} and pass in an implementation of the
436{@code android.bluetooth.le.AdvertiseCallback} class to report the success
437or failure of the advertising operation.</p>
438
439<p>Conversely, if you want to scan for Bluetooth LE devices nearby, call
440{@code android.bluetooth.le.BluetoothLeScanner.startScan()} and pass in an
441implementation of {@code android.bluetooth.le.ScanCallback} to report if a
442Bluetooth LE advertisement is found. Optionally, you can pass in filters to scan
443for a specific type of device.</p>
444
445<h3 id="NFCEnhancements">NFC enhancements</h3>
446<p>The L Developer Preview adds these enhancements to enable wider and more
447flexible use of NFC:</p>
448
449<ul>
450<li>Android Beam is now available in the share menu.
451<li>Your app can invoke the Android Beam on the user’s device to share data by
452calling {@code android.nfc.NfcAdapter.invokeBeam()}. This avoids the need for
453the user to manually tap the device against another NFC-capable device to
454complete the data transfer.
455<li>Use the new {@code android.nfc.NdefRecord.createTextRecord()} method if
456 you want to create an NDEF record containing UTF-8 text data.
457<li>If you are developing a payment app, you now have the ability to
458register an NFC application ID (AID) dynamically by calling
459{@code android.nfc.cardemulation.CardEmulation.registerAidsForService()}.
460You can also use {@code android.nfc.cardemulation.CardEmulation.setPreferredService()}
461to set the preferred card emulation service that should be used when a specific
462activity is in the foreground.
463</ul>
464
465<h2 id="Power">Power Efficiency</h2>
466
467<h3 id="JobScheduler">Scheduling jobs</h3>
468<p>The L Developer Preview provides a new {@code android.app.job.JobScheduler}
469API that lets you define jobs for the system to run asynchronously at a later
470time that optimizes battery life, such as when the device is charging. This is
471useful when you want to defer non user-facing units of work, have application
472code that accesses the network, or want to run a number of tasks as a batch on
473a regular schedule.</p>
474
475<p>A {@code android.app.job.JobInfo} object encapsulates such a unit of work,
476and provides an exact description of the criteria you are scheduling.</p>
477
478<p>Use the {@code android.app.job.JobInfo.Builder} to configure how the
479scheduled task should run. You can schedule the task to run under specific
480conditions such as only while the device is charging, when connected to an
481unmetered network, or when the system deems the device is idle.</p>
482
483<p>For example, you can add code like this to run your task on an
484unmetered network:</p>
485
486<pre>
487JobInfo uploadTask = new JobInfo.Builder(mJobId, mServiceComponent)
488 .setRequiredNetworkCapabilities(JobInfo.NetworkType.UNMETERED)
489 .build();
490
491JobScheduler jobScheduler =
492 (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE)
493jobScheduler.schedule(uploadTask);
494</pre>
495
496<h3 id="PowerMeasurementTools">Developer tools and APIs for power measurement</h3>
497<p>The L Developer Preview provides several new developer tools and APIs to help
498you better measure and understand your app's power usage.</p>
499
500<dl>
501<dt><strong>batterystats</strong></dt>
502<dd>
503<p>The {@code dumpsys batterystats} command allows you to generate interesting
504statistical data about battery usage on a device, organized by unique user ID
505(UID). The statistics generated by the tool include:</p>
506
507<ul>
508<li>History of battery related events
509<li>Global statistics for the device
510<li>Approximated power use per UID and system component
511<li>Per-app mobile ms per packet
512<li>System UID aggregated statistics
513<li>App UID aggregated statistics
514</ul>
515
516<p>Use the {@code --help} option to learn about the various options that you
517can apply for tailoring the output. For example, to run the tool to print
518battery usage statistics since the device was last charged for a given app
519package, run this command:
520<pre>
521$ adb shell dumpsys batterystats --charged <package-name>
522</pre>
523</dd>
524
525<dt><strong>Battery Historian</strong></dt>
526<dd>
527<p>The Battery Historian tool ({@code historian.par}) analyzes L-based Android
528bug reports and creates an HTML visualization of power-related events. It can
529also visualize power consumption data from a power monitor, and will attempt to
530map power usage to the wakelocks seen. You can find the Battery Historian tool
531in {@code &lt;sdk&gt;/tools}.</p>
532
533<p>For best results, you should first enable full wakelock reporting to allow
534the Battery Historian tool to monitor uninterrupted over an extended period of
535time:</p>
536<pre>
537$ adb shell dumpsys batterystats --enable full-wake-history
538</pre>
539
540<p>You should also reset battery statistics at the beginning of a
541measurement:</p>
542<pre>
543$ adb shell dumpsys batterystats --reset
544</pre>
545
546<p>To generate an HTML visualization:</p>
547<pre>
548$ historian.par [-p powerfile] bugreport.txt > out.html
549</pre>
550</dd>
551
552<dt><strong>On-device power management</strong></dt>
553<dd>
554<p>You can use the {@code android.os.BatteryManager} API to obtain power
555consumption information based on the battery fuel gauge included in Android
556phones and tablets. This is useful in cases when it is not convenient to
557connect external measurement equipment to the Android device.</p>
558<p>To retrieve the battery properties, call {@code BatteryManager.getIntProperty()}
559or {@code BatteryManager.getLongProperty()}. The properties available, the
560exact resolution of the values of each, and other characteristics such as
561update frequency depend on the particular device being tested.</p>
562
563<p>The following properties can be inspected on all Android devices:</p>
564
565<table>
566 <tr>
567 <th>Property</th>
568 <th>Description</th>
569 </tr>
570 <tr>
571 <td>{@code BatteryManager.BATTERY_PROPERTY_CHARGE_COUNTER}</td>
572 <td>Remaining battery capacity in microampere-hours.</td>
573 </tr>
574 <tr>
575 <td>{@code BatteryManager.BATTERY_PROPERTY_CURRENT_NOW}</td>
576 <td>Instantaneous battery current in microamperes.</td>
577 </tr>
578 <tr>
579 <td>{@code BatteryManager.BATTERY_PROPERTY_CURRENT_AVERAGE}</td>
580 <td>Average battery current in microamperes</td>
581 </tr>
582 <tr>
583 <td>{@code BatteryManager.BATTERY_PROPERTY_CAPACITY}</td>
584 <td>Remaining battery capacity as an integer percentage.</td>
585 </tr>
586 <tr>
587 <td>{@code BatteryManager.BATTERY_PROPERTY_ENERGY_COUNTER}</td>
588 <td>Remaining energy in nanowatt-hours.</td>
589 </tr>
590</table>
591<dd>
592</dl>
593
594<h2 id="Enterprise">Enterprise</h2>
595<h3 id="ManagedProvisioning">Managed provisioning</h3>
596
597<p>The L Developer Preview provides new functionality for running apps within
598an enterprise environment:</p>
599<ul>
600<li><strong>Create managed user profiles</strong>. A device administrator can
601initiate a managed provisioning process to enroll a user device with an
602existing personal account into a co-present but separate managed profile that
603the administrator controls.
604<li><strong>Set device owner scope</strong>. Device administrators can also
605apply managed provisioning to configure a device that has no previous user
606accounts installed, so that they have full control over the device.
607</ul>
608
609<p>To start the manged provisioning process, send
610{@code ACTION_PROVISION_MANAGED_PROFILE} in an {@link android.content.Intent}. A
611user may be associated with more than one managed profile. To get a list of the
612managed profiles associated with the user, call
613{@code android.os.UserManager.getUserProfiles()}.</p>
614
615<p>Once a managed profile is created for a user, apps that are managed by the
616device administrator will appear alongside non-managed apps in the user’s
617Launcher, Recent apps screen, and notifications. A device policy management app
618can make the managed apps visually prominent by appending a “work” badge to the
619icon drawable with {@code android.os.UserManager.getBadgeDrawableForUser()}.</p>
620
621<p>If you are developing a Launcher app, you can use the new {@code android.content.pm.LauncherApps} class to get a list of launchable activities for the current user
622and any associated managed profiles.</p>
623
624<h2 id="Printing">Printing Framework</h2>
625
626<h3 id="PDFRender">Render PDF as bitmap</h3>
627<p>You can now render PDF document pages into bitmap images for printing by
628using the new {@code android.graphics.pdf.PdfRenderer} class. You must specify a
629{@code ParcelFileDescriptor} that is seekable (that is, the file can be randomly
630accessed) on which the system writes the the printable content. Your app can
631obtain a page for rendering with {@code openPage()}, then call {@code render()}
632to turn the opened {@code PdfRenderer.Page} into a bitmap. You can also set
633additional parameters if you only wan to convert a portion of the document into
634a bitmap image (for example, to implement <a href="http://en.wikipedia.org/wiki/Tiled_rendering">tile rendering</a> in order to zoom in on the document).</p>
635
636<h2 id="TestingA11y">Testing &amp; Accessibility </h2>
637
638<h3 id="Testing A11yImprovements">Testing and accessibility improvements</h3>
639<p>The L Developer Preview adds the following support for testing and
640accessibility:</p>
641
642<ul>
643<li>You can use the new {@code android.app.UiAutomation.getWindowAnimationFrameStats()}
644and {@code android.app.UiAutomation.getWindowContentFrameStats()} methods to
645capture frame statistics for window animations and content. This lets you
646write instrumentation tests to evaluate if the app under test is rendering
647frames at a sufficient refresh frequency to provide a smooth user experience.
648<li>You can execute shell commands from your instrumentation test with the new
649{@code android.app.UiAutomation.executeShellCommand()}. The command execution
650is similar to running 'adb shell' from a host connected to the device. This
651allows you to use shell based tools such as {@code dumpsys}, {@code am},
652{@code content}, and {@code pm}.
653<li>Accessibility services and test tools that use the accessibility APIs
654(such as <a href="{@docRoot}tools/help/uiautomator/index.html">UiAutomator</a>)
655can now retrieve detailed information about the properties of windows on the
656screen that sighted users can interact with. To retrieve a list of
657{@code android.view.accessibility.AccessibilityWindowInfo} representing the
658windows information, call the new
659{@code android.accessibilityservice.AccessibilityService.getWindows()} method.
660<li>You can use the new {@code android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction} to define standard or customized
661actions to perform on an {@code android.view.accessibility.AccessibilityNodeInfo}.
662The new {@code AccessibilityAction} class replaces the actions-related APIs
663previously found in {@code AccessibilityNodeInfo}.
664</ul>
665
666<h2 id="manifest">Manifest Declarations</h2>
667
668<h3 id="ManifestFeatures">Declarable required features</h3>
669<p>The following values are now supported in the <a href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code &lt;uses-feature&gt;}</a> element so you
670can ensure that your app is installed only on devices that provide the features
671your app needs.</p>
672
673<ul>
674<li>{@code FEATURE_LEANBACK}. Declares that your app must be installed only on devices that support the <a href="{@docRoot}tv}">Android TV</a> user interface. Example:
675<pre>
676&lt;uses-feature android:name="android.software.leanback"
677 android:required="true" /&gt;
678</pre>
679
680<li>{@code FEATURE_MANAGEDPROFILES}. Declares that your app must only be installed on devices that support managed profiles for enterprise users. Example:
681<pre>
682&lt;uses-feature android:name="android.software.managedprofiles"
683 android:required="true" /&gt;
684</pre>
685<li>{@code FEATURE_WEBVIEW}. Declares that your app must only be installed on devices that fully implement the android.webkit.* APIs. Example:
686<pre>
687&lt;uses-feature android:name="android.software.webview"
688 android:required="true" /&gt;
689</pre>
690</ul>
691
692<h3 id="ManifestPermissions">User permissions</h3>
693<p>The following values are now supported in the <a href="{@docRoot}guide/topics/manifest/uses-permission-element.html">{@code &lt;uses-permission&gt;}</a> to declare the
694permissions your app requires in order to access certain APIs.
695
696<ul>
697<li>{@code SIM_COMMUNICATION}. Required to communicate with a SIM card using
698 logical channels.
699</ul>