| page.title=API Overview | |
| page.keywords=preview,sdk,compatibility | |
| page.tags=previewresources, androidm | |
| sdk.platform.apiLevel=22-mnc | |
| page.image=images/cards/card-api-overview_16-9_2x.png | |
| @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="#app-linking">App Linking</a></li> | |
| <li><a href="#backup">Auto Backup for Apps</a></li> | |
| <li><a href="#authentication">Authentication</a> | |
| <ol> | |
| <li><a href="#fingerprint-authentication">Fingerprint Authentication</a></li> | |
| <li><a href="#confirm-credential">Confirm Credential</a></li> | |
| </ol> | |
| </li> | |
| <li><a href="#direct-share">Direct Share</a></li> | |
| <li><a href="#voice-interactions">Voice Interactions</a></li> | |
| <li><a href="#assist">Assist API</a></li> | |
| <li><a href="#notifications">Notifications</a></li> | |
| <li><a href="#bluetooth-stylus">Bluetooth Stylus Support</a></li> | |
| <li><a href="#ble-scanning">Improved Bluetooth Low Energy Scanning</a></li> | |
| <li><a href="#hotspot">Hotspot 2.0 Release 1 Support</a></li> | |
| <li><a href="#4K-display">4K Display Mode</a></li> | |
| <li><a href="#behavior-themeable-colorstatelists">Themeable ColorStateLists</a></li> | |
| <li><a href="#audio">Audio Features</a></li> | |
| <li><a href="#video">Video Features</a></li> | |
| <li><a href="#camera">Camera Features</a> | |
| <ol> | |
| <li><a href="#flashlight">Flashlight API</a></li> | |
| <li><a href="#reprocessing">Camera Reprocessing</a></li> | |
| </ol> | |
| </li> | |
| <li><a href="#afw">Android for Work Features</a></li> | |
| </ol> | |
| <h2>API Differences</h2> | |
| <ol> | |
| <li><a href="{@docRoot}sdk/api_diff/23/changes.html">API level 22 to 23 (Preview 3) »</a> </li> | |
| </ol> | |
| </div> | |
| </div> | |
| <p>The M Developer Preview gives you an advance look at the upcoming release | |
| for the Android platform, which offers new features for users and app | |
| developers. This document provides an introduction to the most notable APIs.</p> | |
| <p> | |
| The M Developer Preview 3 release includes the <strong>final APIs for Android 6.0 (API level | |
| 23)</strong>. If you are preparing an app for use on Android 6.0, | |
| <a href="{@docRoot}preview/setup-sdk.html">download the latest SDK</a> and to complete your | |
| final updates and release testing. You can review the final APIs in the | |
| <a href="{@docRoot}reference/packages.html">API Reference</a> and see the API differences in | |
| the <a href="{@docRoot}sdk/api_diff/23/changes.html">Android API Differences Report</a>. | |
| </p> | |
| </p> | |
| <p class="caution"><strong>Important:</strong> | |
| You may now publish apps that target Android 6.0 (API level 23) to the Google Play store. | |
| </p> | |
| <p class="note"><strong>Note:</strong> | |
| If you have been working with previous preview releases and want to see the differences | |
| between the final API and previous preview versions, download the additional difference | |
| reports included in the <a href="{@docRoot}preview/download.html#docs">preview docs | |
| reference</a>. | |
| </p> | |
| <h3>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 the platform.</p> | |
| <p>Please see <a href="behavior-changes.html">Behavior Changes</a> for complete information.</p> | |
| <h2 id="app-linking">App Linking</h2> | |
| <p>This preview enhances Android’s intent system by providing more powerful app linking. | |
| This feature allows you to associate an app with a web domain you own. Based on this | |
| association, the platform can determine the default app to use to handle a particular | |
| web link and skip prompting users to select an app. To learn how to implement this feature, see | |
| <a href="{@docRoot}preview/features/app-linking.html">App Linking</a>. | |
| <h2 id="backup">Auto Backup for Apps</h2> | |
| <p>The system now performs automatic full data backup and restore for apps. For the | |
| duration of the <a href="{@docRoot}preview/overview.html">M Developer Preview program</a>, all | |
| apps are backed up, independent of which SDK version they target. After the final M SDK release, | |
| your app must target M to enable this behavior; you do not need to add any additional code. If users | |
| delete their Google accounts, their backup data is deleted as well. To learn how this feature | |
| works and how to configure what to back up on the file system, see | |
| <a href="{@docRoot}preview/backup/index.html">Auto Backup for Apps</a>.</p> | |
| <h2 id="authentication">Authentication</h2> | |
| <p>This preview offers new APIs to let you authenticate users by using their fingerprint scans on | |
| supported devices, and check how recently the user was last authenticated using a device unlocking | |
| mechanism (such as a lockscreen password). Use these APIs in conjunction with | |
| the <a href="{@docRoot}training/articles/keystore.html">Android Keystore system</a>.</p> | |
| <h3 id="fingerprint-authentication">Fingerprint Authentication</h3> | |
| <p>To authenticate users via fingerprint scan, get an instance of the new | |
| {@link android.hardware.fingerprint.FingerprintManager} class and call the | |
| {@link android.hardware.fingerprint.FingerprintManager#authenticate(android.hardware.fingerprint.FingerprintManager.CryptoObject, android.os.CancellationSignal, int, android.hardware.fingerprint.FingerprintManager.AuthenticationCallback, android.os.Handler) authenticate()} | |
| method. Your app must be running on a compatible | |
| device with a fingerprint sensor. You must implement the user interface for the fingerprint | |
| authentication flow on your app, and use the standard Android fingerprint icon in your UI. | |
| The Android fingerprint icon ({@code c_fp_40px.png}) is included in the | |
| <a href="https://github.com/googlesamples/android-FingerprintDialog" | |
| class="external-link">sample app</a>. If you are developing multiple apps that use fingerprint | |
| authentication, note that each app must authenticate the user’s fingerprint independently. | |
| </p> | |
| <p>To use this feature in your app, first add the | |
| {@link android.Manifest.permission#USE_FINGERPRINT} permission in your manifest.</p> | |
| <pre> | |
| <uses-permission | |
| android:name="android.permission.USE_FINGERPRINT" /> | |
| </pre> | |
| <img src="{@docRoot}preview/images/fingerprint-screen.png" | |
| srcset="{@docRoot}preview/images/fingerprint-screen.png 1x, {@docRoot}preview/images/fingerprint-screen_2x.png 2x" | |
| style="float:right; margin:0 0 10px 20px" width="282" height="476" /> | |
| <p>To see an app implementation of fingerprint authentication, refer to the | |
| <a href="https://github.com/googlesamples/android-FingerprintDialog" class="external-link"> | |
| Fingerprint Dialog sample</a>. For a demonstration of how you can use these authentication | |
| APIs in conjunction with other Android APIs, see the video | |
| <a class="video-shadowbox-button" href="https://www.youtube.com/watch?v=VOn7VrTRlA4"> | |
| Fingerprint and Payment APIs</a>.</p> | |
| <p>If you are testing this feature, follow these steps:</p> | |
| <ol> | |
| <li>Install Android SDK Tools Revision 24.3, if you have not done so.</li> | |
| <li>Enroll a new fingerprint in the emulator by going to | |
| <strong>Settings > Security > Fingerprint</strong>, then follow the enrollment instructions.</li> | |
| <li>Use an emulator to emulate fingerprint touch events with the | |
| following command. Use the same command to emulate fingerprint touch events on the lockscreen or | |
| in your app. | |
| <pre class="no-prettyprint"> | |
| adb -e emu finger touch <finger_id> | |
| </pre> | |
| <p>On Windows, you may have to run {@code telnet 127.0.0.1 <emulator-id>} followed by | |
| {@code finger touch <finger_id>}. | |
| </p> | |
| </li> | |
| </ol> | |
| <h3 id="confirm-credential">Confirm Credential</h3> | |
| <p>Your app can authenticate users based on how recently they last unlocked their device. This | |
| feature frees users from having to remember additional app-specific passwords, and avoids the need | |
| for you to implement your own authentication user interface. Your app should use this feature in | |
| conjunction with a public or secret key implementation for user authentication.</p> | |
| <p>To set the timeout duration for which the same key can be re-used after a user is successfully | |
| authenticated, call the new | |
| {@link android.security.keystore.KeyGenParameterSpec.Builder#setUserAuthenticationValidityDurationSeconds(int) setUserAuthenticationValidityDurationSeconds()} | |
| method when you set up a {@link javax.crypto.KeyGenerator} or | |
| {@link java.security.KeyPairGenerator}.</p> | |
| <p>Avoid showing the re-authentication dialog excessively -- your apps should try using the | |
| cryptographic object first and if the the timeout expires, use the | |
| {@link android.app.KeyguardManager#createConfirmDeviceCredentialIntent(java.lang.CharSequence, java.lang.CharSequence) createConfirmDeviceCredentialIntent()} | |
| method to re-authenticate the user within your app. | |
| </p> | |
| <p>To see an app implementation of this feature, refer to the | |
| <a href="https://github.com/googlesamples/android-ConfirmCredential" class="external-link"> | |
| Confirm Credential sample</a>.</p> | |
| <h2 id="direct-share">Direct Share</h2> | |
| <img src="{@docRoot}preview/images/direct-share-screen.png" | |
| srcset="{@docRoot}preview/images/direct-share-screen.png 1x, {@docRoot}preview/images/direct-share-screen_2x.png 2x" | |
| style="float:right; margin:0 0 20px 30px" width="312" height="329" /> | |
| <p>This preview provides you with APIs to make sharing intuitive and quick for users. You can now | |
| define <em>direct share targets</em> that launch a specific activity in your app. These direct share | |
| targets are exposed to users via the <em>Share</em> menu. This feature allows users to share | |
| content to targets, such as contacts, within other apps. For example, the direct share target might | |
| launch an activity in another social network app, which lets the user share content directly to a | |
| specific friend or community in that app.</p> | |
| <p>To enable direct share targets you must define a class that extends the | |
| {@link android.service.chooser.ChooserTargetService} class. Declare your | |
| service in the manifest. Within that declaration, specify the | |
| {@link android.Manifest.permission#BIND_CHOOSER_TARGET_SERVICE} permission and an | |
| intent filter using the | |
| {@link android.service.chooser.ChooserTargetService#SERVICE_INTERFACE SERVICE_INTERFACE} action.</p> | |
| <p>The following example shows how you might declare the | |
| {@link android.service.chooser.ChooserTargetService} in your manifest.</p> | |
| <pre> | |
| <service android:name=".ChooserTargetService" | |
| android:label="@string/service_name" | |
| android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE"> | |
| <intent-filter> | |
| <action android:name="android.service.chooser.ChooserTargetService" /> | |
| </intent-filter> | |
| </service> | |
| </pre> | |
| <p>For each activity that you want to expose to | |
| {@link android.service.chooser.ChooserTargetService}, add a | |
| {@code <meta-data>} element with the name | |
| {@code "android.service.chooser.chooser_target_service"} in your app manifest. | |
| </p> | |
| <pre> | |
| <activity android:name=".MyShareActivity” | |
| android:label="@string/share_activity_label"> | |
| <intent-filter> | |
| <action android:name="android.intent.action.SEND" /> | |
| </intent-filter> | |
| <meta-data | |
| android:name="android.service.chooser.chooser_target_service" | |
| android:value=".ChooserTargetService" /> | |
| </activity> | |
| </pre> | |
| <h2 id="voice-interactions">Voice Interactions</h2> | |
| <p> | |
| This preview provides a new voice interaction API which, together with | |
| <a href="https://developers.google.com/voice-actions/" class="external-link">Voice Actions</a>, | |
| allows you to build conversational voice experiences into your apps. Call the | |
| {@link android.app.Activity#isVoiceInteraction()} method to determine if a voice action triggered | |
| your activity. If so, your app can use the | |
| {@link android.app.VoiceInteractor} class to request a voice confirmation from the user, select | |
| from a list of options, and more.</p> | |
| <p>Most voice interactions originate from a user voice action. A voice interaction activity can | |
| also, however, start without user input. For example, another app launched through a voice | |
| interaction can also send an intent to launch a voice interaction. To determine if your activity | |
| launched from a user voice query or from another voice interaction app, call the | |
| {@link android.app.Activity#isVoiceInteractionRoot()} method. If another app launched your | |
| activity, the method returns {@code false}. Your app may then prompt the user to confirm that | |
| they intended this action.</p> | |
| <p>To learn more about implementing voice actions, see the | |
| <a href="https://developers.google.com/voice-actions/interaction/" | |
| class="external-link">Voice Actions developer site</a>. | |
| </p> | |
| <h2 id="assist">Assist API</h2> | |
| <p> | |
| This preview offers a new way for users to engage with your apps through an assistant. To use this | |
| feature, the user must enable the assistant to use the current context. Once enabled, the user | |
| can summon the assistant within any app, by long-pressing on the <strong>Home</strong> button.</p> | |
| <p>Your app can elect to not share the current context with the assistant by setting the | |
| {@link android.view.WindowManager.LayoutParams#FLAG_SECURE} flag. In addition to the | |
| standard set of information that the platform passes to the assistant, your app can share | |
| additional information by using the new {@link android.app.assist.AssistContent} class.</p> | |
| <p>To provide the assistant with additional context from your app, follow these steps:</p> | |
| <ol> | |
| <li>Implement the {@link android.app.Application.OnProvideAssistDataListener} interface.</li> | |
| <li>Register this listener by using | |
| {@link android.app.Application#registerOnProvideAssistDataListener(android.app.Application.OnProvideAssistDataListener) registerOnProvideAssistDataListener()}.</li> | |
| <li>In order to provide activity-specific contextual information, override the | |
| {@link android.app.Activity#onProvideAssistData(android.os.Bundle) onProvideAssistData()} | |
| callback and, optionally, the new | |
| {@link android.app.Activity#onProvideAssistContent(android.app.assist.AssistContent) onProvideAssistContent()} | |
| callback. | |
| </ol> | |
| <h2 id="notifications">Notifications</h2> | |
| <p>This preview adds the following API changes for notifications:</p> | |
| <ul> | |
| <li>New {@link android.app.NotificationManager#INTERRUPTION_FILTER_ALARMS} filter level that | |
| corresponds to the new <em>Alarms only</em> do not disturb mode.</li> | |
| <li>New {@link android.app.Notification#CATEGORY_REMINDER} category value that is used to | |
| distinguish user-scheduled reminders from other events | |
| ({@link android.app.Notification#CATEGORY_EVENT}) and alarms | |
| ({@link android.app.Notification#CATEGORY_ALARM}).</li> | |
| <li>New {@link android.graphics.drawable.Icon} class that you can attach to your notifications | |
| via the | |
| {@link android.app.Notification.Builder#setSmallIcon(android.graphics.drawable.Icon) setSmallIcon()} | |
| and {@link android.app.Notification.Builder#setLargeIcon(android.graphics.drawable.Icon) setLargeIcon()} | |
| methods. Similarly, the | |
| {@link android.app.Notification.Builder#addAction(int, java.lang.CharSequence, android.app.PendingIntent) | |
| addAction()} method now accepts an {@link android.graphics.drawable.Icon} object instead of a | |
| drawable resource ID.</li> | |
| <li>New {@link android.app.NotificationManager#getActiveNotifications()} method that allows your | |
| apps to find out which of their notifications are currently alive. To see an app implementation | |
| that uses this feature, see the <a href="https://github.com/googlesamples/android-ActiveNotifications" | |
| class="external-link">Active Notifications sample</a>.</li> | |
| </ul> | |
| <h2 id="bluetooth-stylus">Bluetooth Stylus Support</h2> | |
| <p>This preview provides improved support for user input using a Bluetooth stylus. Users can pair | |
| and connect a compatible Bluetooth stylus with their phone or tablet. While connected, position | |
| information from the touch screen is fused with pressure and button information from the stylus to | |
| provide a greater range of expression than with the touch screen alone. Your app can listen for | |
| stylus button presses and perform secondary actions, by registering | |
| {@link android.view.View.OnContextClickListener} and | |
| {@link android.view.GestureDetector.OnContextClickListener} objects in your activity.</p> | |
| <p>Use the {@link android.view.MotionEvent} methods and constants to detect stylus button | |
| interactions:</p> | |
| <ul> | |
| <li>If the user touches a stylus with a button on the screen of your app, the | |
| {@link android.view.MotionEvent#getToolType(int) getTooltype()} method returns | |
| {@link android.view.MotionEvent#TOOL_TYPE_STYLUS}.</li> | |
| <li>For apps targeting M Preview, the | |
| {@link android.view.MotionEvent#getButtonState() getButtonState()} | |
| method returns {@link android.view.MotionEvent#BUTTON_STYLUS_PRIMARY} when the user | |
| presses the primary stylus button. If the stylus has a second button, the same method returns | |
| {@link android.view.MotionEvent#BUTTON_STYLUS_SECONDARY} when the user presses it. If the user presses | |
| both buttons simultaneously, the method returns both values OR'ed together | |
| ({@link android.view.MotionEvent#BUTTON_STYLUS_PRIMARY}|{@link android.view.MotionEvent#BUTTON_STYLUS_SECONDARY}).</li> | |
| <li> | |
| For apps targeting a lower platform version, the | |
| {@link android.view.MotionEvent#getButtonState() getButtonState()} method returns | |
| {@link android.view.MotionEvent#BUTTON_SECONDARY} (for primary stylus button press), | |
| {@link android.view.MotionEvent#BUTTON_TERTIARY} (for secondary stylus button press), or both. | |
| </li> | |
| </ul> | |
| <h2 id="ble-scanning">Improved Bluetooth Low Energy Scanning</h2> | |
| <p> | |
| If your app performs performs Bluetooth Low Energy scans, use the new | |
| {@link android.bluetooth.le.ScanSettings.Builder#setCallbackType(int) setCallbackType()} | |
| method to specify that you want the system to notify callbacks when it first finds, or sees after a | |
| long time, an advertisement packet matching the set {@link android.bluetooth.le.ScanFilter}. This | |
| approach to scanning is more power-efficient than what’s provided in the previous platform version. | |
| </p> | |
| <h2 id="hotspot">Hotspot 2.0 Release 1 Support</h2> | |
| <p> | |
| This preview adds support for the Hotspot 2.0 Release 1 spec on Nexus 6 and Nexus 9 devices. To | |
| provision Hotspot 2.0 credentials in your app, use the new methods of the | |
| {@link android.net.wifi.WifiEnterpriseConfig} class, such as | |
| {@link android.net.wifi.WifiEnterpriseConfig#setPlmn(java.lang.String) setPlmn()} and | |
| {@link android.net.wifi.WifiEnterpriseConfig#setRealm(java.lang.String) setRealm()}. In the | |
| {@link android.net.wifi.WifiConfiguration} object, you can set the | |
| {@link android.net.wifi.WifiConfiguration#FQDN} and the | |
| {@link android.net.wifi.WifiConfiguration#providerFriendlyName} fields. | |
| The new {@link android.net.wifi.ScanResult#isPasspointNetwork()} method indicates if a detected | |
| network represents a Hotspot 2.0 access point. | |
| </p> | |
| <h2 id="4K-display">4K Display Mode</h2> | |
| <p>The platform now allows apps to request that the display resolution be upgraded to 4K rendering | |
| on compatible hardware. To query the current physical resolution, use the new | |
| {@link android.view.Display.Mode} APIs. If the UI is drawn at a lower logical resolution and is | |
| upscaled to a larger physical resolution, be aware that the physical resolution the | |
| {@link android.view.Display.Mode#getPhysicalWidth()} method returns may differ from the logical | |
| resolution reported by {@link android.view.Display#getSize(android.graphics.Point) getSize()}.</p> | |
| <p>You can request the system to change the physical resolution in your app as it runs, by setting | |
| the {@link android.view.WindowManager.LayoutParams#preferredDisplayModeId} property of your app’s | |
| window. This feature is useful if you want to switch to 4K display resolution. While in 4K display | |
| mode, the UI continues to be rendered at the original resolution (such as 1080p) and is upscaled to | |
| 4K, but {@link android.view.SurfaceView} objects may show content at the native resolution.</p> | |
| <h2 id="behavior-themeable-colorstatelists">Themeable ColorStateLists</h2> | |
| <p>Theme attributes are now supported in | |
| {@link android.content.res.ColorStateList} for devices running the M Preview. The | |
| {@link android.content.res.Resources#getColorStateList(int) getColorStateList()} and | |
| {@link android.content.res.Resources#getColor(int) getColor()} methods have been deprecated. If | |
| you are calling these APIs, call the new | |
| {@link android.content.Context#getColorStateList(int) getColorStateList()} or | |
| {@link android.content.Context#getColor(int) getColor()} methods instead. These methods are also | |
| available in the v4 appcompat library via {@link android.support.v4.content.ContextCompat}.</p> | |
| <h2 id="audio">Audio Features</h2> | |
| <p>This preview adds enhancements to audio processing on Android, including: </p> | |
| <ul> | |
| <li>Support for the <a href="http://en.wikipedia.org/wiki/MIDI" class="external-link">MIDI</a> | |
| protocol, with the new {@link android.media.midi} APIs. Use these APIs to send and receive MIDI | |
| events.</li> | |
| <li>New {@link android.media.AudioRecord.Builder} and {@link android.media.AudioTrack.Builder} | |
| classes to create digital audio capture and playback objects respectively, and configure audio | |
| source and sink properties to override the system defaults.</li> | |
| <li>API hooks for associating audio and input devices. This is particularly useful if your app | |
| allows users to start a voice search from a game controller or remote control connected to Android | |
| TV. The system invokes the new | |
| {@link android.app.Activity#onSearchRequested(android.view.SearchEvent) onSearchRequested()} | |
| callback when the user starts a search. To determine if the user's input device has a built-in | |
| microphone, retrieve the {@link android.view.InputDevice} object from that callback, then call the | |
| new {@link android.view.InputDevice#hasMicrophone()} method.</li> | |
| <li>New {@link android.media.AudioManager#getDevices(int) getDevices()} method which lets you | |
| retrieve a list of all audio devices currently connected to the system. You can also register an | |
| {@link android.media.AudioDeviceCallback} object if you want the system to notify your app | |
| when an audio device connects or disconnects.</li> | |
| </ul> | |
| <h2 id="video">Video Features</h2> | |
| <p>This preview adds new capabilities to the video processing APIs, including:</p> | |
| <ul> | |
| <li>New {@link android.media.MediaSync} class which helps applications to synchronously render | |
| audio and video streams. The audio buffers are submitted in non-blocking fashion and are | |
| returned via a callback. It also supports dynamic playback rate. | |
| </li> | |
| <li>New {@link android.media.MediaDrm#EVENT_SESSION_RECLAIMED} event, which indicates that a | |
| session opened by the app has been reclaimed by the resource manager. If your app uses DRM sessions, | |
| you should handle this event and make sure not to use a reclaimed session. | |
| </li> | |
| <li>New {@link android.media.MediaCodec.CodecException#ERROR_RECLAIMED} error code, which indicates | |
| that the resource manager reclaimed the media resource used by the codec. With this exception, the | |
| codec must be released, as it has moved to terminal state. | |
| </li> | |
| <li>New {@link android.media.MediaCodecInfo.CodecCapabilities#getMaxSupportedInstances() | |
| getMaxSupportedInstances()} interface to get a hint for the max number of the supported | |
| concurrent codec instances. | |
| </li> | |
| <li>New {@link android.media.MediaPlayer#setPlaybackParams(android.media.PlaybackParams) | |
| setPlaybackParams()} method to set the media playback rate for fast or | |
| slow motion playback. It also stretches or speeds up the audio playback automatically in | |
| conjunction with the video.</li> | |
| </ul> | |
| <h2 id="camera">Camera Features</h2> | |
| <p>This preview includes the following new APIs for accessing the camera’s flashlight and for | |
| camera reprocessing of images:</p> | |
| <h3 id="flashlight">Flashlight API</h3> | |
| <p>If a camera device has a flash unit, you can call the | |
| {@link android.hardware.camera2.CameraManager#setTorchMode(java.lang.String, boolean) setTorchMode()} | |
| method to switch the flash unit’s torch mode on or off without opening the camera device. The app | |
| does not have exclusive ownership of the flash unit or the camera device. The torch mode is turned | |
| off and becomes unavailable whenever the camera device becomes unavailable, or when other camera | |
| resources keeping the torch on become unavailable. Other apps can also call | |
| {@link android.hardware.camera2.CameraManager#setTorchMode(java.lang.String, boolean) setTorchMode()} | |
| to turn off the torch mode. When the last app that turned on the torch mode is closed, the torch | |
| mode is turned off.</p> | |
| <p>You can register a callback to be notified about torch mode status by calling the | |
| {@link android.hardware.camera2.CameraManager#registerTorchCallback(android.hardware.camera2.CameraManager.TorchCallback, android.os.Handler) registerTorchCallback()} | |
| method. The first time the callback is registered, it is immediately called with the torch mode | |
| status of all currently known camera devices with a flash unit. If the torch mode is turned on or | |
| off successfully, the | |
| {@link android.hardware.camera2.CameraManager.TorchCallback#onTorchModeChanged(java.lang.String, boolean) onTorchModeChanged()} | |
| method is invoked.</p> | |
| <h3 id="reprocessing">Reprocessing API</h3> | |
| <p>The {@link android.hardware.camera2 Camera2} API is extended to support YUV and private | |
| opaque format image reprocessing. To determine if these reprocessing capabilities are available, | |
| call {@link android.hardware.camera2.CameraManager#getCameraCharacteristics(java.lang.String) | |
| getCameraCharacteristics()} and check for the | |
| {@link android.hardware.camera2.CameraCharacteristics#REPROCESS_MAX_CAPTURE_STALL} key. If a | |
| device supports reprocessing, you can create a reprocessable camera capture session by calling | |
| <a href="/reference/android/hardware/camera2/CameraDevice.html#createReprocessableCaptureSession(android.hardware.camera2.params.InputConfiguration, java.util.List<android.view.Surface>, android.hardware.camera2.CameraCaptureSession.StateCallback, android.os.Handler)"><code>createReprocessableCaptureSession()</code></a>, | |
| and create requests for input buffer reprocessing.</p> | |
| <p>Use the {@link android.media.ImageWriter} class to connect the input buffer flow to the camera | |
| reprocessing input. To get an empty buffer, follow this programming model:</p> | |
| <ol> | |
| <li>Call the {@link android.media.ImageWriter#dequeueInputImage()} method.</li> | |
| <li>Fill the data into the input buffer.</li> | |
| <li>Send the buffer to the camera by calling the | |
| {@link android.media.ImageWriter#queueInputImage(android.media.Image) queueInputImage()} method.</li> | |
| </ol> | |
| <p>If you are using a {@link android.media.ImageWriter} object together with an | |
| {@link android.graphics.ImageFormat#PRIVATE} image, your app cannot access the image | |
| data directly. Instead, pass the {@link android.graphics.ImageFormat#PRIVATE} image directly to the | |
| {@link android.media.ImageWriter} by calling the | |
| {@link android.media.ImageWriter#queueInputImage(android.media.Image) queueInputImage()} method | |
| without any buffer copy.</p> | |
| <p>The {@link android.media.ImageReader} class now supports | |
| {@link android.graphics.ImageFormat#PRIVATE} format image streams. This support allows your app to | |
| maintain a circular image queue of {@link android.media.ImageReader} output images, select one or | |
| more images, and send them to the {@link android.media.ImageWriter} for camera reprocessing.</p> | |
| <h2 id="afw">Android for Work Features</h2> | |
| <p>This preview includes the following new APIs for Android for Work:</p> | |
| <ul> | |
| <li><strong>Enhanced controls for Corporate-Owned, Single-Use devices:</strong> The Device Owner | |
| can now control the following settings to improve management of | |
| Corporate-Owned, Single-Use (COSU) devices: | |
| <ul> | |
| <li>Disable or re-enable the keyguard with the | |
| {@link android.app.admin.DevicePolicyManager#setKeyguardDisabled(android.content.ComponentName, boolean) | |
| setKeyguardDisabled()} method.</li> | |
| <li>Disable or re-enable the status bar (including quick settings, notifications, and the | |
| navigation swipe-up gesture that launches Google Now) with the | |
| {@link android.app.admin.DevicePolicyManager#setStatusBarDisabled(android.content.ComponentName, boolean) setStatusBarDisabled()} | |
| method.</li> | |
| <li>Disable or re-enable safe boot with the {@link android.os.UserManager} constant | |
| {@link android.os.UserManager#DISALLOW_SAFE_BOOT}.</li> | |
| <li>Prevent the screen from turning off while plugged in with the | |
| {@link android.provider.Settings.Global#STAY_ON_WHILE_PLUGGED_IN} constant.</li> | |
| </ul> | |
| </li> | |
| <li><strong>Silent install and uninstall of apps by Device Owner:</strong> A Device Owner can now | |
| silently install and uninstall applications using the {@link android.content.pm.PackageInstaller} | |
| APIs, independent of Google Play for Work. You can now provision devices through a Device Owner that | |
| fetches and installs apps without user interaction. This feature is useful for enabling one-touch | |
| provisioning of kiosks or other such devices without activating a Google account.</li> | |
| <li><strong>Silent enterprise certificate access: </strong> When an app calls | |
| {@link android.security.KeyChain#choosePrivateKeyAlias(android.app.Activity,android.security.KeyChainAliasCallback,java.lang.String[],java.security.Principal[],java.lang.String,int,java.lang.String) choosePrivateKeyAlias()}, | |
| prior to the user being prompted to select a certificate, the Profile or Device Owner can now call | |
| the {@link android.app.admin.DeviceAdminReceiver#onChoosePrivateKeyAlias(android.content.Context, android.content.Intent, int, android.net.Uri, java.lang.String) onChoosePrivateKeyAlias()} | |
| method to provide the alias silently to the requesting application. This feature lets you grant | |
| managed apps access to certificates without user interaction.</li> | |
| <li><strong>Auto-acceptance of system updates.</strong> By setting a system update policy with | |
| {@link android.app.admin.DevicePolicyManager#setSystemUpdatePolicy(android.content.ComponentName, android.app.admin.SystemUpdatePolicy) setSystemUpdatePolicy()}, | |
| a Device Owner can now auto-accept a system | |
| update, for instance in the case of a kiosk device, or postpone the update and prevent it being | |
| taken by the user for up to 30 days. Furthermore, an administrator can set a daily time window in | |
| which an update must be taken, for example during the hours when a kiosk device is not in use. When | |
| a system update is available, the system checks if the Work Policy Controller app has set a system | |
| update policy, and behaves accordingly. | |
| </li> | |
| <li> | |
| <strong>Delegated certificate installation:</strong> A Profile or Device Owner can now grant a | |
| third-party app the ability to call these {@link android.app.admin.DevicePolicyManager} certificate | |
| management APIs: | |
| <ul> | |
| <li>{@link android.app.admin.DevicePolicyManager#getInstalledCaCerts(android.content.ComponentName) | |
| getInstalledCaCerts()}</li> | |
| <li>{@link android.app.admin.DevicePolicyManager#hasCaCertInstalled(android.content.ComponentName,byte[]) | |
| hasCaCertInstalled()}</li> | |
| <li>{@link android.app.admin.DevicePolicyManager#installCaCert(android.content.ComponentName,byte[]) | |
| installCaCert()}</li> | |
| <li>{@link android.app.admin.DevicePolicyManager#uninstallCaCert(android.content.ComponentName,byte[]) | |
| uninstallCaCert()}</li> | |
| <li>{@link android.app.admin.DevicePolicyManager#uninstallAllUserCaCerts(android.content.ComponentName) | |
| uninstallAllUserCaCerts()}</li> | |
| <li>{@link android.app.admin.DevicePolicyManager#installKeyPair(android.content.ComponentName,java.security.PrivateKey,java.security.cert.Certificate,java.lang.String) | |
| installKeyPair()}</li> | |
| </ul> | |
| </li> | |
| <img src="{@docRoot}preview/images/work-profile-screen.png" | |
| srcset="{@docRoot}preview/images/work-profile-screen.png 1x, {@docRoot}preview/images/work-profile-screen_2x.png 2x" | |
| style="float:right; margin:0 0 10px 20px" width="282" height="476" /> | |
| <li><strong>Data usage tracking.</strong> A Profile or Device Owner can now query for the | |
| data usage statistics visible in <strong>Settings > Data</strong> usage by using the new | |
| {@link android.app.usage.NetworkStatsManager} methods. Profile Owners are automatically granted | |
| permission to query data on the profile they manage, while Device Owners get access to usage data | |
| of the managed primary user.</li> | |
| <li><strong>Runtime permission management:</strong> | |
| <p>A Profile or Device Owner can set a permission policy | |
| for all runtime requests of all applications using | |
| {@link android.app.admin.DevicePolicyManager#setPermissionPolicy(android.content.ComponentName, int) | |
| setPermissionPolicy()}, to either prompt the user to grant the permission or automatically grant or | |
| deny the permission silently. If the latter policy is set, the user cannot | |
| modify the selection made by the Profile or Device Owner within the app’s permissions screen in | |
| <strong>Settings</strong>.</p></li> | |
| <li><strong>VPN in Settings:</strong> VPN apps are now visible in | |
| <strong>Settings > More > VPN</strong>. | |
| Additionally, the notifications that accompany VPN usage are now specific to how that VPN is | |
| configured. For Profile Owner, the notifications are specific to whether the VPN is configured | |
| for a managed profile, a personal profile, or both. For a Device Owner, the notifications are | |
| specific to whether the VPN is configured for the entire device.</li> | |
| <li><strong>Work status notification:</strong> A status bar briefcase icon now appears whenever | |
| an app from the managed profile has an activity in the foreground. Furthermore, if the device is | |
| unlocked directly to the activity of an app in the managed profile, a toast is displayed notifying | |
| the user that they are within the work profile. | |
| </li> | |
| </ul> | |
| <p class="note"> | |
| For a detailed view of all API changes in the M Developer Preview, see the <a href= | |
| "{@docRoot}preview/download.html">API Differences Report</a>. | |
| </p> |