| page.title=Android 5.0 APIs | |
| excludeFromSuggestions=true | |
| sdk.platform.version=5.0 | |
| sdk.platform.apiLevel=21 | |
| @jd:body | |
| <div id="qv-wrapper"> | |
| <div id="qv"> | |
| <h2>In this document | |
| <a href="#" onclick="hideNestedItems('#toc44',this);return false;" class="header-toggle"> | |
| <span class="more">show more</span> | |
| <span class="less" style="display:none">show less</span></a></h2> | |
| <ol id="toc44" class="hide-nested"> | |
| <li><a href="#ApiLevel">Update your target API level</a></li> | |
| <li><a href="#UI">User Interface</a> | |
| <ol> | |
| <li><a href="#MaterialDesign">Material design support</a></li> | |
| <li><a href="#Recents">Concurrent documents and activities in the recents screen</a></li> | |
| <li><a href="#WebView">WebView updates</a></li> | |
| <li><a href="#ScreenCapture">Screen capturing and sharing</a></li> | |
| </ol> | |
| </li> | |
| <li><a href="#Notifications">Notifications</a> | |
| <ol> | |
| <li><a href="#LockscreenNotifications">Lock screen notifications</a></li> | |
| <li><a href="#NotificationsMetadata">Notifications metadata</a></li> | |
| </ol> | |
| </li> | |
| <li><a href="#Graphics">Graphics</a> | |
| <ol> | |
| <li><a href="#OpenGLES-3-1">Support for OpenGL ES 3.1</a></li> | |
| <li><a href="#AndroidExtensionPack">Android Extension Pack</a></li> | |
| </ol> | |
| </li> | |
| <li><a href="#Media">Media</a> | |
| <ol> | |
| <li><a href="#Camera-v2">Camera API for advanced camera capabilities</a></li> | |
| <li><a href="#AudioPlayback">Audio playback</a></li> | |
| <li><a href="#MediaPlaybackControl">Media playback control</a></li> | |
| <li><a href="#MediaBrowsing">Media browsing</a></li> | |
| </ol> | |
| </li> | |
| <li><a href="#Storage">Storage</a> | |
| <ol> | |
| <li><a href="#DirectorySelection">Directory selection</a></li> | |
| </ol> | |
| </li> | |
| <li><a href="#Wireless">Wireless and Connectivity</a> | |
| <ol> | |
| <li><a href="#Multinetwork">Multiple network connections</a></li> | |
| <li><a href="#BluetoothBroadcasting">Bluetooth broadcasting</a></li> | |
| <li><a href="#NFCEnhancements">NFC enhancements</a></li> | |
| </ol> | |
| </li> | |
| <li><a href="#Power">Project Volta</a> | |
| <ol> | |
| <li><a href="#JobScheduler">Scheduling jobs</a></li> | |
| <li><a href="#PowerMeasurementTools">Developer tools for battery usage</a> | |
| </ol> | |
| </li> | |
| <li><a href="#Enterprise">Android in the Workplace and in Education</a> | |
| <ol> | |
| <li><a href="#ManagedProvisioning">Managed provisioning</a></li> | |
| <li><a href="#DeviceOwner">Device owner</a></li> | |
| <li><a href="#ScreenPinning">Screen pinning</a></li> | |
| </ol> | |
| </li> | |
| <li><a href="#System">System</a> | |
| <ol> | |
| <li><a href="#AppUsageStatistics">App usage statistics</a></li> | |
| </ol> | |
| </li> | |
| <li><a href="#Printing">Printing Framework</a> | |
| <ol> | |
| <li><a href="#PDFRender">Render PDF as bitmap</a></li> | |
| </ol> | |
| </li> | |
| <li><a href="#TestingA11y">Testing & Accessibility</a> | |
| <ol> | |
| <li><a href="#TestingA11yImprovements">Testing and accessibility improvements</a></li> | |
| </ol> | |
| </li> | |
| <li><a href="#IME">IME</a> | |
| <ol> | |
| <li><a href="#Switching">Easier switching between input languages</a></li> | |
| </ol> | |
| </li> | |
| <li><a href="#Manifest">Manifest Declarations</a> | |
| <ol> | |
| <li><a href="#ManifestFeatures">Declarable required features</a></li> | |
| <li><a href="#Permissions">User permissions</a></li> | |
| </ol> | |
| </li> | |
| </ol> | |
| <h2>API Differences</h2> | |
| <ol> | |
| <li><a href="{@docRoot}sdk/api_diff/21/changes.html">API level 20 to 21 »</a> </li> | |
| </ol> | |
| <h2>See Also</h2> | |
| <ol> | |
| <li><a href="{@docRoot}about/versions/android-5.0-changes.html">Android 5.0 Behavior Changes</a> </li> | |
| <li><a href="{@docRoot}about/versions/lollipop.html">Android Lollipop Highlights</a> </li> | |
| </ol> | |
| </div> | |
| </div> | |
| <p>API Level: {@sdkPlatformApiLevel}</p> | |
| <p>Android 5.0 (<a href="{@docRoot}reference/android/os/Build.VERSION_CODES.html#LOLLIPOP">LOLLIPOP</a>) | |
| offers new features for users and app developers. This document provides an | |
| introduction to the most notable new APIs.</p> | |
| <p> | |
| If you have a published app, make sure to check out the <a href= | |
| "{@docRoot}about/versions/android-5.0-changes.html">Android 5.0 Behavior | |
| Changes</a> that you should account for in your app. These behavior changes | |
| may affect your app on Android 5.0 devices, even if you are not using new APIs | |
| or targeting new functionality. | |
| </p> | |
| <p>For a high-level look at the new platform features, instead | |
| see the | |
| <a href="{@docRoot}about/versions/lollipop.html">Android Lollipop | |
| highlights</a>.</p> | |
| <h3 id="Start">Start developing</h3> | |
| <p>To start building apps for Android 5.0, you must first <a href="{@docRoot}studio/index.html">get | |
| the Android SDK</a>. Then use the <a href="{@docRoot}tools/help/sdk-manager.html">SDK Manager</a> | |
| to download the Android 5.0 SDK Platform and System Images.</p> | |
| <h3 id="ApiLevel">Update your target API level</h3> | |
| <p>To better optimize your app for devices running Android {@sdkPlatformVersion}, | |
| set your <a | |
| href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code targetSdkVersion}</a> to | |
| <code>"{@sdkPlatformApiLevel}"</code>, install your app on an Android | |
| {@sdkPlatformVersion} system image, test it, then publish the updated app with | |
| this change.</p> | |
| <p>You can use Android {@sdkPlatformVersion} APIs while also supporting older | |
| versions by adding conditions to your code that check for the system API level | |
| before executing APIs not supported by your <a | |
| href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code minSdkVersion}</a>. | |
| To learn more about maintaining backward compatibility, read <a | |
| href="{@docRoot}training/basics/supporting-devices/platforms.html">Supporting | |
| Different Platform Versions</a>.</p> | |
| <p>For more information about how API levels work, read <a | |
| href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#ApiLevels">What is API | |
| Level?</a></p> | |
| <h3 id="Behaviors">Important behavior changes</h3> | |
| <p>If you have previously published an app for Android, be aware that your app might be affected by changes in Android 5.0.</p> | |
| <p>Please see <a href="{@docRoot}about/versions/android-5.0-changes.html">Android 5.0 Changes</a> for complete information.</p> | |
| <h2 id="UI">User Interface</h2> | |
| <h3 id="MaterialDesign">Material design support</h3> | |
| <p>Android 5.0 adds support for Android's new <em>material design</em> | |
| style. You can create apps with material design that are visually dynamic and | |
| have UI element transitions that feel natural to users. This support includes:</p> | |
| <ul> | |
| <li>The material theme</li> | |
| <li>View shadows</li> | |
| <li>The {@link android.support.v7.widget.RecyclerView} widget</li> | |
| <li>Drawable animation and styling effects</li> | |
| <li>Material design animation and activity transition effects</li> | |
| <li>Animators for view properties based on the state of the view</li> | |
| <li>Customizable UI widgets and app bars with color palettes that you control</li> | |
| <li>Animated and non-animated drawables based on XML vector graphics</li> | |
| </ul> | |
| <p>To learn more about adding material design functionality to your app, see | |
| <a href="{@docRoot}training/material/index.html">Material Design</a>.</p> | |
| <h3 id="Recents">Concurrent documents and activities in the recents screen</h3> | |
| <p>In previous releases, the | |
| <a href="{@docRoot}guide/components/recents.html">recents screen</a> | |
| could only display only one task for each app that the user interacted with | |
| most recently. Now your app can open more tasks as needed for additional | |
| concurrent activities for documents. This feature facilitates multitasking by | |
| letting users quickly switch between individual activities and documents from | |
| the recents screen, with a consistent switching experience across all apps. | |
| Examples of such concurrent tasks might include open tabs in a web | |
| browser app, documents in a productivity app, concurrent matches in | |
| a game, or chats in a messaging app. Your app can manage its tasks | |
| through the {@link android.app.ActivityManager.AppTask} class.</p> | |
| <p>To insert a logical break so that the system treats your activity as a new | |
| task, use {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT} when | |
| launching the activity with {@link android.app.Activity#startActivity(android.content.Intent) | |
| startActivity()}. You can also get this behavior by setting the | |
| <a href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a> | |
| element's {@code documentLaunchMode} attribute to {@code "intoExisting"} or | |
| {@code "always"} in your manifest.</p> | |
| <p>To avoid cluttering the recents screen, you can set the maximum number of | |
| tasks from your app that can appear in that screen. To do this, set the | |
| <a href="{@docRoot}guide/topics/manifest/application-element.html"><application></a> | |
| attribute {@link android.R.attr#maxRecents android:maxRecents}. The current | |
| maximum that can be specified is 50 tasks per user (25 for low RAM devices).</a></p> | |
| <p>Tasks in the recents screen can be set to persist across reboots. To control | |
| the persistence behavior, use the | |
| <a href="{@docRoot}reference/android/R.attr.html#persistableMode">android:persistableMode</a> | |
| attribute. You can also change | |
| the visual properties of an activity in the recents screen, such as the | |
| activity’s color, label, and icon, by calling the | |
| {@link android.app.Activity#setTaskDescription(android.app.ActivityManager.TaskDescription) setTaskDescription()} | |
| method.</p> | |
| <h3 id="WebView">WebView updates</h3> | |
| <p>Android 5.0 updates the {@link android.webkit.WebView} | |
| implementation to Chromium M37, bringing security and stability enhancements, | |
| as well as bug fixes. The default user-agent string for a | |
| {@link android.webkit.WebView} running on Android 5.0 has | |
| been updated to incorporate 37.0.0.0 as the version number.</p> | |
| <p>This release introduces the {@link android.webkit.PermissionRequest} class, | |
| which allows your app to grant the {@link android.webkit.WebView} permission | |
| to access protected resources like the camera and microphone, through web APIs | |
| such as <a href="https://developer.mozilla.org/en-US/docs/NavigatorUserMedia.getUserMedia" | |
| class="external-link">getUserMedia()</a>. Your app must have the appropriate | |
| Android permissions for these resources in order to grant the permissions to the | |
| {@link android.webkit.WebView}.</p> | |
| <p>With the new <code><a href="{@docRoot}reference/android/webkit/WebChromeClient.html#onShowFileChooser(android.webkit.WebView, android.webkit.ValueCallback<android.net.Uri[]>, android.webkit.WebChromeClient.FileChooserParams)">onShowFileChooser()</a></code> method, | |
| you can now use an input form field in the {@link android.webkit.WebView}, | |
| and launch a file chooser to select images and files from the Android device.</p> | |
| <p>Additionally, this release brings support for the | |
| <a href="http://webaudio.github.io/web-audio-api/" class="external-link">WebAudio</a>, | |
| <a href="https://www.khronos.org/webgl/" class="external-link">WebGL</a>, and | |
| <a href="http://www.webrtc.org/" class="external-link">WebRTC</a> open standards. | |
| To learn more about the new features included in this release, see | |
| <a href="https://developer.chrome.com/multidevice/webview/overview" | |
| class="external-link">WebView for Android</a>.</p> | |
| <h3 id="ScreenCapture">Screen capturing and sharing</h3> | |
| <p>Android 5.0 lets you add screen capturing and screen sharing capabilities to | |
| your app with the new {@link android.media.projection} APIs. This functionality | |
| is useful, for example, if you want to enable screen sharing in a video | |
| conferencing app.</p> | |
| <p>The new {@link android.media.projection.MediaProjection#createVirtualDisplay(java.lang.String, int, int, int, int, android.view.Surface, android.hardware.display.VirtualDisplay.Callback, android.os.Handler) createVirtualDisplay()} method | |
| allows your app to capture the contents of the main screen (the default | |
| display) into a {@link android.view.Surface} object, which your app can then | |
| send across the network. The API only allows capturing non-secure screen | |
| content, and not system audio. To begin screen capturing, your app must first | |
| request the user’s permission by launching a screen capture dialog using an | |
| {@link android.content.Intent} obtained through the | |
| {@link android.media.projection.MediaProjectionManager#createScreenCaptureIntent()} | |
| method.</p> | |
| <p>For an example of how to use the new APIs, see the {@code MediaProjectionDemo} | |
| class in the sample project.</p> | |
| <h2 id="Notifications">Notifications</h2> | |
| <h3 id="LockscreenNotifications">Lock screen notifications</h3> | |
| <p>Lock screens in Android 5.0 have the ability to present | |
| notifications. Users can choose via <em>Settings</em> whether to allow | |
| sensitive notification content to be shown over a secure lock screen.</p> | |
| <p>Your app can control the level of detail visible when its notifications are | |
| displayed over the secure lock screen. To control the visibility level, call | |
| {@link android.app.Notification.Builder#setVisibility(int) setVisibility()} and | |
| specify one of these values:</p> | |
| <ul> | |
| <li>{@link android.app.Notification#VISIBILITY_PRIVATE VISIBILITY_PRIVATE}: | |
| Shows basic information, such as the notification’s icon, but hides the | |
| notification’s full content.</li> | |
| <li>{@link android.app.Notification#VISIBILITY_PUBLIC VISIBILITY_PUBLIC}: | |
| Shows the notification’s full content.</li> | |
| <li>{@link android.app.Notification#VISIBILITY_SECRET VISIBILITY_SECRET}: | |
| Shows nothing, excluding even the notification’s icon.</li> | |
| </ul> | |
| <p>When the visibility level is {@link android.app.Notification#VISIBILITY_PRIVATE VISIBILITY_PRIVATE}, | |
| you can also provide a redacted version of the notification | |
| content that hides personal details. For example, an SMS app might display a | |
| notification that shows "You have 3 new text messages" but hides the message | |
| content and senders. To provide this alternative notification, first create the | |
| replacement notification using {@link android.app.Notification.Builder}. When | |
| you create the private notification object, attach the replacement notification | |
| to it through the | |
| {@link android.app.Notification.Builder#setPublicVersion(android.app.Notification) | |
| setPublicVersion()} method.</p> | |
| <h3 id="NotificationsMetadata">Notifications metadata</h3> | |
| <p>Android 5.0 uses metadata associated with your app notifications | |
| to sort the notifications more intelligently. To set the metadata, call the | |
| following methods in {@link android.app.Notification.Builder} when you | |
| construct the notification:</p> | |
| <ul> | |
| <li>{@link android.app.Notification.Builder#setCategory(java.lang.String) | |
| setCategory()}: Tells the system how to handle your app notifications when the | |
| device is in <em>priority</em> mode (for example, if a notification represents an | |
| incoming call, instant message, or alarm). | |
| <li>{@link android.app.Notification.Builder#setPriority(int) setPriority()}: | |
| Marks the notification as more or less important than normal notifications. | |
| Notifications with the priority field set to | |
| {@link android.app.Notification#PRIORITY_MAX PRIORITY_MAX} or | |
| {@link android.app.Notification#PRIORITY_HIGH PRIORITY_HIGH} appear in a | |
| small floating window if the notification also has sound or vibration.</li> | |
| <li>{@link android.app.Notification.Builder#addPerson(java.lang.String) | |
| addPerson()}: Enables you to add one or more people who are relevant to a notification. | |
| Your app can use this to signal to the system that it should group together | |
| notifications from the specified people, or rank notifications from these people | |
| as being more important.</li> | |
| </ul> | |
| <h2 id="Graphics">Graphics</h2> | |
| <h3 id="OpenGLES-3-1">Support for OpenGL ES 3.1</h3> | |
| <p>Android 5.0 adds Java interfaces and native support for OpenGL | |
| ES 3.1. Key new functionality provided in OpenGL ES 3.1 includes:</p> | |
| <ul> | |
| <li>Compute shaders | |
| <li>Separate shader objects | |
| <li>Indirect draw commands | |
| <li>Multisample and stencil textures | |
| <li>Shading language improvements | |
| <li>Extensions for advanced blend modes and debugging | |
| <li>Backward compatibility with OpenGL ES 2.0 and 3.0 | |
| </ul> | |
| <p>The Java interface for OpenGL ES 3.1 on Android is provided with | |
| {@link android.opengl.GLES31}. When using OpenGL ES 3.1, be sure that you | |
| declare it in your manifest file with the | |
| <a href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code <uses-feature>}</a> tag and the {@code android:glEsVersion} attribute. For example:</p> | |
| <pre> | |
| <manifest> | |
| <uses-feature android:glEsVersion="0x00030001" /> | |
| ... | |
| </manifest> | |
| </pre> | |
| <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> | |
| <h3 id="AndroidExtensionPack">Android Extension Pack</h3> | |
| <p>In addition to OpenGL ES 3.1, this release provides an extension pack with | |
| Java interfaces and native support for advanced graphics functionality. These | |
| extensions are treated as a single package by Android. (If the | |
| {@code ANDROID_extension_pack_es31a} extension is present, your app can | |
| assume all extensions in the package are present and enable the shading language | |
| features with a single {@code #extension} statement.)</p> | |
| <p>The extension pack supports:</p> | |
| <ul> | |
| <li>Guaranteed fragment shader support for shader storage buffers, images, and | |
| atomics (Fragment shader support is optional in OpenGL ES 3.1.)</li> | |
| <li>Tessellation and geometry shaders</li> | |
| <li>ASTC (LDR) texture compression format</li> | |
| <li>Per-sample interpolation and shading</li> | |
| <li>Different blend modes for each color attachment in a frame buffer</li> | |
| </ul> | |
| <p>The Java interface for the extension pack is provided with | |
| {@link android.opengl.GLES31Ext}. In your app manifest, you can declare that | |
| your app must be installed only on devices that support the extension pack. | |
| For example:</p> | |
| <pre> | |
| <manifest> | |
| <uses-feature android:name=“android.hardware.opengles.aep” | |
| android:required="true" /> | |
| ... | |
| </manifest> | |
| </pre> | |
| <h2 id="Media">Media</h2> | |
| <h3 id="Camera-v2">Camera API for advanced camera capabilities</h3> | |
| <p>Android 5.0 introduces the new | |
| <a href="{@docRoot}reference/android/hardware/camera2/package-summary.html">android.hardware.camera2</a> | |
| API to facilitate fine-grain photo capture and image processing. You can now | |
| programmatically access the camera devices available to the system with | |
| {@link android.hardware.camera2.CameraManager#getCameraIdList() getCameraIdList()} | |
| and connect to a specific device with | |
| {@link android.hardware.camera2.CameraManager#openCamera(java.lang.String, android.hardware.camera2.CameraDevice.StateCallback, android.os.Handler) openCamera()}. | |
| To start capturing images, create a {@link android.hardware.camera2.CameraCaptureSession} | |
| and specify the {@link android.view.Surface} objects to send captured images. | |
| The {@link android.hardware.camera2.CameraCaptureSession} can be configured to | |
| take single shots or multiple images in a burst.</p> | |
| <p>To be notified when new images are captured, implement the | |
| {@link android.hardware.camera2.CameraCaptureSession.CaptureCallback} listener | |
| and set it in your capture request. Now when the system completes the image | |
| capture request, your {@link android.hardware.camera2.CameraCaptureSession.CaptureCallback} | |
| listener receives a call to | |
| {@link android.hardware.camera2.CameraCaptureSession.CaptureCallback#onCaptureCompleted(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.hardware.camera2.TotalCaptureResult) onCaptureCompleted()}, | |
| providing you with the image capture metadata in a | |
| {@link android.hardware.camera2.CaptureResult}.</p> | |
| <p>The {@link android.hardware.camera2.CameraCharacteristics} class lets your | |
| app detect what camera features are available on a device. The object's | |
| {@link android.hardware.camera2.CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL | |
| INFO_SUPPORTED_HARDWARE_LEVEL} property represents the camera's level of functionality.</p> | |
| <ul> | |
| <li>All devices support at least the | |
| {@link android.hardware.camera2.CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY | |
| INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY} hardware level, which has capabilities | |
| roughly equivalent to that of the deprecated {@link android.hardware.Camera} | |
| API.</li> | |
| <li>Devices that support the {@link android.hardware.camera2.CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_FULL | |
| INFO_SUPPORTED_HARDWARE_LEVEL_FULL} hardware level are capable of manual | |
| control of capture and post-processing, and capturing high-resolution images | |
| at high frame rates.</li> | |
| </ul> | |
| <p>To see how to use the updated | |
| <a href="{@docRoot}reference/android/hardware/camera2/package-summary.html">Camera</a> | |
| API, refer to the {@code Camera2Basic} and {@code Camera2Video} implementation | |
| samples in this release.</p> | |
| <h3 id="AudioPlayback">Audio playback</h3> | |
| <p>This release includes the following changes to | |
| {@link android.media.AudioTrack}:</p> | |
| <ul> | |
| <li>Your app can now supply audio data in floating-point format | |
| ({@link android.media.AudioFormat#ENCODING_PCM_FLOAT ENCODING_PCM_FLOAT}). This | |
| permits greater dynamic range, more consistent precision, and greater headroom. | |
| Floating-point arithmetic is especially useful during intermediate calculations. | |
| Playback endpoints use integer format for audio data, and with lower bit depth. | |
| (In Android 5.0, portions of the internal pipeline are not yet | |
| floating point.) | |
| <li>Your app can now supply audio data as a {@link java.nio.ByteBuffer}, in | |
| the same format as provided by {@link android.media.MediaCodec}. | |
| <li>The {@link android.media.AudioTrack#WRITE_NON_BLOCKING WRITE_NON_BLOCKING} | |
| option can simplify buffering and multithreading for some apps. | |
| </ul> | |
| <h3 id="MediaPlaybackControl">Media playback control</h3> | |
| <p>Use the new notification and media APIs to ensure that the | |
| system UI knows about your media playback and can extract and show album art. | |
| Controlling media playback across a UI and a service is now easier with the new | |
| {@link android.media.session.MediaSession} and | |
| {@link android.media.session.MediaController} classes.</p> | |
| <p>The new {@link android.media.session.MediaSession} class replaces | |
| the deprecated {@link android.media.RemoteControlClient} class and provides a | |
| single set of callback methods for handling transport controls and media buttons. | |
| If your app provides media playback and runs on the Android | |
| <a href="{@docRoot}tv/index.html">TV</a> or | |
| <a href="{@docRoot}wear/index.html">Wear</a> platform, use the | |
| {@link android.media.session.MediaSession} class to handle your transport | |
| controls using the same callback methods.</p> | |
| <p>You can now build your own media controller app with the new | |
| {@link android.media.session.MediaController} class. This class provides | |
| a thread-safe way to monitor and control media playback from your app's UI process. | |
| When creating a controller, specify a {@link android.media.session.MediaSession.Token} | |
| object so that your app can interact with the given {@link android.media.session.MediaSession}. | |
| By using the {@link android.media.session.MediaController.TransportControls} methods, | |
| you can send commands such as {@link android.media.session.MediaController.TransportControls#play() play()}, | |
| {@link android.media.session.MediaController.TransportControls#stop() stop()}, | |
| {@link android.media.session.MediaController.TransportControls#skipToNext() skipToNext()}, | |
| and {@link android.media.session.MediaController.TransportControls#setRating(android.media.Rating) setRating()} | |
| to control media playback on that session. With the controller, you can also | |
| register a {@link android.media.session.MediaController.Callback} object to | |
| listen for metadata and state changes on the session.</p> | |
| <p>In addition, you can create rich notifications that allow playback control | |
| tied to a media session with the new {@link android.app.Notification.MediaStyle} | |
| class.</p> | |
| <h3 id="MediaBrowsing">Media browsing</h3> | |
| <p>Android 5.0 introduces the ability for apps to browse the media content | |
| library of another app, through the new | |
| <a href="{@docRoot}reference/android/media/browse/package-summary.html">android.media.browse</a> | |
| API. To expose the media content in your app, extend the | |
| {@link android.service.media.MediaBrowserService} class. Your implementation of | |
| {@link android.service.media.MediaBrowserService} should provide access to a | |
| {@link android.media.session.MediaSession.Token} so that apps can play media content | |
| provided through your service.</p> | |
| <p>To interact with a media browser service, use the | |
| {@link android.media.browse.MediaBrowser} class. Specify the component | |
| name for a {@link android.media.session.MediaSession} when you create an | |
| {@link android.media.browse.MediaBrowser} instance. Using that browser instance, | |
| your app can then connect to the associated service and obtain a | |
| {@link android.media.session.MediaSession.Token} object to play content exposed | |
| through that service.</p> | |
| <h2 id="Storage">Storage</h2> | |
| <h3 id="DirectorySelection">Directory selection</h3> | |
| <p>Android 5.0 extends the | |
| <a href="{@docRoot}guide/topics/providers/document-provider.html">Storage Access Framework</a> | |
| to let users select an entire directory subtree, giving apps read/write access | |
| to all contained documents without requiring user confirmation for each item.</p> | |
| <p>To select a directory subtree, build and send an | |
| {@link android.content.Intent#ACTION_OPEN_DOCUMENT_TREE OPEN_DOCUMENT_TREE} | |
| intent. The system displays all | |
| {@link android.provider.DocumentsProvider} instances that support subtree selection, | |
| letting the user browse and select a directory. The returned URI represents | |
| access to the selected subtree. You can then use {@link | |
| android.provider.DocumentsContract#buildChildDocumentsUriUsingTree(android.net.Uri, java.lang.String) buildChildDocumentsUriUsingTree()} | |
| and {@link android.provider.DocumentsContract#buildDocumentUriUsingTree(android.net.Uri, java.lang.String) buildDocumentUriUsingTree()} | |
| along with | |
| {@link android.content.ContentResolver#query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String) query()} | |
| to explore the subtree.</p> | |
| <p>The new {@link android.provider.DocumentsContract#createDocument(android.content.ContentResolver, android.net.Uri, java.lang.String, java.lang.String) | |
| createDocument()} method lets you create new documents or directories anywhere | |
| under the subtree. To manage existing documents, use | |
| {@link android.provider.DocumentsContract#renameDocument(android.content.ContentResolver, android.net.Uri, java.lang.String) renameDocument()} and | |
| {@link android.provider.DocumentsProvider#deleteDocument(java.lang.String) deleteDocument()}. | |
| Check {@link android.provider.DocumentsContract.Document#COLUMN_FLAGS COLUMN_FLAGS} | |
| to verify provider support for these calls before issuing them.</p> | |
| <p>If you're implementing a {@link android.provider.DocumentsProvider} and want | |
| to support subtree selection, implement {@link android.provider.DocumentsProvider#isChildDocument(java.lang.String, java.lang.String) isChildDocument()} and include {@link | |
| android.provider.DocumentsContract.Root#FLAG_SUPPORTS_IS_CHILD FLAG_SUPPORTS_IS_CHILD} | |
| in your {@link android.provider.DocumentsContract.Root#COLUMN_FLAGS COLUMN_FLAGS}.</p> | |
| <p>Android 5.0 also introduces new package-specific directories on | |
| shared storage where your app can place media files for inclusion in | |
| {@link android.provider.MediaStore}. The new | |
| {@link android.content.Context#getExternalMediaDirs()} returns paths to these | |
| directories on all shared storage devices. Similarly to | |
| {@link android.content.Context#getExternalFilesDir(java.lang.String) getExternalFilesDir()}, | |
| no additional permissions are needed by your app to access the returned paths. The | |
| platform periodically scans for new media in these directories, but you can also | |
| use {@link android.media.MediaScannerConnection} to explicitly scan for new | |
| content.</p> | |
| <h2 id="Wireless">Wireless & Connectivity</h2> | |
| <h3 id="Multinetwork">Multiple network connections</h3> | |
| <p>Android 5.0 provides new multi-networking APIs that let your app | |
| dynamically scan for available networks with specific capabilities, and | |
| establish a connection to them. This functionality is useful when your app | |
| requires a specialized network, such as an SUPL, MMS, or carrier-billing network, | |
| or if you want to send data using a particular type of transport protocol.</p> | |
| <p>To select and connect to a network dynamically from your app, follow these | |
| steps:</p> | |
| <ol> | |
| <li>Create a {@link android.net.ConnectivityManager}.</li> | |
| <li>Use the {@link android.net.NetworkRequest.Builder} class to create an | |
| {@link android.net.NetworkRequest} object and specify the network features | |
| and transport type your app is interested in.</li> | |
| <li>To scan for suitable networks, call {@link android.net.ConnectivityManager#requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback) requestNetwork()} | |
| or {@link android.net.ConnectivityManager#registerNetworkCallback(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback) registerNetworkCallback()}, and pass in the | |
| {@link android.net.NetworkRequest} object and an implementation of | |
| {@link android.net.ConnectivityManager.NetworkCallback}. Use the | |
| {@link android.net.ConnectivityManager#requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback) requestNetwork()} method if you want to actively switch to a suitable network once it’s detected; to receive | |
| only notifications for scanned networks without actively switching, use the | |
| {@link android.net.ConnectivityManager#registerNetworkCallback(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback) registerNetworkCallback()} method instead.</li> | |
| </ol> | |
| <p>When the system detects a suitable network, it connects to the network and | |
| invokes the | |
| {@link android.net.ConnectivityManager.NetworkCallback#onAvailable(android.net.Network) onAvailable()} | |
| callback. You can use the {@link android.net.Network} object from the callback to | |
| get additional information about the network, or to direct traffic to use the | |
| selected network.</p> | |
| <h3 id="BluetoothBroadcasting">Bluetooth Low Energy</h3> | |
| <p>Android 4.3 introduced platform support for | |
| <a href="{@docRoot}guide/topics/connectivity/bluetooth-le.html">Bluetooth Low Energy</a> | |
| (<em>Bluetooth LE</em>) in the central role. In Android 5.0, an Android device can now | |
| act as a Bluetooth LE <em>peripheral device</em>. Apps can use this capability | |
| to make their presence known to nearby devices. For instance, you can build apps | |
| that allow a device to function as a pedometer or health monitor and communicate | |
| its data with another Bluetooth LE device.</p> | |
| <p>The new {@link android.bluetooth.le} APIs enable your apps to broadcast | |
| advertisements, scan for responses, and form connections with nearby Bluetooth | |
| LE devices. To use the new advertising and scanning features, add the | |
| {@link android.Manifest.permission#BLUETOOTH_ADMIN BLUETOOTH_ADMIN} | |
| permission in your manifest. When users update or download your app from the Play Store, | |
| they are asked to grant the following permission to your app: | |
| "Bluetooth connection information: Allows the app to control Bluetooth, | |
| including broadcasting to or getting information about nearby Bluetooth devices."</p> | |
| <p>To begin Bluetooth LE advertising so that other devices can discover | |
| your app, call | |
| {@link android.bluetooth.le.BluetoothLeAdvertiser#startAdvertising(android.bluetooth.le.AdvertiseSettings, android.bluetooth.le.AdvertiseData, android.bluetooth.le.AdvertiseCallback) startAdvertising()} | |
| and pass in an implementation of the | |
| {@link android.bluetooth.le.AdvertiseCallback} class. The callback object | |
| receives a report of the success or failure of the advertising operation.</p> | |
| <p> Android 5.0 introduces the {@link android.bluetooth.le.ScanFilter} class so | |
| that your app can scan for only the | |
| specific types of devices it is interested in. To begin scanning for Bluetooth | |
| LE devices, call {@link android.bluetooth.le.BluetoothLeScanner#startScan(android.bluetooth.le.ScanCallback) startScan()} | |
| and pass in a list of filters. In the method call, you must also provide an | |
| implementation of {@link android.bluetooth.le.ScanCallback} to report when a | |
| Bluetooth LE advertisement is found. </p> | |
| <h3 id="NFCEnhancements">NFC enhancements</h3> | |
| <p>Android 5.0 adds these enhancements to enable wider and more | |
| flexible use of NFC:</p> | |
| <ul> | |
| <li>Android Beam is now available in the <em>share</em> menu.</li> | |
| <li>Your app can invoke the Android Beam on the user’s device to share data by | |
| calling {@link android.nfc.NfcAdapter#invokeBeam(android.app.Activity) invokeBeam()}. | |
| This avoids the need for the user to manually tap the device against another | |
| NFC-capable device to complete the data transfer.</li> | |
| <li>You can use the new {@link android.nfc.NdefRecord#createTextRecord(java.lang.String, java.lang.String) | |
| createTextRecord()} method to create an NDEF record containing UTF-8 text data.</li> | |
| <li>If you are developing a payment app, you now have the ability to | |
| register an NFC application ID (AID) dynamically by calling | |
| <code><a href="{@docRoot}reference/android/nfc/cardemulation/CardEmulation.html#registerAidsForService(android.content.ComponentName, java.lang.String, java.util.List<java.lang.String>)">registerAidsForService()</a></code>. | |
| You can also use {@link android.nfc.cardemulation.CardEmulation#setPreferredService(android.app.Activity, android.content.ComponentName) setPreferredService()} to set the preferred card emulation service that should | |
| be used when a specific activity is in the foreground.</li> | |
| </ul> | |
| <h2 id="Power">Project Volta</h2> | |
| <p>In addition to new features, Android 5.0 emphasizes improvements in battery | |
| life. Use the new APIs and tool to understand and optimize your app’s power | |
| consumption.</p> | |
| <h3 id="JobScheduler">Scheduling jobs</h3> | |
| <p>Android 5.0 provides a new {@link android.app.job.JobScheduler} | |
| API that lets you optimize battery life by defining jobs for the system to run | |
| asynchronously at a later time or under specified conditions (such as when the | |
| device is charging). Job scheduling is useful in such situations as:</p> | |
| <ul> | |
| <li>The app has non-user-facing work that you can defer.</li> | |
| <li>The app has work you'd prefer to do when the unit is plugged in.</li> | |
| <li>The app has a task that requires network access or a Wi-Fi | |
| connection.</li> | |
| <li>The app has a number of tasks that you want to run as a batch on a regular | |
| schedule.</li> | |
| </ul> | |
| <p>A unit of work is encapsulated by a {@link android.app.job.JobInfo} object. | |
| This object specifies the scheduling criteria.</p> | |
| <p>Use the {@link android.app.job.JobInfo.Builder} class to configure how the | |
| scheduled task should run. You can schedule the task to run under specific | |
| conditions, such as:</p> | |
| <ul> | |
| <li>Start when the device is charging</li> | |
| <li>Start when the device is connected to an unmetered network</li> | |
| <li>Start when the device is idle</li> | |
| <li>Finish before a certain deadline or with a minimum delay</li> | |
| </ul> | |
| <p>For example, you can add code like this to run your task on an | |
| unmetered network:</p> | |
| <pre> | |
| JobInfo uploadTask = new JobInfo.Builder(mJobId, | |
| mServiceComponent /* JobService component */) | |
| .setRequiredNetworkCapabilities(JobInfo.NetworkType.UNMETERED) | |
| .build(); | |
| JobScheduler jobScheduler = | |
| (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); | |
| jobScheduler.schedule(uploadTask); | |
| </pre> | |
| <p>If the device has stable power (that is, it has been plugged in for more | |
| than 2 minutes and the battery is at a | |
| <a href="{@docRoot}reference/android/content/Intent.html#ACTION_BATTERY_OKAY">healthy level</a>), | |
| the system will run any scheduled job that is ready to run, even if the job’s | |
| deadline has not expired.</p> | |
| <p>To see an example of how to use the {@link android.app.job.JobScheduler} API, | |
| refer to the {@code JobSchedulerSample} implementation sample in this release.</p> | |
| <h3 id="PowerMeasurementTools">Developer tools for battery usage</h3> | |
| <p>The new {@code dumpsys batterystats} command generates interesting | |
| statistical data about battery usage on a device, organized by unique user ID | |
| (UID). The statistics include:</p> | |
| <ul> | |
| <li>History of battery related events | |
| <li>Global statistics for the device | |
| <li>Approximate power use per UID and system component | |
| <li>Per-app mobile ms per packet | |
| <li>System UID aggregated statistics | |
| <li>App UID aggregated statistics | |
| </ul> | |
| <p>Use the {@code --help} option to learn about the various options for | |
| tailoring the output. For example, to print battery usage | |
| statistics for a given app package since the device was last charged, run this | |
| command: | |
| <pre> | |
| $ adb shell dumpsys batterystats --charged <package-name> | |
| </pre> | |
| <p>You can use the | |
| <a href="https://github.com/google/battery-historian" class="external-link">Battery Historian</a> | |
| tool on the output of the {@code dumpsys} command to | |
| generate an HTML visualization of power-related events from the logs. This | |
| information makes it easier for you to understand and diagnose any battery | |
| related issues.</p> | |
| <h2 id="Enterprise">Android in the Workplace and in Education</h2> | |
| <h3 id="ManagedProvisioning">Managed provisioning</h3> | |
| <p>Android 5.0 provides new functionality for running apps within | |
| an enterprise environment. A | |
| <a href="{@docRoot}guide/topics/admin/device-admin.html">device administrator</a> can | |
| initiate a managed provisioning process to add a copresent but separate | |
| <em>managed profile</em> to a device, if the user has an existing personal account. | |
| Apps that are associated with managed profiles appear alongside | |
| non-managed apps in the user’s Launcher, recents screen, and notifications.</p> | |
| <p>To start the managed provisioning process, send | |
| {@link android.app.admin.DevicePolicyManager#ACTION_PROVISION_MANAGED_PROFILE | |
| ACTION_PROVISION_MANAGED_PROFILE} in an {@link android.content.Intent}. If the | |
| call is successful, the system triggers the | |
| {@link android.app.admin.DeviceAdminReceiver#onProfileProvisioningComplete(android.content.Context, android.content.Intent) onProfileProvisioningComplete()} callback. | |
| You can then call {@link android.app.admin.DevicePolicyManager#setProfileEnabled(android.content.ComponentName) setProfileEnabled()} to | |
| enable this managed profile.</p> | |
| <p>By default, only a small subset of apps are enabled in the managed profile. | |
| You can install additional apps in the managed profile by calling | |
| {@link android.app.admin.DevicePolicyManager#enableSystemApp(android.content.ComponentName, android.content.Intent) enableSystemApp()}.</p> | |
| <p>If you are developing a Launcher app, you can use the new {@link | |
| android.content.pm.LauncherApps} class to get a list of launchable activities | |
| for the current user and any associated managed profiles. Your Launcher can make | |
| the managed apps visually prominent by appending a work badge to the icon | |
| drawable. To retrieve the badged icon, call | |
| {@link android.content.pm.PackageManager#getUserBadgedIcon(android.graphics.drawable.Drawable, android.os.UserHandle) | |
| getUserBadgedIcon()}.</p> | |
| <p>To see how to use the new functionality, refer to the | |
| {@code BasicManagedProfile} implementation sample in this release.</p> | |
| <h3 id="DeviceOwner">Device owner</h3> | |
| <p>Android 5.0 introduces the ability to deploy a device owner app. A <em>device | |
| owner</em> is a specialized type of | |
| <a href="{@docRoot}guide/topics/admin/device-admin.html">device administrator</a> | |
| that has the additional ability to create and remove secondary users and to | |
| configure global settings on the device. Your device owner app can use the | |
| methods in the {@link android.app.admin.DevicePolicyManager} class to take | |
| fine-grain control of the configuration, security, and apps on managed devices. | |
| A device can have only one active device owner at a time.</p> | |
| <p>To deploy and activate a device owner, you must perform an NFC data transfer | |
| from a programming app to the device while the device is in its unprovisioned | |
| state. This data transfer sends the same information as in the provisioning intent | |
| described in <a href="#ManagedProvisioning">Managed provisioning</a>.</p> | |
| <h3 id="ScreenPinning">Screen pinning</h3> | |
| <p>Android 5.0 introduces a new screen pinning API that lets you temporarily | |
| restrict users from leaving your task or being interrupted by notifications. | |
| This could be used, for example, if you are developing an education app to | |
| support high stakes assessment requirements on Android, or a single-purpose or | |
| kiosk application. Once your app activates screen pinning, users cannot see | |
| notifications, access other apps, or return to the home screen, | |
| until your app exits the mode.</p> | |
| <p>There are two ways to activate screen pinning:</p> | |
| <ul> | |
| <li><strong>Manually:</strong> Users can enable screen pinning in | |
| <em>Settings > Security > Screen Pinning</em>, and select the tasks they want to | |
| pin by touching the green pin icon in the recents screen.</li> | |
| <li><strong>Programmatically:</strong> To activate screen pinning | |
| programmatically, call {@link android.app.Activity#startLockTask() startLockTask()} | |
| from your app. If the requesting app is not a device owner, the user is prompted | |
| for confirmation. A device owner app can call the | |
| {@link android.app.admin.DevicePolicyManager#setLockTaskPackages(android.content.ComponentName, java.lang.String[]) setLockTaskPackages()} | |
| method to enable apps to be pinnable without the user confirmation step.</li> | |
| </ul> | |
| <p>When task locking is active, the following behavior happens:</p> | |
| <ul> | |
| <li>The status bar is blank, and user notifications and status information are | |
| hidden.</li> | |
| <li>The Home and Recent Apps buttons are hidden.</li> | |
| <li>Other apps cannot launch new activities.</li> | |
| <li>The current app can start new activities, as long as doing so does not | |
| create new tasks.</li> | |
| <li>When screen pinning is invoked by a device owner, the user remains locked | |
| to your app until the app calls | |
| {@link android.app.Activity#stopLockTask() stopLockTask()}.</li> | |
| <li>If screen pinning is activity by another app that is not a device owner or | |
| by the user directly, the user can exit by holding both the Back and Recent buttons.</li> | |
| </ul> | |
| <h2 id="Printing">Printing Framework</h2> | |
| <h3 id="PDFRender">Render PDF as bitmap</h3> | |
| <p>You can now render PDF document pages into bitmap images for printing by | |
| using the new {@link android.graphics.pdf.PdfRenderer} class. You must specify a | |
| {@link android.os.ParcelFileDescriptor} that is seekable (that is, the content | |
| can be randomly accessed) on which the system writes the the printable content. | |
| Your app can obtain a page for rendering with | |
| {@link android.graphics.pdf.PdfRenderer#openPage(int) openPage()}, then call | |
| {@link android.graphics.pdf.PdfRenderer.Page#render(android.graphics.Bitmap, android.graphics.Rect, android.graphics.Matrix, int) render()} | |
| to turn the opened {@link android.graphics.pdf.PdfRenderer.Page} into a bitmap. You | |
| can also set additional parameters if you only want to convert a portion of the | |
| document into a bitmap image (for example, to implement | |
| <a href="http://en.wikipedia.org/wiki/Tiled_rendering" class="external-link">tiled rendering</a> | |
| to zoom in on the document).</p> | |
| <p>For an example of how to use the new APIs, see the {@code PdfRendererBasic} | |
| sample.</p> | |
| <h2 id="System">System</h2> | |
| <h3 id="AppUsageStatistics">App usage statistics</h3> | |
| <p>You can now access app usage history on an Android device with the | |
| new {@link android.app.usage} API. This API provides more detailed usage | |
| information than the deprecated | |
| {@link android.app.ActivityManager#getRecentTasks(int, int) getRecentTasks()} method. | |
| To use this API, you must first declare the | |
| {@code "android.permission.PACKAGE_USAGE_STATS"} permission in your manifest. | |
| The user must also enable access for this app through <em>Settings > Security > Apps</em> | |
| with usage access.</p> | |
| <p>The system collects the usage data on a per-app basis, aggregating the | |
| data over daily, weekly, monthly, and yearly intervals. The maximum duration | |
| that the system keeps this data is as follows:</p> | |
| <ul> | |
| <li>Daily data: 7 days</li> | |
| <li>Weekly data: 4 weeks</li> | |
| <li>Monthly data: 6 months</li> | |
| <li>Yearly data: 2 years</li> | |
| </ul> | |
| <p>For each app, the system records the following data:</p> | |
| <ul> | |
| <li>The last time the app was used</li> | |
| <li>The total length of time the app was in the foreground for that time interval | |
| (by day, week, month, or year)</li> | |
| <li>Timestamp capturing when a component (identified by a package and activity name) | |
| moved to the foreground or background during a day</li> | |
| <li>Timestamp capturing when a device configuration changed (such as when the | |
| device orientation changed because of rotation)</li> | |
| </ul> | |
| <h2 id="TestingA11y">Testing & Accessibility </h2> | |
| <h3 id="TestingA11yImprovements">Testing and accessibility improvements</h3> | |
| <p>Android 5.0 adds the following support for testing and | |
| accessibility:</p> | |
| <ul> | |
| <li>The new {@link android.app.UiAutomation#getWindowAnimationFrameStats() getWindowAnimationFrameStats()} | |
| and {@link android.app.UiAutomation#getWindowContentFrameStats(int) getWindowContentFrameStats()} | |
| methods capture frame statistics for window animations and content. These methods | |
| let you write instrumentation tests to evaluate whether an app is rendering | |
| frames at a sufficient refresh frequency to provide a smooth user experience.</li> | |
| <li>The new | |
| {@link android.app.UiAutomation#executeShellCommand(java.lang.String) executeShellCommand()} | |
| method lets you execute shell commands from your instrumentation test. The | |
| command execution is similar to running {@code adb shell} from a host | |
| connected to the device, allowing you to use shell-based tools such as | |
| {@code dumpsys}, {@code am}, {@code content}, and {@code pm}.</li> | |
| <li>Accessibility services and test tools that use the accessibility APIs | |
| (such as <a href="{@docRoot}tools/help/uiautomator/index.html">{@code UiAutomator}</a>) | |
| can now retrieve detailed information about the properties of windows on the | |
| screen that sighted users can interact with. To retrieve a list of | |
| {@link android.view.accessibility.AccessibilityWindowInfo} objects, call the new | |
| {@link android.accessibilityservice.AccessibilityService#getWindows() getWindows()} | |
| method.</li> | |
| <li>The new {@link android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction} | |
| class lets you define standard or customized actions to perform on an | |
| {@link android.view.accessibility.AccessibilityNodeInfo}. | |
| The new {@link android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction} | |
| class replaces the actions-related APIs previously found in | |
| {@link android.view.accessibility.AccessibilityNodeInfo}.</li> | |
| <li>Android 5.0 provides finer-grain control over text-to-speech synthesis in | |
| your app. The new {@link android.speech.tts.Voice} class allows your app to | |
| use voice profiles associated with specific locales, quality and latency | |
| rating, and text-to-speech engine-specific parameters.</li> | |
| </ul> | |
| <h2 id="IME">IME</h2> | |
| <h3 id="Switching">Easier switching between input languages</h3> | |
| <p>Beginning in Android 5.0, users can more easily switch between | |
| all <a href="{@docRoot}guide/topics/text/creating-input-method.html">input | |
| method editors (IME)</a> supported by the platform. Performing the designated | |
| switching action (usually touching a Globe icon on the soft keyboard) cycles | |
| through all such IMEs. This change in behavior is implemented by the | |
| {@link android.view.inputmethod.InputMethodManager#shouldOfferSwitchingToNextInputMethod(android.os.IBinder) shouldOfferSwitchingToNextInputMethod()} | |
| method.</p> | |
| <p>In addition, the framework now checks whether the next IME includes a | |
| switching mechanism at all (and, thus, whether that IME supports switching to | |
| the IME after it). An | |
| IME with a switching mechanism will not cycle to an IME without one. This | |
| change in behavior is implemented by the | |
| {@link android.view.inputmethod.InputMethodManager#switchToNextInputMethod(android.os.IBinder, boolean) switchToNextInputMethod()} | |
| method. | |
| <p>To see an example of how to use the updated IME-switching APIs, refer to the | |
| updated soft-keyboard implementation sample in this release. To learn more about | |
| how to implement switching between IMEs, see | |
| <a href="{@docRoot}guide/topics/text/creating-input-method.html">Creating an Input Method</a>. | |
| </p> | |
| <h2 id="Manifest">Manifest Declarations</h2> | |
| <h3 id="ManifestFeatures">Declarable required features</h3> | |
| <p>The following values are now supported in the | |
| <a href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code <uses-feature>}</a> | |
| element, so you can ensure that your app is installed only on devices that | |
| provide the features your app needs.</p> | |
| <ul> | |
| <li>{@link android.content.pm.PackageManager#FEATURE_AUDIO_OUTPUT}</li> | |
| <li>{@link android.content.pm.PackageManager#FEATURE_CAMERA_CAPABILITY_MANUAL_POST_PROCESSING}</li> | |
| <li>{@link android.content.pm.PackageManager#FEATURE_CAMERA_CAPABILITY_MANUAL_SENSOR}</li> | |
| <li>{@link android.content.pm.PackageManager#FEATURE_CAMERA_CAPABILITY_RAW}</li> | |
| <li>{@link android.content.pm.PackageManager#FEATURE_CAMERA_LEVEL_FULL}</li> | |
| <li>{@link android.content.pm.PackageManager#FEATURE_GAMEPAD}</li> | |
| <li>{@link android.content.pm.PackageManager#FEATURE_LIVE_TV}</li> | |
| <li>{@link android.content.pm.PackageManager#FEATURE_MANAGED_USERS}</li> | |
| <li>{@link android.content.pm.PackageManager#FEATURE_LEANBACK}</li> | |
| <li>{@link android.content.pm.PackageManager#FEATURE_OPENGLES_EXTENSION_PACK}</li> | |
| <li>{@link android.content.pm.PackageManager#FEATURE_SECURELY_REMOVES_USERS}</li> | |
| <li>{@link android.content.pm.PackageManager#FEATURE_SENSOR_AMBIENT_TEMPERATURE}</li> | |
| <li>{@link android.content.pm.PackageManager#FEATURE_SENSOR_HEART_RATE_ECG}</li> | |
| <li>{@link android.content.pm.PackageManager#FEATURE_SENSOR_RELATIVE_HUMIDITY}</li> | |
| <li>{@link android.content.pm.PackageManager#FEATURE_VERIFIED_BOOT}</li> | |
| <li>{@link android.content.pm.PackageManager#FEATURE_WEBVIEW}</li> | |
| </ul> | |
| <h3 id="Permissions">User permissions</h3> | |
| <p>The following permission is now supported in the | |
| <a href="{@docRoot}guide/topics/manifest/uses-permission-element.html">{@code <uses-permission>}</a> | |
| element to declare the permissions your app requires to access certain APIs.</p> | |
| <ul> | |
| <li>{@link android.Manifest.permission#BIND_DREAM_SERVICE}: When targeting API | |
| level 21 and higher, this permission is required by a | |
| <a href="{@docRoot}about/versions/android-4.2.html#Daydream">Daydream</a> service, | |
| to ensure that only the system can bind to it.</li> | |
| </ul> |