summaryrefslogtreecommitdiffstats
path: root/docs/html/preview/api-overview.jd
diff options
context:
space:
mode:
Diffstat (limited to 'docs/html/preview/api-overview.jd')
-rw-r--r--docs/html/preview/api-overview.jd358
1 files changed, 303 insertions, 55 deletions
diff --git a/docs/html/preview/api-overview.jd b/docs/html/preview/api-overview.jd
index dde3c7b..b207e35 100644
--- a/docs/html/preview/api-overview.jd
+++ b/docs/html/preview/api-overview.jd
@@ -1,6 +1,6 @@
page.title=API Overview
page.keywords=preview,sdk,compatibility
-sdk.platform.apiLevel=22
+sdk.platform.apiLevel=23
@jd:body
@@ -13,24 +13,24 @@ sdk.platform.apiLevel=22
<span class="less" style="display:none">show less</span></a></h2>
<ol id="toc44" class="hide-nested">
- <li><a href="#">Important Behavior Changes</a>
- <ol>
- <li><a href="#">change 1</a></li>
- <li><a href="#">change 2</a></li>
- </ol>
- </li>
- <li><a href="#">Feature Group 1</a>
- <ol>
- <li><a href="#">change 1</a></li>
- <li><a href="#">change 2</a></li>
- </ol>
- </li>
- <li><a href="#">Feature Group 2</a>
- <ol>
- <li><a href="#">change 1</a></li>
- <li><a href="#">change 2</a></li>
- </ol>
+ <li><a href="#backup">Auto Backup for Apps</a></li>
+ <li><a href="#notifications">Notifications</a></li>
+ <li><a href="#authentication">Authentication</a>
+ <ul>
+ <li><a href="#fingerprint-authentication">Fingerprint Authentication</a></li>
+ <li><a href="#confirm-credentials">Confirm Credentials</a></li>
+ </ul>
</li>
+ <li><a href="#direct-share">Direct Share</a></li>
+ <li><a href="#voice-interactions">Voice Interactions</a></li>
+ <li><a href="#bluetooth-stylus">Bluetooth Stylus Support</a></li>
+ <li><a href="#audio">New Audio Features</a></li>
+ <li><a href="#afw">New Android for Work Features</a></li>
+</ol>
+
+<h2>API Differences</h2>
+<ol>
+<li><a href="">API level 22 to M &raquo;</a> </li>
</ol>
</div>
@@ -54,65 +54,313 @@ methods that do not yet have reference material available on <a
href="{@docRoot}">developer.android.com</a>. These API elements are
formatted in {@code code style} in this document (without hyperlinks). For the
preliminary API documentation for these elements, download the <a
-href="http://storage.googleapis.com/androiddevelopers/preview/l-developer-preview-reference.zip">preview
-reference</a>.</p>
+href="http://storage.googleapis.com/androiddevelopers/preview/m-developer-preview-reference.zip">
+preview reference</a>.</p>
-<h2 id="Behaviors">Important Behavior Changes</h2>
+<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 upcoming release.</p>
+<p>If you have previously published an app for Android, be aware that your app might be affected
+by changes in M.</p>
-<h3 id="id">Behavior Change 1</h3>
+<p>Please see <a href="api-changes.html">Behavior Changes</a> for complete information.</p>
-<p>
- Bacon ipsum dolor amet biltong picanha t-bone, jowl salami tri-tip jerky kielbasa sirloin boudin
- porchetta fatback cow meatloaf capicola. Short ribs kielbasa pig drumstick rump boudin jowl chuck
- beef ribs doner tenderloin biltong swine.
+<h2 id="backup">Auto Backup for Apps</h2>
+<p>The system now performs automatic full data backup and restore for apps. This behavior is
+enabled by default for apps targeting M; you do not need to add any additional code. If users
+delete their Google account, their backup data is deleted as well.</p>
+<p>To learn how this feature works and how to configure what to back up on the file system,
+see the <a href="">App Backup for Apps guide</a>.</p>
+
+<h2 id="notifications">Notifications</h2>
+<p>M adds the following API changes for notifications:</p>
+<ul>
+ <li>New {@code NotificationListenerService.INTERRUPTION_FILTER_ALARMS} filter level that
+ corresponds to the new <em>Alarms only</em> do not disturb mode.</li>
+ <li>New {@code 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 {@code android.graphics.drawable.Icon} class which can be attached to your notifications
+ via the Notification.Builder.setIcon() and Notification.Builder.setLargeIcon() methods.</li>
+ <li>New {@code NotificationManager.getActiveNotifications()} method that allows your apps to
+ find out which of their notifications are currently alive.</li>
+</ul>
+
+<h2 id="authentication">Authentication</h2>
+<p>The M release 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
+{@code android.hardware.fingerprint.FingerprintManager} class and call the
+{@code FingerprintManager.authenticate()} method. Your app must be running on a device with a
+fingerprint sensor. You must implement the user interface for the fingerprint
+authentication flow on your app, and use the standard fingerprint Android icon in your UI.
+If you are developing multiple apps that use fingerprint authentication, note that each app must
+authenticate the user’s fingerprint independently.
</p>
+<img src="{@docRoot}preview/images/fingerprint-screen_2x.png"
+srcset="{@docRoot}preview/images/fingerprint-screen.png 1x, preview/images/fingerprint-screen_2x.png 2x"
+style="margin:0 0 10px 20px" width="282" height="476" />
+<p>To use this feature in your app, first add the {@code USE_FINGERPRINT} permission in your
+manifest.</p>
-<h2 id="id">Feature Group 1</h2>
+<pre>
+&lt;uses-permission
+ android:name="android.permission.USE_FINGERPRINT" /&gt;
+</pre>
-<h3 id="id">Feature item 1</h3>
+<p>The following snippet shows how you might listen for fingerprint events in your
+{@code FingerprintManager.AuthenticationCallback} implementation.</p>
-<p>
- Bacon ipsum dolor amet landjaeger capicola tail sausage shank swine biltong pork andouille t-bone
- alcatra chicken. Strip steak bacon tongue beef bresaola landjaeger. Shankle boudin pork belly
- jowl pig. Rump swine ham hock frankfurter pork shankle. Shank corned beef alcatra doner flank
- turducken. Tongue brisket ham shoulder:
-</p>
+<pre>
+// Call this to start listening for fingerprint events
+public void startListening(FingerprintManager.CryptoObject cryptoObject) {
+ if (!isFingerprintAuthAvailable()) {
+ return;
+ }
+ mCancellationSignal = new CancellationSignal();
+ mSelfCancelled = false;
+ mFingerprintManager.authenticate(cryptoObject,
+ mCancellationSignal, this, 0 /* flags */);
+ // Icon to display when prompting users to start a fingerprint scan
+ mIcon.setImageResource(R.drawable.ic_fp_40px);
+}
-<h3 id="id">Feature item 2</h3>
+// Helper method to check if the device supports fingerprint
+// scanning and if the user has enrolled at least one fingerprint.
+public boolean isFingerprintAuthAvailable() {
+ return mFingerprintManager.isHardwareDetected()
+ &amp;&amp; mFingerprintManager.hasEnrolledFingerprints();
+}
+</pre>
-<p>
- Bacon ipsum dolor amet landjaeger capicola tail sausage shank swine biltong pork andouille t-bone
- alcatra chicken. Strip steak bacon tongue beef bresaola landjaeger. Shankle boudin pork belly
- jowl pig. Rump swine ham hock frankfurter pork shankle. Shank corned beef alcatra doner flank
- turducken. Tongue brisket ham shoulder:
-</p>
+<h3 id="confirm-credentials">Confirm Credentials</h3>
+<p>Your app can authenticate users based on how recently they last unlocked their device. You can
+use the same public or secret key to authenticate users into multiple apps. 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.</p>
-<h2 id="id">Feature Group 2</h2>
+<p>You can set your own authentication policy by setting constraints against the key that you are
+generating or importing. To set the constraints for using a key, use the
+{@code android.security.KeyPairGeneratorSpec.Builder} and
+{@code android.security.KeyGeneratorSpec.Builder} classes for public key pairs and secret keys
+respectively. If you are importing keys, use the {@link android.security.KeyStoreParameter.Builder}
+class to set your constraints.</p>
-<h3 id="id">Feature item 1</h3>
+<p>The following example shows how you might create a symmetric key in the Keystore which can only be
+used if the user has successfully unlocked the device within the last 5 minutes.</p>
-<p>
- Bacon ipsum dolor amet landjaeger capicola tail sausage shank swine biltong pork andouille t-bone
- alcatra chicken. Strip steak bacon tongue beef bresaola landjaeger. Shankle boudin pork belly
- jowl pig. Rump swine ham hock frankfurter pork shankle. Shank corned beef alcatra doner flank
- turducken. Tongue brisket ham shoulder:
+<pre>
+private void createKey() {
+ // Generate a key to decrypt payment credentials, tokens, etc.
+ // This will most likely be a registration step for the user when
+ // they are setting up your app.
+ try {
+ KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
+ ks.load(null);
+ KeyGenerator keyGenerator = KeyGenerator.getInstance("AES",
+ "AndroidKeyStore");
+ keyGenerator.init(new KeyGeneratorSpec.Builder(this)
+ // Alias of the entry in Android KeyStore where the key will appear
+ .setAlias(KEY_NAME)
+ // Key use constraints
+ .setPurposes(KeyStoreKeyProperties.Purpose.ENCRYPT
+ | KeyStoreKeyProperties.Purpose.DECRYPT)
+ .setBlockModes("CBC")
+ .setUserAuthenticationRequired(true)
+ // Require that the user has unlocked in the last 5 minutes
+ .setUserAuthenticationValidityDurationSeconds(5 * 60)
+ .setEncryptionPaddings("PKCS7Padding")
+ .build());
+ keyGenerator.generateKey();
+ } catch (NoSuchAlgorithmException | NoSuchProviderException
+ | InvalidAlgorithmParameterException | KeyStoreException
+ | CertificateException | IOException e) {
+ throw new RuntimeException(e);
+ }
+}
+</pre>
+
+<p>To determine the last time users logged into their account, call the
+{@code android.accounts.AccountManager.confirmCredentials()} method. If the call is successful, the
+method returns an bundle that includes a {@code KEY_LAST_AUTHENTICATED_TIME} value which indicates
+the last time, in milliseconds, that the credential for that account was validated or created.</p>
+
+<h2 id="direct-share">Direct Share</h2>
+
+<img src="{@docRoot}preview/images/direct-share-screen_2x.png"
+srcset="{@docRoot}preview/images/direct-share-screen.png 1x, preview/images/direct-share-screen_2x.png 2x"
+style="float:right; margin:0 0 20px 30px" width="312" height="385" />
+
+<p>This release provides you with APIs to makes sharing intuitive and quick for users. You can now
+define <em>deep links</em> that target a specific activity in your app. These deep links 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 deep link 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 sharing via deep links, you must define a class that extends the
+{@code android.service.} <br>
+{@code chooser.ChooserTargetService} class. Declare your
+{@code ChooserTargetService} in the manifest. Within that declaration, specify the
+{@code BIND_CHOOSER_TARGET_SERVICE} permission and an intent filter with the
+{@code SERVICE_INTERFACE} action.</p>
+<p>The following example shows how you might declare the {@code ChooserTargetService} in your
+manifest.</p>
+<br>
+<br>
+<br>
+<pre>
+&lt;service android:name=".ChooserTargetService"
+ android:label="&#64;string/service_name"
+ android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE"&gt;
+ &lt;intent-filter&gt;
+ &lt;action android:name="android.service.chooser.ChooserTargetService" /&gt;
+ &lt;/intent-filter&gt;
+&lt;/service&gt;
+</pre>
+
+<p>For each activity that you want to expose to the {@code ChooserTargetService}, add a
+{@code &lt;meta-data&gt;} element with the name
+{@code "android.service.chooser.chooser_target_service"} in your app manifest.
</p>
-<h3 id="id">Feature item 2</h3>
+<pre>
+&lt;activity android:name=".MyShareActivity”
+ android:label="&#64;string/share_activity_label"&gt;
+ &lt;intent-filter>
+ &lt;action android:name="android.intent.action.SEND" /&gt;
+ &lt;/intent-filter>
+&lt;meta-data
+ android:name="android.service.chooser.chooser_target_service"
+ android:value=".ChooserTargetService" /&gt;
+&lt;/activity>
+</pre>
+<h2 id="voice-interactions">Voice Interactions</h2>
<p>
- Bacon ipsum dolor amet landjaeger capicola tail sausage shank swine biltong pork andouille t-bone
- alcatra chicken. Strip steak bacon tongue beef bresaola landjaeger. Shankle boudin pork belly
- jowl pig. Rump swine ham hock frankfurter pork shankle. Shank corned beef alcatra doner flank
- turducken. Tongue brisket ham shoulder:
+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
+{@code android.app.Activity.isVoiceInteraction()} method to determine if your activity was
+started in response to a voice action. If so, your app can use the
+{@code android.app.VoiceInteractor} class to request a voice confirmation from the user, select
+from a list of options, and more.</p>
+<p>To learn more about implementing voice actions, see the voice interaction API
+<a href="https://developers.google.com/voice-actions/interaction/"
+class="external-link">guide</a>.
</p>
+<h2 id="bluetooth-stylus">Bluetooth Stylus Support</h2>
+<p>The M release provides improved support for user input using a Bluetooth stylus. If the user
+touches a stylus with a button on the screen of your app, the
+{@link android.view.MotionEvent#getToolType(int) getTooltype()} method now returns
+{@code TOOL_TYPE_STYLUS}. The {@link android.view.MotionEvent#getButtonState() getButtonState()}
+method returns {@link android.view.MotionEvent#BUTTON_SECONDARY} when the user
+presses the primary stylus button. If the stylus has a second button, the same method returns
+{@link android.view.MotionEvent#BUTTON_TERTIARY} when the user presses it. If the user presses
+both buttons simultaneously, the method returns both these values. In addition, the system reports
+the user button-press action to the new {@code View.onStylusButtonPressListener} and
+{@code GestureDetector.OnStylusButtonPressListener} callbacks in your activity, if you have
+registered these listeners in your app.</p>
+
+<h2 id="audio">New 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 {@code android.media.midi} APIs. Use these APIs to send and receive MIDI
+events.</li>
+ <li>New {@code android.media.AudioRecord.Builder} and {@code 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 {@code android.app.Activity.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
+{@code InputDevice.hasMic()} method.</li>
+ <li>New {@code android.media.AudioDevicesManager} class which lets you retrieve a list of all
+attached source and sink audio devices. You can also specify an
+{@code android.media.OnAudioDeviceConnectionListener} object if you want your app to be notified
+when an audio device is connected or disconnected.</li>
+</ul>
+
+<h2 id="afw">New 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
+{@code DevicePolicyManager.setKeyguardEnabledState()} 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
+{@code DevicePolicyManager.setStatusBarEnabledState()} method.</li>
+ <li>Disable or re-enable safe boot with the {@link android.os.UserManager} constant
+{@code DISALLOW_SAFE_BOOT}.</li>
+ <li>Prevent the screen from turning off while plugged in with the
+ {@link android.provider.Settings.Global} constant {@code STAY_ON_WHILE_PLUGGED_IN}.</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 {@code DeviceAdminReceiver.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
+{@code DevicePolicyManager.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 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>
+<li><strong>Enterprise factory reset protection.</strong> When provisioning a Device Owner, you can
+now configure parameters for bypassing Factory Reset Protection (FRP), by setting the
+{@code DeviceManagerPolicy.EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS} bundle. An NFC Programmer
+app can provide these parameters after a device has been reset to bypass FRP and provision the device,
+without requiring the previously configured Google account. If you don't modify these parameters,
+FRP remains in-place and prevents the device from being activated without the previously activated
+Google credentials.</li>
+<li><strong>Data usage tracking.</strong> A Profile or Device Owner can now query for the data
+usage statistics visible in <em>Settings > Data</em> usage by using the new
+{@code 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>
+</ul>
<p class="note">
For a detailed view of all API changes in the M Developer Preview, see the <a href=