| 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> |
| <li><a href="{@docRoot}sdk/api_diff/preview-21/changes.html">L Developer Preview 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}sdk/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> |