Bug: 24062075 Change-Id: I74287445d2268d0cc3752f09b8e326d210d84444 Staged: https://x20web.corp.google.com/~katarina/Android%206.0%20Changes%20_%20Android%20Developers.html https://x20web.corp.google.com/~katarina/Android%206.0%20APIs%20_%20Android%20Developers.html
606 lines
35 KiB
Plaintext
606 lines
35 KiB
Plaintext
page.title=Android 6.0 APIs
|
||
page.keywords=marshmallow,sdk,compatibility
|
||
page.tags=androidm,marshmallow
|
||
sdk.platform.apiLevel=23
|
||
page.image=images/cards/card-api-overview_16-9_2x.png
|
||
page.metaDescription=Get to know the new developer features in Android 6.0 Marshmallow.
|
||
@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="#fingerprint-authentication">Fingerprint Authentication</a></li>
|
||
<li><a href="#confirm-credential">Confirm Credential</a></li>
|
||
<li><a href="#app-linking">App Linking</a></li>
|
||
<li><a href="#backup">Auto Backup for Apps</a></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="#adoptable-storage">Adoptable Storage</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 »</a> </li>
|
||
</ol>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<p>Android 6.0 (<a href="{@docRoot}reference/android/os/Build.VERSION_CODES.html#M">M</a>)
|
||
offers new features for users and app developers. This document provides an introduction to the
|
||
most notable APIs.</p>
|
||
|
||
<h3 id="Start">Start developing</h3>
|
||
|
||
<p>To start building apps for Android 6.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 6.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>
|
||
|
||
<h2 id="fingerprint-authentication">Fingerprint Authentication</h2>
|
||
|
||
<p>This release offers new APIs to let you authenticate users by using their fingerprint scans on
|
||
supported devices, Use these APIs in conjunction with
|
||
the <a href="{@docRoot}training/articles/keystore.html">Android Keystore system</a>.</p>
|
||
|
||
<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="{@docRoot}samples/FingerprintDialog/index.html">Fingerprint Dialog sample</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}images/android-6.0/fingerprint-screen.png"
|
||
srcset="{@docRoot}images/android-6.0/fingerprint-screen.png 1x, {@docRoot}images/android-6.0/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="{@docRoot}samples/FingerprintDialog/index.html">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>
|
||
|
||
<h2 id="confirm-credential">Confirm Credential</h2>
|
||
<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="{@docRoot}samples/ConfirmCredential/index.html">
|
||
Confirm Credential sample</a>.</p>
|
||
|
||
<h2 id="app-linking">App Linking</h2>
|
||
<p>This release 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}training/app-links/index.html">Handling App Links</a>.
|
||
|
||
<h2 id="backup">Auto Backup for Apps</h2>
|
||
<p>The system now performs automatic full data backup and restore for apps. Your app must target
|
||
Android 6.0 (API level 23) 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}training/backup/autosyncapi.html">Configuring Auto Backup for Apps</a>.</p>
|
||
|
||
<h2 id="direct-share">Direct Share</h2>
|
||
|
||
<img src="{@docRoot}images/android-6.0/direct-share-screen.png"
|
||
srcset="{@docRoot}images/android-6.0/direct-share-screen.png 1x, {@docRoot}images/android-6.0/direct-share-screen_2x.png 2x"
|
||
style="float:right; margin:0 0 20px 30px" width="312" height="329" />
|
||
|
||
<p>This release 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 release 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 release 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="adoptable-storage">Adoptable Storage Devices</h2>
|
||
<p>
|
||
With this release, users can <em>adopt</em> external storage devices such as SD cards. Adopting an
|
||
external storage device encrypts and formats the device to behave like internal storage. This
|
||
feature allows users to move both apps and private data of those apps between storage devices. When
|
||
moving apps, the system respects the
|
||
<a href="{@docRoot}guide/topics/manifest/manifest-element.html#install">{@code android:installLocation}</a>
|
||
preference in the manifest.</p>
|
||
|
||
<p>If your app accesses the following APIs or fields, be aware that the file paths they return
|
||
will dynamically change when the app is moved between internal and external storage devices.
|
||
When building file paths, it is strongly recommended that you always call these APIs dynamically.
|
||
Don’t use hardcoded file paths or persist fully-qualified file paths that were built previously.</p>
|
||
|
||
<ul>
|
||
<li>{@link android.content.Context} methods:
|
||
<ul>
|
||
<li>{@link android.content.Context#getFilesDir() getFilesDir()}</li>
|
||
<li>{@link android.content.Context#getCacheDir() getCacheDir()}</li>
|
||
<li>{@link android.content.Context#getCodeCacheDir() getCodeCacheDir()}</li>
|
||
<li>{@link android.content.Context#getDatabasePath(java.lang.String) getDatabasePath()}</li>
|
||
<li>{@link android.content.Context#getDir(java.lang.String,int) getDir()}</li>
|
||
<li>{@link android.content.Context#getNoBackupFilesDir() getNoBackupFilesDir()}</li>
|
||
<li>{@link android.content.Context#getFileStreamPath(java.lang.String) getFileStreamPath()}</li>
|
||
<li>{@link android.content.Context#getPackageCodePath() getPackageCodePath()}</li>
|
||
<li>{@link android.content.Context#getPackageResourcePath() getPackageResourcePath()}</li>
|
||
</ul>
|
||
</li>
|
||
<li>{@link android.content.pm.ApplicationInfo} fields:
|
||
<ul>
|
||
<li>{@link android.content.pm.ApplicationInfo#dataDir dataDir}</li>
|
||
<li>{@link android.content.pm.ApplicationInfo#sourceDir sourceDir}</li>
|
||
<li>{@link android.content.pm.ApplicationInfo#nativeLibraryDir nativeLibraryDir}</li>
|
||
<li>{@link android.content.pm.ApplicationInfo#publicSourceDir publicSourceDir}</li>
|
||
<li>{@link android.content.pm.ApplicationInfo#splitSourceDirs splitSourceDirs}</li>
|
||
<li>{@link android.content.pm.ApplicationInfo#splitPublicSourceDirs splitPublicSourceDirs}</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
|
||
<p>To debug this feature, you can enable adoption of a USB drive that is
|
||
connected to an Android device through a USB On-The-Go (OTG) cable, by running this command:</p>
|
||
|
||
<pre class="no-prettyprint">
|
||
$ adb shell sm set-force-adoptable true
|
||
</pre>
|
||
|
||
<h2 id="notifications">Notifications</h2>
|
||
<p>This release 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="{@docRoot}samples/ActiveNotifications/index.html">Active Notifications sample</a>.</li>
|
||
</ul>
|
||
|
||
<h2 id="bluetooth-stylus">Bluetooth Stylus Support</h2>
|
||
<p>This release 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 Android 6.0 (API level 23), 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 release 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 on Android 6.0 (API level 23). The
|
||
{@link android.content.res.Resources#getColorStateList(int) Resources.getColorStateList()} and
|
||
{@link android.content.res.Resources#getColor(int) Resources.getColor()} methods have been
|
||
deprecated. If you are calling these APIs, call the new
|
||
{@link android.content.Context#getColorStateList(int) Context.getColorStateList()} or
|
||
{@link android.content.Context#getColor(int) Context.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 release 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 release 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 release 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 release 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 device 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}images/android-6.0/work-profile-screen.png"
|
||
srcset="{@docRoot}images/android-6.0/work-profile-screen.png 1x, {@docRoot}images/android-6.0/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>
|