am b8fb239a: Merge "docs: Updated API Overview and Behavior Changes docs for M Preview 3." into mnc-dev
* commit 'b8fb239ac53ab462c8de12635c84c2216cf57f3b': docs: Updated API Overview and Behavior Changes docs for M Preview 3.
This commit is contained in:
@@ -103,8 +103,9 @@ the <a href="{@docRoot}training/articles/keystore.html">Android Keystore system<
|
||||
<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 compatible
|
||||
{@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
|
||||
@@ -113,8 +114,8 @@ class="external-link">sample app</a>. If you are developing multiple apps that u
|
||||
authentication, note that each app must authenticate the user’s fingerprint independently.
|
||||
</p>
|
||||
|
||||
<p>To use this feature in your app, first add the {@code USE_FINGERPRINT} permission in your
|
||||
manifest.</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
|
||||
@@ -156,7 +157,7 @@ conjunction with a public or secret key implementation for user authentication.<
|
||||
|
||||
<p>To set the timeout duration for which the same key can be re-used after a user is successfully
|
||||
authenticated, call the new
|
||||
{@code android.security.keystore.KeyGenParameterSpec.Builder.setUserAuthenticationValidityDurationSeconds()}
|
||||
{@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>
|
||||
|
||||
@@ -184,13 +185,13 @@ launch an activity in another social network app, which lets the user share cont
|
||||
specific friend or community in that app.</p>
|
||||
|
||||
<p>To enable direct share targets 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>
|
||||
{@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"
|
||||
@@ -201,7 +202,8 @@ manifest.</p>
|
||||
</service>
|
||||
</pre>
|
||||
|
||||
<p>For each activity that you want to expose to the {@code ChooserTargetService}, add a
|
||||
<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>
|
||||
@@ -223,10 +225,20 @@ manifest.</p>
|
||||
This preview provides a new voice interaction API which, together with
|
||||
<a href="https://developers.google.com/voice-actions/" class="external-link">Voice Actions</a>,
|
||||
allows you to build conversational voice experiences into your apps. Call the
|
||||
{@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
|
||||
{@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>
|
||||
@@ -239,7 +251,7 @@ can summon the assistant within any app, by long-pressing on the <strong>Home</s
|
||||
<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 {@code android.app.assist.AssistContent} class.</p>
|
||||
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>
|
||||
|
||||
@@ -249,25 +261,32 @@ additional information by using the new {@code android.app.assist.AssistContent}
|
||||
{@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 {@code Activity.onProvideAssistContent()} callback.
|
||||
callback and, optionally, the new
|
||||
{@link android.app.Activity#onProvideAssistContent(android.app.assist.AssistContent) onProvideAssistContent()}
|
||||
callback.
|
||||
</ol>
|
||||
|
||||
<h2 id="notifications">Notifications</h2>
|
||||
<p>This preview adds the following API changes for notifications:</p>
|
||||
<ul>
|
||||
<li>New {@code NotificationListenerService.INTERRUPTION_FILTER_ALARMS} filter level that
|
||||
<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 {@code Notification.CATEGORY_REMINDER} category value that is used to distinguish
|
||||
user-scheduled reminders from other events
|
||||
<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 {@code android.graphics.drawable.Icon} class which can be attached to your notifications
|
||||
via the {@code Notification.Builder.setSmallIcon(Icon)} and
|
||||
{@code Notification.Builder.setLargeIcon(Icon)} methods.</li>
|
||||
<li>New {@code NotificationManager.getActiveNotifications()} method that allows your apps to
|
||||
find out which of their notifications are currently alive. To see an app implementation that
|
||||
uses this feature, see the <a href="https://github.com/googlesamples/android-ActiveNotifications"
|
||||
class="external-link">Active Notifications sample</a>.</li>
|
||||
<li>New {@link android.graphics.drawable.Icon} class that you can attach to your notifications
|
||||
via the
|
||||
{@link android.app.Notification.Builder#setSmallIcon(android.graphics.drawable.Icon) setSmallIcon()}
|
||||
and {@link android.app.Notification.Builder#setLargeIcon(android.graphics.drawable.Icon) setLargeIcon()}
|
||||
methods. Similarly, the
|
||||
{@link android.app.Notification.Builder#addAction(int, java.lang.CharSequence, android.app.PendingIntent)
|
||||
addAction()} method now accepts an {@link android.graphics.drawable.Icon} object instead of a
|
||||
drawable resource ID.</li>
|
||||
<li>New {@link android.app.NotificationManager#getActiveNotifications()} method that allows your
|
||||
apps to find out which of their notifications are currently alive. To see an app implementation
|
||||
that uses this feature, see the <a href="https://github.com/googlesamples/android-ActiveNotifications"
|
||||
class="external-link">Active Notifications sample</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="bluetooth-stylus">Bluetooth Stylus Support</h2>
|
||||
@@ -275,9 +294,9 @@ callback and, optionally, the new {@code Activity.onProvideAssistContent()} call
|
||||
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 the new
|
||||
{@code View.onContextClickListener} and {@code GestureDetector.onContextClickListener}
|
||||
callbacks in your activity.</p>
|
||||
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>
|
||||
@@ -287,11 +306,11 @@ interactions:</p>
|
||||
{@link android.view.MotionEvent#TOOL_TYPE_STYLUS}.</li>
|
||||
<li>For apps targeting M Preview, the
|
||||
{@link android.view.MotionEvent#getButtonState() getButtonState()}
|
||||
method returns {@code MotionEvent.BUTTON_STYLUS_PRIMARY} when the user
|
||||
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
|
||||
{@code MotionEvent.BUTTON_STYLUS_SECONDARY} when the user presses it. If the user presses
|
||||
{@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
|
||||
({@code BUTTON_STYLUS_PRIMARY|BUTTON_STYLUS_SECONDARY}).</li>
|
||||
({@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
|
||||
@@ -302,89 +321,95 @@ For apps targeting a lower platform version, the
|
||||
|
||||
<h2 id="ble-scanning">Improved Bluetooth Low Energy Scanning</h2>
|
||||
<p>
|
||||
If your app performs performs Bluetooth Low Energy scans, you can use the new
|
||||
{@code android.bluetooth.le.ScanSettings.Builder.setCallbackType()} method to specify that
|
||||
you want callbacks to only be notified when an advertisement packet matching the set
|
||||
{@link android.bluetooth.le.ScanFilter} is first found, and when it is not seen for a period of
|
||||
time. This approach to scanning is more power-efficient than what’s provided in the previous
|
||||
platform version.
|
||||
If your app performs performs Bluetooth Low Energy scans, use the new
|
||||
{@link android.bluetooth.le.ScanSettings.Builder#setCallbackType(int) setCallbackType()}
|
||||
method to specify that you want the system to notify callbacks when it first finds, or sees after a
|
||||
long time, an advertisement packet matching the set {@link android.bluetooth.le.ScanFilter}. This
|
||||
approach to scanning is more power-efficient than what’s provided in the previous platform version.
|
||||
</p>
|
||||
|
||||
<h2 id="hotspot">Hotspot 2.0 Release 1 Support</h2>
|
||||
<p>
|
||||
This preview adds support for the Hotspot 2.0 Release 1 spec on Nexus 6 and Nexus 9 devices. To
|
||||
provision Hotspot 2.0 credentials in your app, use the new methods of the
|
||||
{@link android.net.wifi.WifiEnterpriseConfig} class, such as {@code setPlmn()} and
|
||||
{@code setRealm()}. In the {@link android.net.wifi.WifiConfiguration} object, you can set the
|
||||
{@link android.net.wifi.WifiConfiguration#FQDN} and the {@code providerFriendlyName} fields.
|
||||
The new {@code ScanResult.isPasspointNetwork()} method indicates if a detected
|
||||
{@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
|
||||
{@code android.view.Display.Mode} APIs. If the UI is drawn at a lower logical resolution and is
|
||||
{@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
|
||||
{@code Display.Mode.getPhysicalWidth()} method returns may differ from the logical
|
||||
{@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 {@code 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>
|
||||
the {@link android.view.WindowManager.LayoutParams#preferredDisplayModeId} property of your app’s
|
||||
window. This feature is useful if you want to switch to 4K display resolution. While in 4K display
|
||||
mode, the UI continues to be rendered at the original resolution (such as 1080p) and is upscaled to
|
||||
4K, but {@link android.view.SurfaceView} objects may show content at the native resolution.</p>
|
||||
|
||||
<h2 id="behavior-themeable-colorstatelists">Themeable ColorStateLists</h2>
|
||||
<p>Theme attributes are now supported in
|
||||
{@link android.content.res.ColorStateList} for devices running the M Preview. The
|
||||
{@link android.content.res.Resources#getColorStateList(int) getColorStateList()} and
|
||||
{@link android.content.res.Resources#getColor(int) getColor()} methods have been deprecated. If
|
||||
you are calling these APIs, call the new {@code Context.getColorStateList()} or
|
||||
{@code Context.getColor()} methods instead. These methods are also available in the
|
||||
v4 appcompat library via {@link android.support.v4.content.ContextCompat}.</p>
|
||||
you are calling these APIs, call the new
|
||||
{@link android.content.Context#getColorStateList(int) getColorStateList()} or
|
||||
{@link android.content.Context#getColor(int) getColor()} methods instead. These methods are also
|
||||
available in the v4 appcompat library via {@link android.support.v4.content.ContextCompat}.</p>
|
||||
|
||||
<h2 id="audio">Audio Features</h2>
|
||||
|
||||
<p>This preview adds enhancements to audio processing on Android, including: </p>
|
||||
<ul>
|
||||
<li>Support for the <a href="http://en.wikipedia.org/wiki/MIDI" class="external-link">MIDI</a>
|
||||
protocol, with the new {@code android.media.midi} APIs. Use these APIs to send and receive MIDI
|
||||
protocol, with the new {@link 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}
|
||||
<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 {@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.hasMicrophone()} method.</li>
|
||||
<li>New {@code AudioManager.getDevices() method which lets you retrieve a list of all
|
||||
audio devices currently connected to the system. You can also register an
|
||||
{@code android.media.AudioDeviceCallback} object if you want your app to be notified
|
||||
when an audio device is connected or disconnected.</li>
|
||||
TV. The system invokes the new
|
||||
{@link android.app.Activity#onSearchRequested(android.view.SearchEvent) onSearchRequested()}
|
||||
callback when the user starts a search. To determine if the user's input device has a built-in
|
||||
microphone, retrieve the {@link android.view.InputDevice} object from that callback, then call the
|
||||
new {@link android.view.InputDevice#hasMicrophone()} method.</li>
|
||||
<li>New {@link android.media.AudioManager#getDevices(int) getDevices()} method which lets you
|
||||
retrieve a list of all audio devices currently connected to the system. You can also register an
|
||||
{@link android.media.AudioDeviceCallback} object if you want the system to notify your app
|
||||
when an audio device connects or disconnects.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="video">Video Features</h2>
|
||||
<p>This preview adds new capabilities to the video processing APIs, including:</p>
|
||||
<ul>
|
||||
<li>New {@code android.media.MediaSync} class which helps applications to synchronously render
|
||||
<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 {@code 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>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 {@code 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>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 {@code MediaCodecInfo.CodecCapabilities.getMaxSupportedInstances()} interface to get a
|
||||
hint for the max number of the supported concurrent codec instances.
|
||||
<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 {@code MediaPlayer.setPlaybackParams()} method to set the media playback rate for fast or
|
||||
<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>
|
||||
@@ -394,48 +419,55 @@ conjunction with the video.</li>
|
||||
camera reprocessing of images:</p>
|
||||
|
||||
<h3 id="flashlight">Flashlight API</h3>
|
||||
<p>If a camera device has a flash unit, you can call the {@code CameraManager.setTorchMode()}
|
||||
<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 {@code setTorchMode()}
|
||||
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
|
||||
{@code CameraManager.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
|
||||
{@code CameraManager.TorchCallback.onTorchModeChanged()} method is invoked.</p>
|
||||
{@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 {@code REPROCESS_MAX_CAPTURE_STALL} key. If a
|
||||
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
|
||||
{@code CameraDevice.createReprocessableCaptureSession()}, and create requests for input
|
||||
buffer reprocessing.</p>
|
||||
<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 {@code android.media.ImageWriter} class to connect the input buffer flow to the camera
|
||||
<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 {@code ImageWriter.dequeueInputImage()} method.</li>
|
||||
<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 {@code ImageWriter.queueInputImage()} method.</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 {@code ImageWriter} object together with an
|
||||
{@code android.graphics.ImageFormat.PRIVATE} image, your app cannot access the image
|
||||
data directly. Instead, pass the {@code ImageFormat.PRIVATE} image directly to the
|
||||
{@code ImageWriter} by calling the {@code ImageWriter.queueInputImage()} method without any
|
||||
buffer copy.</p>
|
||||
<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
|
||||
{@code android.graphics.ImageFormat.PRIVATE} format image streams. This support allows your app to
|
||||
{@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 {@code ImageWriter} for camera reprocessing.</p>
|
||||
more images, and send them to the {@link android.media.ImageWriter} for camera reprocessing.</p>
|
||||
|
||||
<h2 id="afw">Android for Work Features</h2>
|
||||
<p>This preview includes the following new APIs for Android for Work:</p>
|
||||
@@ -445,14 +477,16 @@ 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.setKeyguardDisabled()} method.</li>
|
||||
{@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
|
||||
{@code DevicePolicyManager.setStatusBarDisabled()} method.</li>
|
||||
{@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
|
||||
{@code DISALLOW_SAFE_BOOT}.</li>
|
||||
{@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} constant {@code STAY_ON_WHILE_PLUGGED_IN}.</li>
|
||||
{@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
|
||||
@@ -463,11 +497,12 @@ provisioning of kiosks or other such devices without activating a Google account
|
||||
<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>
|
||||
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
|
||||
{@code DevicePolicyManager.setSystemUpdatePolicy()}, a Device Owner can now auto-accept a system
|
||||
{@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
|
||||
@@ -498,16 +533,17 @@ srcset="{@docRoot}preview/images/work-profile-screen.png 1x, {@docRoot}preview/i
|
||||
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
|
||||
{@code android.app.usage.NetworkStatsManager} methods. Profile Owners are automatically granted
|
||||
{@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
|
||||
{@code DevicePolicyManager.setPermissionPolicy()}, to either prompt the user to grant the
|
||||
permission as normal 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>
|
||||
{@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
|
||||
|
||||
@@ -10,20 +10,17 @@ sdk.platform.apiLevel=MNC
|
||||
|
||||
<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>
|
||||
<ol>
|
||||
<li><a href="#behavior-doze">Doze</a></li>
|
||||
<li><a href="#behavior-app-standby">App Standby</a></li>
|
||||
</ol>
|
||||
</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>
|
||||
@@ -58,9 +55,11 @@ 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 {@code Context.checkSelfPermission()} method. To request a permission, call the new
|
||||
{@code Activity.requestPermission()} method. Even if your app is not targeting the M Preview
|
||||
release, you should test your app under the new permissions model.</p>
|
||||
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">
|
||||
@@ -69,86 +68,19 @@ see the <a href="{@docRoot}preview/testing/guide.html#runtime-permissions">Testi
|
||||
|
||||
<h2 id="behavior-power">Power-Saving Optimizations</h2>
|
||||
<p>This preview introduces new power-saving optimizations for idle devices and apps.</p>
|
||||
|
||||
<h3 id="behavior-doze">Doze</h3>
|
||||
<p>If a device is unplugged and left stationary with the screen off for a period of time, it
|
||||
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.</p>
|
||||
|
||||
<p>The following restrictions apply to your apps while in Doze:</p>
|
||||
<ul>
|
||||
<li>Network access is disabled, unless your app receives a high priority Google Cloud Messaging
|
||||
tickle.</li>
|
||||
<li><a href="{@docRoot}reference/android/os/PowerManager.WakeLock.html">Wake locks</a> are ignored.</li>
|
||||
<li>Alarms scheduled with the {@link android.app.AlarmManager} class are disabled, except for
|
||||
alarms that you've set with the {@link android.app.AlarmManager#setAlarmClock setAlarmClock()}
|
||||
method and {@code AlarmManager.setAndAllowWhileIdle()}.</li>
|
||||
<li>WiFi scans are not performed.</li>
|
||||
<li>Syncs and jobs for your sync adapters and {@link android.app.job.JobScheduler} are not
|
||||
permitted to run.</li>
|
||||
</ul>
|
||||
</p>
|
||||
<p>When the device exits doze, it executes any jobs and syncs that are pending.</p>
|
||||
<p>You can test this feature by connecting a device running the M Preview to your development
|
||||
machine and calling the following commands:
|
||||
</p>
|
||||
<pre class="no-prettyprint">
|
||||
$ adb shell dumpsys battery unplug
|
||||
$ adb shell dumpsys deviceidle step
|
||||
$ adb shell dumpsys deviceidle -h
|
||||
</pre>
|
||||
<p class="note"><strong>Note</strong>: The upcoming
|
||||
<a href="https://developers.google.com/cloud-messaging/" class="external-link">
|
||||
Google Cloud Messaging</a> release lets you designate
|
||||
high-priority messages. If your app receives high-priority GCM messages, it’s granted
|
||||
brief network access even when the device is in doze.
|
||||
</p>
|
||||
|
||||
<p>See the
|
||||
<a href="{@docRoot}preview/testing/guide.html#doze-standby">Testing Guide</a> for tips on how
|
||||
to test Doze in your apps. </p>
|
||||
|
||||
<h3 id="behavior-app-standby">App standby</h3>
|
||||
<p>With this preview, the system may determine that apps are idle when they are not in active
|
||||
use. Your app is considered idle after a period of time, unless the system detects
|
||||
any of these signals:</p>
|
||||
|
||||
<ul>
|
||||
<li>The app is explicitly launched by the user.</li>
|
||||
<li>The app has a process currently in the foreground (either as an activity or foreground service,
|
||||
or in use by another activity or foreground service).</li>
|
||||
<li>The app generates a notification that users see on the lock screen or in the
|
||||
notification tray.</li>
|
||||
<li>The user explicitly asks for the app to be exempt from optimizations,
|
||||
via <strong>Settings</strong>.</li>
|
||||
<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>If the device is unplugged, apps deemed idle will have their network access disabled
|
||||
and their syncs and jobs suspended. When the device is plugged into a power supply, these apps are
|
||||
allowed network access and can execute any jobs and syncs that are pending. If the
|
||||
device is idle for long periods of time, idle apps are allowed network access around once a day.</p>
|
||||
|
||||
<p>You can test this feature by connecting a device running the M Preview to your development
|
||||
machine and calling the following commands:
|
||||
</p>
|
||||
<pre class="no-prettyprint">
|
||||
$ adb shell dumpsys battery unplug
|
||||
$ adb shell am set-idle <packageName> true
|
||||
$ adb shell am set-idle <packageName> false
|
||||
$ adb shell am get-idle <packageName>
|
||||
</pre>
|
||||
|
||||
<p class="note"><strong>Note</strong>: The upcoming
|
||||
<a href="https://developers.google.com/cloud-messaging/" class="external-link">
|
||||
Google Cloud Messaging</a> (GCM) release lets you
|
||||
designate high-priority messages. If your app receives high-priority GCM messages, it’s granted
|
||||
brief network access even when the app is idle.
|
||||
</p>
|
||||
|
||||
<p>See the
|
||||
<a href="{@docRoot}preview/testing/guide.html#doze-standby">Testing Guide</a> for tips on how
|
||||
to test App Standby in your apps. </p>
|
||||
<p>To learn more about these power-saving changes, see
|
||||
<a href="{@docRoot}preview/power-mgmt.html">Power-Saving Optimizations</a>.</p>
|
||||
|
||||
<h2 id="behavior-adoptable-storage">Adoptable Storage Devices</h2>
|
||||
<p>
|
||||
@@ -222,10 +154,25 @@ cryptography library of your choice.</p>
|
||||
<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
|
||||
{@code AudioManager.requestAudioFocus()} method instead. Similarly, 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 {@code AudioManager.adjustStreamVolume()} method
|
||||
and pass in the direction value {@code ADJUST_MUTE} or {@code ADJUST_UNMUTE}.</p>
|
||||
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>
|
||||
|
||||
@@ -247,11 +194,13 @@ apps:</p>
|
||||
{@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
|
||||
{@code ActionMode.Callback2} instead.</li>
|
||||
<li>Override the {@code Callback2.onGetContentRect()} method to provide the coordinates of the
|
||||
content {@link android.graphics.Rect} object (such as a text selection rectangle) in the view.</li>
|
||||
{@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 {@code ActionMode.invalidateContentRect()} method.</li>
|
||||
call the {@link android.view.ActionMode#invalidateContentRect() invalidateContentRect()} method.</li>
|
||||
</ol>
|
||||
|
||||
<p>If you are using <a href="{@docRoot}tools/support-library/index.html">
|
||||
@@ -260,8 +209,9 @@ backward-compatible and appcompat takes control over {@link android.view.ActionM
|
||||
default. This prevents floating toolbars from being displayed. To enable
|
||||
{@link android.view.ActionMode} support in an
|
||||
{@link android.support.v7.app.AppCompatActivity}, call
|
||||
{@code android.support.v7.app.AppCompatActivity.getDelegate()}, then call
|
||||
{@code android.support.v7.app.AppCompatDelegate.setHandleNativeActionModesEnabled()} on the returned
|
||||
{@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
|
||||
@@ -295,8 +245,8 @@ Wi-Fi network. If your app’s {@code targetSdkVersion} is {@code “21”} or h
|
||||
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
|
||||
{@code ConnectivityManager.bindProcessToNetwork()} method) to ensure that its network traffic is
|
||||
sent on the selected network.</li>
|
||||
{@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>
|
||||
@@ -358,6 +308,32 @@ implemented. Apps which previously worked that have bad {@code DT_NEEDED} entrie
|
||||
{@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
|
||||
@@ -379,19 +355,19 @@ 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 {@code DevicePolicyManager.setBluetoothContactSharingDisabled()} to {@code false}. By
|
||||
default, it is set to {@code true}.
|
||||
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>WiFi configuration removal:</strong> WiFi configurations added by a Profile Owner
|
||||
<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>WiFi configuration lockdown:</strong> Any WiFi configuration created by
|
||||
<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
|
||||
<code>Settings.Global.WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN</code> is non-zero.
|
||||
The user can still create and modify their own WiFi configurations. Active Device
|
||||
Owners have the privilege of editing/removing any WiFi configurations, including
|
||||
{@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
|
||||
@@ -399,11 +375,12 @@ account that requires management via a Work Policy Controller (WPC) app is added
|
||||
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 DevicePolicyManager API behaviors:</strong>
|
||||
<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()}
|
||||
<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>
|
||||
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>
|
||||
@@ -417,16 +394,31 @@ affect camera apps running on the primary user. </li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>The {@link android.app.admin.DevicePolicyManager#createAndInitializeUser(android.content.ComponentName, java.lang.String, java.lang.String, android.content.ComponentName, android.os.Bundle) createAndInitializeUser()} and {@link android.app.admin.DevicePolicyManager#createUser(android.content.ComponentName, java.lang.String) createUser()} methods have been deprecated.</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><code>EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM</code> now defaults to SHA-256. SHA-1 is still supported for backwards compatibility but will be removed in future. <code>EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM</code> now only accepts SHA-256.</li>
|
||||
<li>Device initializer APIs which existed in the MNC preview are now removed. They will not appear in the final M release.</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>Android for Work APIs are optimized for M runtime permissions, including Work profiles, assist layer, and others. New <code>DevicePolicyManager</code> permission APIs don't affect pre-M apps.</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_SIGNATURE_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 {@code android.app.usage.NetworkStats}.</li>
|
||||
<li>Data Usage: The {@code android.app.usage.NetworkUsageStats} class has been renamed
|
||||
{@link android.app.usage.NetworkStats}.</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
@@ -438,12 +430,12 @@ affect camera apps running on the primary user. </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>
|
||||
<li><code>WIFI_ON</code></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>These global settings can now be set via <code><a href="/reference/android/app/admin/DevicePolicyManager.html#setGlobalSetting(android.content.ComponentName, java.lang.String, java.lang.String)">setGlobalSettings()</a></code>:
|
||||
<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><code>WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN</code></li>
|
||||
<li>{@link android.provider.Settings.Global#WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN}</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
Reference in New Issue
Block a user