page.title=API Overview page.keywords=preview,sdk,compatibility sdk.platform.apiLevel=22-mnc page.image=images/cards/card-key-changes_16-9_2x.png @jd:body
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.
The M Developer Preview is intended for developer early adopters and testers. If you are interested in influencing the direction of the Android framework, give the M Developer Preview a try and send us your feedback!
Caution: Do not not publish apps that use the M Developer Preview to the Google Play store.
Note: This document often refers to classes and methods that do not yet have reference material available on developer.android.com. These API elements are formatted in {@code code style} in this document (without hyperlinks). For the preliminary API documentation for these elements, download the preview reference.
If you have previously published an app for Android, be aware that your app might be affected by changes in M.
Please see Behavior Changes for complete information.
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.
To learn how this feature works and how to configure what to back up on the file system, see the App Backup for Apps guide.
M adds the following API changes for notifications:
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 Android Keystore system.
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.
To use this feature in your app, first add the {@code USE_FINGERPRINT} permission in your manifest.
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
The following snippet shows how you might listen for fingerprint events in your {@code FingerprintManager.AuthenticationCallback} implementation.
// 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); } // 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() && mFingerprintManager.hasEnrolledFingerprints(); }
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.
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.
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.
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); } }
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.
This release provides you with APIs to makes sharing intuitive and quick for users. You can now define deep links that target a specific activity in your app. These deep links are exposed to users via the Share 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.
To enable sharing via deep links, you must define a class that extends the
{@code android.service.}
{@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.
The following example shows how you might declare the {@code ChooserTargetService} in your manifest.
<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>
For each activity that you want to expose to the {@code ChooserTargetService}, add a {@code <meta-data>} element with the name {@code "android.service.chooser.chooser_target_service"} in your app manifest.
<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>
This release provides a new voice interaction API which, together with Voice Actions, 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.
To learn more about implementing voice actions, see the voice interaction API guide.
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.
This release adds enhancements to audio processing on Android, including:
This release includes the following new APIs for Android for Work:
For a detailed view of all API changes in the M Developer Preview, see the API Differences Report.