| page.title=Behavior Changes |
| page.keywords=preview,sdk,compatibility |
| sdk.platform.apiLevel=MNC |
| @jd:body |
| |
| <div id="qv-wrapper"> |
| <div id="qv"> |
| |
| <h2>In this document</h2> |
| |
| <ol id="toc44" class="hide-nested"> |
| <li><a href="#behavior-runtime-permissions">Runtime Permissions</a></li> |
| <li><a href="#behavior-power">Power-Saving Optimizations</a></li> |
| <li><a href="#behavior-adoptable-storage">Adoptable Storage Devices</a></li> |
| <li><a href="#behavior-apache-http-client">Apache HTTP Client Removal</a></li> |
| <li><a href="#behavior-audiomanager-Changes">AudioManager Changes</a></li> |
| <li><a href="#behavior-notifications">Notifications</a></li> |
| <li><a href="#behavior-test-selection">Text Selection</a></li> |
| <li><a href="#behavior-keystore">Android Keystore Changes</a></li> |
| <li><a href="#behavior-network">Wi-Fi and Networking Changes</a></li> |
| <li><a href="#behavior-camera">Camera Service Changes</a></li> |
| <li><a href="#behavior-runtime">Runtime</a></li> |
| <li><a href="#behavior-hardware-id">Access to Hardware Identifier</a></li> |
| <li><a href="#behavior-apk-validation">APK Validation</a></li> |
| <li><a href="#behavior-usb">USB Connection</a></li> |
| <li><a href="#behavior-afw">Android for Work Changes</a></li> |
| </ol> |
| |
| <h2>API Differences</h2> |
| <ol> |
| <li><a href="{@docRoot}preview/download.html">API level 22 to M Preview »</a> </li> |
| </ol> |
| |
| |
| <h2>See Also</h2> |
| <ol> |
| <li><a href="{@docRoot}preview/api-overview.html">M Developer Preview API Overview</a> </li> |
| </ol> |
| |
| </div> |
| </div> |
| |
| <p>Along with new features and capabilities, the M Developer Preview includes a variety of |
| system changes and API behavior changes. This document highlights |
| some of the key changes that you should understand and account for in your apps.</p> |
| |
| <p>If you have previously published an app for Android, be aware that these changes in the |
| platform affect your app.</p> |
| |
| <h2 id="behavior-runtime-permissions">Runtime Permissions</h1> |
| <p>This preview introduces a new permissions model, where users can now directly manage |
| app permissions at runtime. This model gives users improved visibility and control over |
| permissions, while streamlining the installation and auto-update processes for app developers. |
| Users can grant or revoke permissions individually for installed apps. </p> |
| |
| <p>On your apps that target the M Preview release or higher, make sure to check for and request |
| permissions at runtime. To determine if your app has been granted a permission, call the |
| new {@link android.content.Context#checkSelfPermission(java.lang.String) checkSelfPermission()} |
| method. To request a permission, call the new |
| {@link android.app.Activity#requestPermissions(java.lang.String[], int) requestPermissions()} |
| method. Even if your app is not targeting the M Preview release, you should test your app under |
| the new permissions model.</p> |
| |
| <p>For details on supporting the new permissions model in your app, see the |
| <a href="{@docRoot}preview/features/runtime-permissions.html"> |
| Permissions</a> developer preview page. For tips on how to assess the impact on your app, |
| see the <a href="{@docRoot}preview/testing/guide.html#runtime-permissions">Testing Guide</a></p> |
| |
| <h2 id="behavior-power">Power-Saving Optimizations</h2> |
| <p>This preview introduces new power-saving optimizations for idle devices and apps.</p> |
| <ul> |
| <li><strong>Doze</strong>: If a user unplugs a device and leaves it stationary, with its screen off, |
| for a period of time, the device goes into <em>Doze</em> mode, where it attempts to keep the system |
| in a sleep state. In this mode, devices periodically resume normal operations for brief periods of |
| time so that app syncing can occur and the system can perform any pending operations. |
| <li><strong>App Standby</strong>: App Standby allows the system to determine that an app is idle |
| when the user is not actively using it. The system makes this determination when the user does not |
| touch the app for a certain period of time. If the device is unplugged, the system disables network |
| access and suspends syncs and jobs for the apps it deems idle.</li> |
| </ul> |
| |
| <p>To learn more about these power-saving changes, see |
| <a href="{@docRoot}preview/features/power-mgmt.html">Power-Saving Optimizations</a>.</p> |
| |
| <h2 id="behavior-adoptable-storage">Adoptable Storage Devices</h2> |
| <p> |
| With this preview, 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 in the developer preview, 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="behavior-apache-http-client">Apache HTTP Client Removal</h2> |
| <p>This preview removes support for the Apache HTTP client. If your app is using this client and |
| targets Android 2.3 (API level 9) or higher, use the {@link java.net.HttpURLConnection} class |
| instead. This API is more efficient because it reduces network use through transparent compression |
| and response caching, and minimizes power consumption. To continue using the Apache HTTP APIs, you |
| must first declare the following compile-time dependency in your {@code build.gradle} file: |
| </p> |
| <pre> |
| android { |
| useLibrary 'org.apache.http.legacy' |
| } |
| </pre> |
| <p>Android is moving away from OpenSSL to the |
| <a href="https://boringssl.googlesource.com/boringssl/" class="external-link">BoringSSL</a> |
| library. If you’re using the Android NDK in your app, don't link against cryptographic libraries |
| that are not a part of the NDK API, such as {@code libcrypto.so} and {@code libssl.so}. These |
| libraries are not public APIs, and may change or break without notice across releases and devices. |
| In addition, you may expose yourself to security vulnerabilities. Instead, modify your |
| native code to call the Java cryptography APIs via JNI or to statically link against a |
| cryptography library of your choice.</p> |
| |
| <h2 id="behavior-audiomanager-Changes">AudioManager Changes</h2> |
| <p>Setting the volume directly or muting specific streams via the {@link android.media.AudioManager} |
| class is no longer supported. The {@link android.media.AudioManager#setStreamSolo(int,boolean) |
| setStreamSolo()} method is deprecated, and you should call the |
| {@link android.media.AudioManager#requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, int, int) requestAudioFocus()} |
| method instead. Similarly, the |
| {@link android.media.AudioManager#setStreamMute(int,boolean) setStreamMute()} method is |
| deprecated; instead, call the {@link android.media.AudioManager#adjustStreamVolume(int, int, int) |
| adjustStreamVolume()} method and pass in the direction value |
| {@link android.media.AudioManager#ADJUST_MUTE} or |
| {@link android.media.AudioManager#ADJUST_UNMUTE}.</p> |
| |
| <h2 id="behavior-notifications">Notifications</h2> |
| <p> |
| This release removes the {@code Notification.setLatestEventInfo()} method. Use the |
| {@link android.app.Notification.Builder} class instead to construct notifications. To update a |
| notification repeatedly, reuse the {@link android.app.Notification.Builder} instance. Call the |
| {@link android.app.Notification.Builder#build()} method to get |
| updated {@link android.app.Notification} instances. |
| </p> |
| <p>The {@code adb shell dumpsys notification} command no longer prints out your notification text. |
| Use the {@code adb shell dumpsys notification --noredact} command instead to print out the text |
| in a notification object.</p> |
| |
| <h2 id="behavior-test-selection">Text Selection</h2> |
| |
| <img src="{@docRoot}preview/images/text-selection.gif" |
| style="float:right; margin:0 0 20px 30px" width="360" height="640" /> |
| |
| <p>When users select text in your app, you can now display text selection actions such as |
| <em>Cut</em>, <em>Copy</em>, and <em>Paste</em> in a |
| <a href="http://www.google.com/design/spec/patterns/selection.html#selection-text-selection" |
| class="external-link">floating toolbar</a>. The user interaction implementation is similar to that |
| for the contextual action bar, as described in |
| <a href="{@docRoot}guide/topics/ui/menus.html#CABforViews"> |
| Enabling the contextual action mode for individual views</a>.</p> |
| |
| <p>To implement a floating toolbar for text selection, make the following changes in your existing |
| apps:</p> |
| <ol> |
| <li>In your {@link android.view.View} or {@link android.app.Activity} object, change your |
| {@link android.view.ActionMode} calls from |
| {@code startActionMode(Callback)} to {@code startActionMode(Callback, ActionMode.TYPE_FLOATING)}.</li> |
| <li>Take your existing implementation of {@code ActionMode.Callback} and make it extend |
| {@link android.view.ActionMode.Callback2} instead.</li> |
| <li>Override the |
| {@link android.view.ActionMode.Callback2#onGetContentRect(android.view.ActionMode, android.view.View, android.graphics.Rect) onGetContentRect()} |
| method to provide the coordinates of the content {@link android.graphics.Rect} object |
| (such as a text selection rectangle) in the view.</li> |
| <li>If the rectangle positioning is no longer valid, and this is the only element to be invalidated, |
| call the {@link android.view.ActionMode#invalidateContentRect() invalidateContentRect()} method.</li> |
| </ol> |
| |
| <p>If you are using <a href="{@docRoot}tools/support-library/index.html"> |
| Android Support Library</a> revision 22.2, be aware that floating toolbars are not |
| backward-compatible and appcompat takes control over {@link android.view.ActionMode} objects by |
| default. This prevents floating toolbars from being displayed. To enable |
| {@link android.view.ActionMode} support in an |
| {@link android.support.v7.app.AppCompatActivity}, call |
| {@link android.support.v7.app.AppCompatActivity#getDelegate()}, then call |
| {@link android.support.v7.app.AppCompatDelegate#setHandleNativeActionModesEnabled(boolean) |
| setHandleNativeActionModesEnabled()} on the returned |
| {@link android.support.v7.app.AppCompatDelegate} object and set the input |
| parameter to {@code false}. This call returns control of {@link android.view.ActionMode} objects to |
| the framework. In devices running the M Preview, that allows the framework to support |
| {@link android.support.v7.app.ActionBar} or floating toolbar modes, while on pre-M Preview devices, |
| only the {@link android.support.v7.app.ActionBar} modes are supported.</p> |
| |
| <h2 id="behavior-keystore">Android Keystore Changes</h2> |
| <p>With this preview, the |
| <a href="{@docRoot}training/articles/keystore.html">Android Keystore provider</a> no longer supports |
| DSA. ECDSA is still supported.</p> |
| |
| <p>Keys which do not require encryption at rest will no longer be deleted when secure lock screen |
| is disabled or reset (for example, by the user or a Device Administrator). Keys which require |
| encryption at rest will be deleted during these events.</p> |
| |
| <h2 id="behavior-network">Wi-Fi and Networking Changes</h2> |
| |
| <p>This preview introduces the following behavior changes to the Wi-Fi and networking APIs.</p> |
| <ul> |
| <li>Your apps can now change the state of {@link android.net.wifi.WifiConfiguration} objects only |
| if you created these objects. You are not permitted to modify or delete |
| {@link android.net.wifi.WifiConfiguration} objects created by the user or by other apps. |
| </li> |
| <li> |
| Previously, if an app forced the device to connect to a specific Wi-Fi network by using |
| {@link android.net.wifi.WifiManager#enableNetwork(int,boolean) enableNetwork()} with the |
| {@code disableAllOthers=true} setting, the device disconnected from other networks such as |
| cellular data. In this preview, the device no longer disconnects from such other networks. If |
| your app’s {@code targetSdkVersion} is {@code “20”} or lower, it is pinned to the selected |
| Wi-Fi network. If your app’s {@code targetSdkVersion} is {@code “21”} or higher, use the |
| multinetwork APIs (such as |
| {@link android.net.Network#openConnection(java.net.URL) openConnection()}, |
| {@link android.net.Network#bindSocket(java.net.Socket) bindSocket()}, and the new |
| {@link android.net.ConnectivityManager#bindProcessToNetwork(android.net.Network) |
| bindProcessToNetwork()} method) to ensure that its network traffic is sent on the selected network.</li> |
| </ul> |
| |
| <h2 id="behavior-camera">Camera Service Changes</h2> |
| <p>In this preview, the model for accessing shared resources in the camera service has been changed |
| from the previous “first come, first serve” access model to an access model where high-priority |
| processes are favored. Changes to the service behavior include:</p> |
| <ul> |
| <li>Access to camera subsystem resources, including opening and configuring a camera device, is |
| awarded based on the “priority” of the client application process. Application processes with |
| user-visible or foreground activities are generally given a higher-priority, making camera resource |
| acquisition and use more dependable.</li> |
| <li>Active camera clients for lower priority apps may be “evicted” when a higher priority |
| application attempts to use the camera. In the deprecated {@link android.hardware.Camera} API, |
| this results in |
| {@link android.hardware.Camera.ErrorCallback#onError(int,android.hardware.Camera) onError()} being |
| called for the evicted client. In the {@link android.hardware.camera2 Camera2} API, it results in |
| {@link android.hardware.camera2.CameraDevice.StateCallback#onDisconnected(android.hardware.camera2.CameraDevice) onDisconnected()} |
| being called for the evicted client.</li> |
| <li>On devices with appropriate camera hardware, separate application processes are able to |
| independently open and use separate camera devices simultaneously. However, multi-process use |
| cases, where simultaneous access causes significant degradation of performance or capabilities of |
| any of the open camera devices, are now detected and disallowed by the camera service. This change |
| may result in “evictions” for lower priority clients even when no other app is directly |
| attempting to access the same camera device. |
| </li> |
| <li> |
| Changing the current user causes active camera clients in apps owned by the previous user account |
| to be evicted. Access to the camera is limited to user profiles owned by the current device user. |
| In practice, this means that a “Guest” account, for example, will not be able to leave running |
| processes that use the camera subsystem when the user has switched to a different account. |
| </li> |
| </ul> |
| |
| <h2 id="behavior-runtime">Runtime</h2> |
| <p>The ART runtime now properly implements access rules for the |
| {@link java.lang.reflect.Constructor#newInstance(java.lang.Object...) newInstance()} method. This |
| change fixes a problem where Dalvik was checking access rules incorrectly in previous versions. |
| If your app uses the |
| {@link java.lang.reflect.Constructor#newInstance(java.lang.Object...) newInstance()} method and you |
| want to override access checks, call the |
| {@link java.lang.reflect.Constructor#setAccessible(boolean) setAccessible()} method with the input |
| parameter set to {@code true}. If your app uses the |
| <a href="{@docRoot}tools/support-library/features.html#v7-appcompat">v7 appcompat library</a> or the |
| <a href="{@docRoot}tools/support-library/features.html#v7-recyclerview">v7 recyclerview library</a>, |
| you must update your app to use to the latest versions of these libraries. Otherwise, make sure that |
| any custom classes referenced from XML are updated so that their class constructors are accessible.</p> |
| |
| <p>This preview updates the behavior of the dynamic linker. The dynamic linker now understands the |
| difference between a library’s {@code soname} and its path |
| (<a href="https://code.google.com/p/android/issues/detail?id=6670" class="external-link"> |
| public bug 6670</a>), and search by {@code soname} is now |
| implemented. Apps which previously worked that have bad {@code DT_NEEDED} entries |
| (usually absolute paths on the build machine’s file system) may fail when loaded.</p> |
| |
| <p>The {@code dlopen(3) RTLD_LOCAL} flag is now correctly implemented. Note that |
| {@code RTLD_LOCAL} is the default, so calls to {@code dlopen(3)} that didn’t explicitly use |
| {@code RTLD_LOCAL} will be affected (unless your app explicitly used {@code RTLD_GLOBAL}). With |
| {@code RTLD_LOCAL}, symbols will not be made available to libraries loaded by later calls to |
| {@code dlopen(3)} (as opposed to being referenced by {@code DT_NEEDED} entries).</p> |
| </p> |
| |
| <h2 id="behavior-hardware-id">Access to Hardware Identifier</h2> |
| <p>To provide users with greater data protection, starting in this release, Android |
| removes programmatic access to the device’s local hardware identifier for |
| apps using the Wi-Fi and Bluetooth APIs. The |
| {@link android.net.wifi.WifiInfo#getMacAddress() WifiInfo.getMacAddress()} and the |
| {@link android.bluetooth.BluetoothAdapter#getAddress() BluetoothAdapter.getAddress()} methods |
| now return a constant value of {@code 02:00:00:00:00:00}.</p> |
| |
| <p>To access the hardware identifiers of nearby external devices via Bluetooth and Wi-Fi scans, |
| your app must now have the following permissions:</p> |
| <ul> |
| <li>{@link android.net.wifi.WifiManager#getScanResults() WifiManager.getScanResults()}: |
| Your app must have {@link android.Manifest.permission#ACCESS_FINE_LOCATION} or |
| {@link android.Manifest.permission#ACCESS_COARSE_LOCATION} permission.</li> |
| <li>{@link android.bluetooth.BluetoothDevice#ACTION_FOUND BluetoothDevice.ACTION_FOUND}: |
| Your app must have {@link android.Manifest.permission#ACCESS_COARSE_LOCATION} permission.</li> |
| <li>{@link android.bluetooth.le.BluetoothLeScanner#startScan(android.bluetooth.le.ScanCallback) |
| BluetoothLeScanner.startScan()}: Your app must have |
| {@link android.Manifest.permission#ACCESS_FINE_LOCATION} or |
| {@link android.Manifest.permission#ACCESS_COARSE_LOCATION} permission.</li> |
| </ul> |
| |
| <p class="note"><strong>Note</strong>: When a device running M Developer Preview initiates a |
| background Wi-Fi or Bluetooth scan, the operation is visible to external devices as |
| originating from a randomized MAC address.</p> |
| |
| <h2 id="behavior-apk-validation">APK Validation</h2> |
| <p>The platform now performs stricter validation of APKs. An APK is considered corrupt if a file is |
| declared in the manifest but not present in the APK itself. An APK must be re-signed if any of the |
| contents are removed.</p> |
| |
| <h2 id="behavior-usb">USB Connection</h2> |
| <p>Device connections through the USB port are now set to charge-only mode by default. To access |
| the device and its content over a USB connection, users must explicitly grant permission for such |
| interactions. If your app supports user interactions with the device over a USB port, take into |
| consideration that the interaction must be explicitly enabled. |
| </p> |
| |
| <h2 id="behavior-afw">Android for Work Changes</h2> |
| <p>This preview includes the following behavior changes for Android for Work:</p> |
| <ul> |
| <li><strong>Work contacts in personal contexts.</strong> The Google Dialer |
| Call Log now displays work contacts when the user views past calls. |
| Setting |
| {@link android.app.admin.DevicePolicyManager#setCrossProfileCallerIdDisabled(android.content.ComponentName, boolean) setCrossProfileCallerIdDisabled()} |
| to {@code true} hides the work profile contacts in the Google Dialer Call Log. Work contacts can be |
| displayed along with personal contacts to devices over Bluetooth only if |
| you set {@link android.app.admin.DevicePolicyManager#setBluetoothContactSharingDisabled(android.content.ComponentName, boolean) |
| setBluetoothContactSharingDisabled()} to {@code false}. By default, it is set to {@code true}. |
| </li> |
| <li><strong>Wi-Fi configuration removal:</strong> Wi-Fi configurations added by a Profile Owner |
| (for example, through calls to the |
| {@link android.net.wifi.WifiManager#addNetwork(android.net.wifi.WifiConfiguration) |
| addNetwork()} method) are now removed if that work profile is deleted. |
| </li> |
| <li><strong>Wi-Fi configuration lockdown:</strong> Any Wi-Fi configuration created by |
| an active Device Owner can no longer be modified or deleted by the user if |
| {@link android.provider.Settings.Global#WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN} is non-zero. |
| The user can still create and modify their own Wi-Fi configurations. Active Device |
| Owners have the privilege of editing or removing any Wi-Fi configurations, including |
| those not created by them. |
| </li> |
| <li><strong>Download Work Policy Controller via Google account addition:</strong> When a Google |
| account that requires management via a Work Policy Controller (WPC) app is added to a device |
| outside of a managed context, the add account flow now prompts the user to install the |
| appropriate WPC. This behavior also applies to accounts added via |
| <strong>Settings > Accounts</strong> and in the initial device setup wizard.</li> |
| <li><strong>Changes to specific {@link android.app.admin.DevicePolicyManager} API behaviors:</strong> |
| <ul> |
| <li>Calling the |
| {@link android.app.admin.DevicePolicyManager#setCameraDisabled(android.content.ComponentName,boolean) setCameraDisabled()} |
| method affects the camera for the calling user only; calling it from the managed profile doesn’t |
| affect camera apps running on the primary user.</li> |
| <li>In addition, the |
| {@link android.app.admin.DevicePolicyManager#setKeyguardDisabledFeatures(android.content.ComponentName,int) setKeyguardDisabledFeatures()} |
| method is now available for Profile Owners, as well as to Device Owners. </li> |
| <li>A Profile Owner can set these keyguard restrictions: |
| <ul> |
| <li>{@link android.app.admin.DevicePolicyManager#KEYGUARD_DISABLE_TRUST_AGENTS} and |
| {@link android.app.admin.DevicePolicyManager#KEYGUARD_DISABLE_FINGERPRINT}, which affect the |
| keyguard settings for the profile’s parent user.</li> |
| <li>{@link android.app.admin.DevicePolicyManager#KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS}, which |
| only affects notifications generated by applications in the managed profile.</li> |
| </ul> |
| </li> |
| <li>The {@link android.app.admin.DevicePolicyManager#createAndManageUser(android.content.ComponentName, java.lang.String, android.content.ComponentName, android.os.PersistableBundle, int) createAndManageUser()} method replaces createAndInitializeUser(), which has been removed.</li> |
| <li>The {@link android.app.admin.DevicePolicyManager#setScreenCaptureDisabled(android.content.ComponentName, boolean) setScreenCaptureDisabled()} |
| method now also blocks the assist structure when an app of the given user is in the foreground. </li> |
| <li>{@link android.app.admin.DevicePolicyManager#EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM} |
| now defaults to SHA-256. SHA-1 is still supported for backwards compatibility but will be removed |
| in future. |
| {@link android.app.admin.DevicePolicyManager#EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM} |
| now only accepts SHA-256.</li> |
| <li>Device initializer APIs which existed in the M Developer Preview are now removed.</li> |
| <li><code>EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS</code> is removed so NFC bump |
| provisioning cannot programmatically unlock a factory reset protected device.</li> |
| <li>You can now use the {@link android.app.admin.DevicePolicyManager#EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE} |
| extra to pass data to the device owner app during NFC provisioning of the managed device.</li> |
| <li>Android for Work APIs are optimized for M runtime permissions, including Work profiles, |
| assist layer, and others. New {@link android.app.admin.DevicePolicyManager} permission APIs don't |
| affect pre-M apps.</li> |
| <li>When users back out of the synchronous part of the setup flow initiated through an |
| {@link android.app.admin.DevicePolicyManager#ACTION_PROVISION_MANAGED_PROFILE} or |
| {@link android.app.admin.DevicePolicyManager#ACTION_PROVISION_MANAGED_DEVICE} intent, the system |
| now returns a {@link android.app.Activity#RESULT_CANCELED} result code.</li> |
| </ul></li> |
| |
| <li><strong>Changes to other APIs</strong>: |
| <ul> |
| <li>Data Usage: The {@code android.app.usage.NetworkUsageStats} class has been renamed |
| {@link android.app.usage.NetworkStats}.</li> |
| </ul> |
| </li> |
| |
| <li><strong>Changes to global settings</strong>: |
| <ul> |
| <li>These settings can no longer be set via {@link android.app.admin.DevicePolicyManager#setGlobalSetting(android.content.ComponentName, java.lang.String, java.lang.String) setGlobalSettings()}</code>: |
| <ul> |
| <li><code>BLUETOOTH_ON</code></li> |
| <li><code>DEVELOPMENT_SETTINGS_ENABLED</code></li> |
| <li><code>MODE_RINGER</code></li> |
| <li><code>NETWORK_PREFERENCE</code></li> |
| <li><code>WIFI_ON</code></li> |
| </ul> |
| </li> |
| <li>These global settings can now be set via {@link android.app.admin.DevicePolicyManager#setGlobalSetting(android.content.ComponentName, java.lang.String, java.lang.String) setGlobalSettings()}: |
| <ul> |
| <li>{@link android.provider.Settings.Global#WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN}</li> |
| </ul> |
| </li> |
| </ul> |
| </ul> |