Android 6.0 更新内容(开发必读)

Android 6.0 API

API 级别:23

Android 6.0 (M)

指纹身份验证

此版本提供了一些新的 API,在受支持的设备上,用户只需扫描其指纹即可完成身份验证,这些 API 还可与 Android 密钥库系统结合使用。

要通过指纹扫描验证用户身份,请获取新 [FingerprintManager](https://developer.android.com/reference/android/hardware/fingerprint/FingerprintManager) 类的实例,并调用 [authenticate()](https://developer.android.com/reference/android/hardware/fingerprint/FingerprintManager#authenticate(android.hardware.fingerprint.FingerprintManager.CryptoObject,%20android.os.CancellationSignal,%20int,%20android.hardware.fingerprint.FingerprintManager.AuthenticationCallback,%20android.os.Handler))方法。您的应用必须运行在带有指纹传感器的兼容设备上。您必须在应用中实现指纹身份验证流的用户界面,并在 UI 中使用标准 Android 指纹图标。FingerprintDialog 示例中包含有 Android 指纹图标 (c_fp_40px.png)。请注意,如果您要开发多个使用指纹身份验证的应用,每个应用必须独立验证用户的指纹。

要在您的应用中使用此功能,请先在清单中添加 [USE_FINGERPRINT](https://developer.android.com/reference/android/Manifest.permission#USE_FINGERPRINT) 权限。

<uses-permission
        android:name="android.permission.USE_FINGERPRINT" />

要查看指纹身份验证的应用实现,请参阅FingerprintDialog 示例。要查看有关将这些身份验证 API 与其他 Android API 结合使用方法的演示,请观看视频 Fingerprint API 和 Payment API

如果您要测试此功能,请执行以下步骤:

  1. 如果您尚未安装 Android SDK 工具 24.3 修订版,请执行此操作。
  2. 转到 Settings > Security > Fingerprint,然后按照登记说明在模拟器中登记新指纹。
  3. 使用模拟器通过以下命令模拟指纹触摸事件。使用同一命令模拟锁屏上或应用中的指纹触摸事件。
adb -e emu finger touch <finger_id>
在 Windows 上,您可能需要运行带有 `finger touch <finger_id>` 参数的 `telnet 127.0.0.1 <emulator-id>` 命令。

确认凭据

您的应用可以根据用户在多久之前最后一次解锁设备来验证其身份。此功能让用户不必费心记忆应用特定密码,您也无需实现自己的身份验证用户界面。您的应用应当利用此功能并结合实现公钥或私钥,以进行用户身份验证。

要设置成功验证用户身份后可再次使用同一密钥的超时持续时间,请在设置 [KeyGenerator](https://developer.android.com/reference/javax/crypto/KeyGenerator)[KeyPairGenerator](https://developer.android.com/reference/java/security/KeyPairGenerator) 时调用新增的 [setUserAuthenticationValidityDurationSeconds()](https://developer.android.com/reference/android/security/keystore/KeyGenParameterSpec.Builder#setUserAuthenticationValidityDurationSeconds(int)) 方法。

避免过多显示重新验证对话框 -- 您的应用应尝试先使用加密对象,如果超时到期,请使用 [createConfirmDeviceCredentialIntent()](https://developer.android.com/reference/android/app/KeyguardManager#createConfirmDeviceCredentialIntent(java.lang.CharSequence,%20java.lang.CharSequence)) 方法在您的应用内重新验证用户身份。

要查看此功能的应用实现,请参阅 ConfirmCredential 示例

应用链接

此版本通过提供功能更强大的应用链接,增强了 Android 的 intent 系统。您可以利用此功能将应用与您拥有的某个 Web 域关联。平台可以根据此关联确定在处理特定 Web 链接时默认使用的应用,跳过提示用户选择应用的步骤。要了解如何实现此功能,请参阅处理应用链接

自动备份应用

现在,系统可以自动为应用执行完整数据备份和恢复。您的应用的目标平台必须是 Android 6.0(API 级别 23),才能启用此行为;您无需额外添加任何代码。如果用户删除其 Google 帐户,其备份数据也会随之删除。要了解该功能的工作方式以及配置文件系统备份内容的方法,请参阅配置应用自动备份

直接共享

此版本为您提供的一些 API 可让用户直观、快捷地进行共享。现在,您可以定义可在您的应用内启动特定 Activity 的直接共享目标。这些直接共享目标通过“共享”菜单公开给用户。此功能让用户可以向其他应用内的目标(如联系人)共享内容。例如,直接共享目标可以启动另一社交网络应用中的某个 Activity,让用户可以直接向该应用中的某位朋友或某个社区共享内容。

要启用直接共享目标,您必须定义一个类,用于扩展 [ChooserTargetService](https://developer.android.com/reference/android/service/chooser/ChooserTargetService) 类。在清单中声明您的服务。在该声明内,指定 [BIND_CHOOSER_TARGET_SERVICE](https://developer.android.com/reference/android/Manifest.permission#BIND_CHOOSER_TARGET_SERVICE) 权限和一个使用 [SERVICE_INTERFACE](https://developer.android.com/reference/android/service/chooser/ChooserTargetService#SERVICE_INTERFACE) 操作的 intent 过滤器。

以下示例展示了如何在清单中声明 [ChooserTargetService](https://developer.android.com/reference/android/service/chooser/ChooserTargetService)

<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>

对于您想要向 [ChooserTargetService](https://developer.android.com/reference/android/service/chooser/ChooserTargetService) 公开的每个 Activity,请在您的应用清单中为其添加一个名为 "android.service.chooser.chooser_target_service"<meta-data> 元素。

<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>

语音交互

此版本提供了一个新的语音交互 API,与语音操作一起使用时,可让您为应用打造对话式语音体验。调用 [isVoiceInteraction()](https://developer.android.com/reference/android/app/Activity#isVoiceInteraction()) 方法可确定是否是响应语音操作触发了您的 Activity。如果是这样,则您的应用可以使用 [VoiceInteractor](https://developer.android.com/reference/android/app/VoiceInteractor) 类请求用户进行语音确认、从选项列表中进行选择以及执行其他操作。

大多数语音交互都由用户语音操作发起。但语音交互 Activity 也可在没有用户输入的情况下启动。例如,通过语音交互启动的另一应用也可发送 intent 来启动语音交互。要确定您的 Activity 是由用户语音查询还是另一语音交互应用启动,请调用 [isVoiceInteractionRoot()](https://developer.android.com/reference/android/app/Activity#isVoiceInteractionRoot()) 方法。如果另一应用启动了您的 Activity,该方法会返回 false。您的应用可能随即提示用户确认其有意执行此操作。

要详细了解如何实现语音操作,请参阅语音操作开发者网站

Assist API

此版本提供了一种让用户通过助手程序与应用进行互动的新方式。要使用此功能,用户必须启用助手以使用当前上下文。启用助手后,用户可通过长按首页按钮在任何应用内召唤助手。

您的应用可通过设置 [FLAG_SECURE](https://developer.android.com/reference/android/view/WindowManager.LayoutParams#FLAG_SECURE) 标记选择不与助手共享当前上下文。除了平台传递给助手的一组标准信息外,您的应用还可利用新增的 [AssistContent](https://developer.android.com/reference/android/app/assist/AssistContent) 类共享其他信息。

要为助手提供您的应用内的其他上下文,请执行以下步骤:

  1. 实现 [Application.OnProvideAssistDataListener](https://developer.android.com/reference/android/app/Application.OnProvideAssistDataListener) 接口。
  2. 利用 [registerOnProvideAssistDataListener()](https://developer.android.com/reference/android/app/Application#registerOnProvideAssistDataListener(android.app.Application.OnProvideAssistDataListener)) 注册此侦听器。
  3. 要提供特定于 Activity 的上下文信息,请重写 [onProvideAssistData()](https://developer.android.com/reference/android/app/Activity#onProvideAssistData(android.os.Bundle)) 回调和新的 [onProvideAssistContent()](https://developer.android.com/reference/android/app/Activity#onProvideAssistContent(android.app.assist.AssistContent)) 回调(可选操作)。

可采用的存储设备

使用此版本时,用户可以采用 SD 卡等外部存储设备。采用外部存储设备可加密和格式化设备,使其具有类似内部存储设备的行为。用户可以利用此特性在存储设备之间移动应用及其私有数据。移动应用时,系统会遵守清单中的 android:installLocation 首选项。

请注意,在内部存储设备与外部存储设备之间移动应用时,如果您的应用访问以下 API 或字段,它们返回的文件路径将会动态变化。强烈建议:在生成文件路径时,请始终动态调用这些 API。请勿使用硬编码文件路径或之前生成的永久性完全限定文件路径。

  • [Context](https://developer.android.com/reference/android/content/Context) 方法:
    • [getFilesDir()](https://developer.android.com/reference/android/content/Context#getFilesDir())
    • [getCacheDir()](https://developer.android.com/reference/android/content/Context#getCacheDir())
    • [getCodeCacheDir()](https://developer.android.com/reference/android/content/Context#getCodeCacheDir())
    • [getDatabasePath()](https://developer.android.com/reference/android/content/Context#getDatabasePath(java.lang.String))
    • [getDir()](https://developer.android.com/reference/android/content/Context#getDir(java.lang.String,%20int))
    • [getNoBackupFilesDir()](https://developer.android.com/reference/android/content/Context#getNoBackupFilesDir())
    • [getFileStreamPath()](https://developer.android.com/reference/android/content/Context#getFileStreamPath(java.lang.String))
    • [getPackageCodePath()](https://developer.android.com/reference/android/content/Context#getPackageCodePath())
    • [getPackageResourcePath()](https://developer.android.com/reference/android/content/Context#getPackageResourcePath())
  • [ApplicationInfo](https://developer.android.com/reference/android/content/pm/ApplicationInfo) 字段:
    • [dataDir](https://developer.android.com/reference/android/content/pm/ApplicationInfo#dataDir)
    • [sourceDir](https://developer.android.com/reference/android/content/pm/ApplicationInfo#sourceDir)
    • [nativeLibraryDir](https://developer.android.com/reference/android/content/pm/ApplicationInfo#nativeLibraryDir)
    • [publicSourceDir](https://developer.android.com/reference/android/content/pm/ApplicationInfo#publicSourceDir)
    • [splitSourceDirs](https://developer.android.com/reference/android/content/pm/ApplicationInfo#splitSourceDirs)
    • [splitPublicSourceDirs](https://developer.android.com/reference/android/content/pm/ApplicationInfo#splitPublicSourceDirs)

要调试此功能,您可以将一个 USB 驱动器通过一根 USB On-The-Go (OTG) 电缆连接到 Android 设备并运行以下命令启用该 USB 驱动器:

$ adb shell sm set-force-adoptable true

通知

此版本针对通知功能引入了下列 API 变更:

  • 新增了 [INTERRUPTION_FILTER_ALARMS](https://developer.android.com/reference/android/app/NotificationManager#INTERRUPTION_FILTER_ALARMS) 过滤级别,它对应于新增的“仅闹铃”免打扰模式。
  • 新增了 [CATEGORY_REMINDER](https://developer.android.com/reference/android/app/Notification#CATEGORY_REMINDER) 类别值,用于区分用户安排的提醒与其他事件 ([CATEGORY_EVENT](https://developer.android.com/reference/android/app/Notification#CATEGORY_EVENT)) 和闹铃 ([CATEGORY_ALARM](https://developer.android.com/reference/android/app/Notification#CATEGORY_ALARM))。
  • 新增了 [Icon](https://developer.android.com/reference/android/graphics/drawable/Icon) 类,您可以通过 [setSmallIcon()](https://developer.android.com/reference/android/app/Notification.Builder#setSmallIcon(android.graphics.drawable.Icon))方法和 [setLargeIcon()](https://developer.android.com/reference/android/app/Notification.Builder#setLargeIcon(android.graphics.drawable.Icon))方法将其附加到通知上。同理,[addAction()](https://developer.android.com/reference/android/app/Notification.Builder#addAction(int,%20java.lang.CharSequence,%20android.app.PendingIntent)) 方法现在接受 [Icon](https://developer.android.com/reference/android/graphics/drawable/Icon) 对象,而不接受可绘制资源 ID。
  • 新增了 [getActiveNotifications()](https://developer.android.com/reference/android/app/NotificationManager#getActiveNotifications()) 方法,让您的应用能够了解哪些通知目前处于活动状态。要查看使用此功能的应用实现,请参阅 ActiveNotifications 示例

蓝牙触控笔支持

此版本改善了对用户使用蓝牙触控笔进行输入的支持。用户可将兼容的蓝牙触控笔与其手机或平板电脑配对并建立连接。连接后,来自触摸屏的位置信息将与来自触控笔的压力和按键信息融合,从而实现比单纯使用触摸屏更丰富的表达。您的应用可以通过在 Activity 中注册 [View.OnContextClickListener](https://developer.android.com/reference/android/view/View.OnContextClickListener) 对象和 [GestureDetector.OnContextClickListener](https://developer.android.com/reference/android/view/GestureDetector.OnContextClickListener) 对象,侦听触控笔按键动作并执行辅助操作。

可使用 [MotionEvent](https://developer.android.com/reference/android/view/MotionEvent) 方法和常量来检测触控笔按键交互:

  • 如果用户使用带按键的触控笔触按应用屏幕,[getTooltype()](https://developer.android.com/reference/android/view/MotionEvent#getToolType(int)) 方法会返回 [TOOL_TYPE_STYLUS](https://developer.android.com/reference/android/view/MotionEvent#TOOL_TYPE_STYLUS)
  • 对于以 Android 6.0(API 级别 23)为目标平台的应用,当用户按触控笔的主按键时,[getButtonState()](https://developer.android.com/reference/android/view/MotionEvent#getButtonState()) 方法会返回 [BUTTON_STYLUS_PRIMARY](https://developer.android.com/reference/android/view/MotionEvent#BUTTON_STYLUS_PRIMARY)。如果触控笔有辅助按键,当用户按下它时,该方法会返回 [BUTTON_STYLUS_SECONDARY](https://developer.android.com/reference/android/view/MotionEvent#BUTTON_STYLUS_SECONDARY)。如果用户同时按下两个按键,该方法会同时返回通过 OR 运算符连接起来的两个值 ([BUTTON_STYLUS_PRIMARY](https://developer.android.com/reference/android/view/MotionEvent#BUTTON_STYLUS_PRIMARY)|[BUTTON_STYLUS_SECONDARY](https://developer.android.com/reference/android/view/MotionEvent#BUTTON_STYLUS_SECONDARY))。
  • 对于以较低平台版本为目标的应用,[getButtonState()](https://developer.android.com/reference/android/view/MotionEvent#getButtonState()) 方法返回 [BUTTON_SECONDARY](https://developer.android.com/reference/android/view/MotionEvent#BUTTON_SECONDARY)(按下触控笔主按键时)、[BUTTON_TERTIARY](https://developer.android.com/reference/android/view/MotionEvent#BUTTON_TERTIARY)(按下触控笔辅助按键时)之一或同时返回这两者。

改进的蓝牙低功耗扫描

如果您的应用执行蓝牙低功耗扫描,可以使用新增的 [setCallbackType()](https://developer.android.com/reference/android/bluetooth/le/ScanSettings.Builder#setCallbackType(int)) 方法指定您只希望在下列条件下通知回调:首次找到与设置的 [ScanFilter](https://developer.android.com/reference/android/bluetooth/le/ScanFilter) 匹配的播发数据包,或者已过很长时间后才再次看到该数据包。这种扫描方法与旧平台版本中提供的方法相比更加节能。

Hotspot 2.0 第 1 版支持

此版本在 Nexus 6 和 Nexus 9 设备上添加了对 Hotspot 2.0 第 1 版规范的支持。要在您的应用中配置 Hotspot 2.0 凭据,请使用 [WifiEnterpriseConfig](https://developer.android.com/reference/android/net/wifi/WifiEnterpriseConfig) 类的新方法,如 [setPlmn()](https://developer.android.com/reference/android/net/wifi/WifiEnterpriseConfig#setPlmn(java.lang.String)) 方法和 [setRealm()](https://developer.android.com/reference/android/net/wifi/WifiEnterpriseConfig#setRealm(java.lang.String)) 方法。在 [WifiConfiguration](https://developer.android.com/reference/android/net/wifi/WifiConfiguration) 对象中,您可以设置 [FQDN](https://developer.android.com/reference/android/net/wifi/WifiConfiguration#FQDN) 字段和 [providerFriendlyName](https://developer.android.com/reference/android/net/wifi/WifiConfiguration#providerFriendlyName) 字段。新增的 [isPasspointNetwork()](https://developer.android.com/reference/android/net/wifi/ScanResult#isPasspointNetwork()) 方法可指示检测到的网络是否为 Hotspot 2.0 接入点。

4K 显示模式

现在,平台允许应用在兼容硬件上请求将显示分辨率升级到 4K 渲染。要查询当前物理分辨率,请使用新增的 [Display.Mode](https://developer.android.com/reference/android/view/Display.Mode) API。请注意,如果 UI 是以较低逻辑分辨率绘制并通过放大达到更高的物理分辨率,则 [getPhysicalWidth()](https://developer.android.com/reference/android/view/Display.Mode#getPhysicalWidth()) 方法返回的物理分辨率可能不同于 [getSize()](https://developer.android.com/reference/android/view/Display#getSize(android.graphics.Point)) 所报告的逻辑分辨率。

您可以通过设置应用窗口的 [preferredDisplayModeId](https://developer.android.com/reference/android/view/WindowManager.LayoutParams#preferredDisplayModeId) 属性请求系统更改应用运行时的物理分辨率。如果您想切换到 4K 显示分辨率,此功能会很有帮助。在 4K 显示模式下,UI 仍然以原始分辨率(如 1080p)渲染,通过放大达到 4K,但 [SurfaceView](https://developer.android.com/reference/android/view/SurfaceView) 对象可能会以原生分辨率显示内容。

主题化 ColorStateList

对于运行 Android 6.0(API 级别 23)的设备,现在支持在 [ColorStateList](https://developer.android.com/reference/android/content/res/ColorStateList) 中使用主题属性。[Resources.getColorStateList()](https://developer.android.com/reference/android/content/res/Resources#getColorStateList(int)) 方法和 [Resources.getColor()](https://developer.android.com/reference/android/content/res/Resources#getColor(int)) 方法已弃用。如果您要调用这些 API,请改为调用新增的 [Context.getColorStateList()](https://developer.android.com/reference/android/content/Context#getColorStateList(int)) 方法或 [Context.getColor()](https://developer.android.com/reference/android/content/Context#getColor(int)) 方法。还可在 v4 appcompat 库中通过 [ContextCompat](https://developer.android.com/reference/android/support/v4/content/ContextCompat) 使用这些方法。

音频功能

此版本增强了 Android 上的音频处理功能,包括:

  • 通过新增的 [android.media.midi](https://developer.android.com/reference/android/media/midi/package-summary) API 提供了对 MIDI 协议的支持。使用这些 API 可发送和接收 MIDI 事件。
  • 新增了 [AudioRecord.Builder](https://developer.android.com/reference/android/media/AudioRecord.Builder) 类和 [AudioTrack.Builder](https://developer.android.com/reference/android/media/AudioTrack.Builder) 类,分别用于创建数字音频采集和回放对象,还可用于配置音频源和接收器属性来替换系统默认值。
  • 用于关联音频和输入设备的 API 钩子。如果您的应用允许用户通过与 Android TV 相连的游戏控制器或遥控器启动语音搜索,此功能尤为有用。系统会在用户启动搜索时调用新增的 [onSearchRequested()](https://developer.android.com/reference/android/app/Activity#onSearchRequested(android.view.SearchEvent)) 回调。要确定用户的输入设备是否内置麦克风,请从该回调检索 [InputDevice](https://developer.android.com/reference/android/view/InputDevice) 对象,然后调用新的 [hasMicrophone()](https://developer.android.com/reference/android/view/InputDevice#hasMicrophone()) 方法。
  • 新增了 [getDevices()](https://developer.android.com/reference/android/media/AudioManager#getDevices(int)) 方法,让您可以检索系统当前连接的所有音频设备的列表。如果您想让系统在音频设备连接或断开时通知应用,还可以注册一个 [AudioDeviceCallback](https://developer.android.com/reference/android/media/AudioDeviceCallback) 对象。

视频功能

此版本为视频处理 API 添加了新功能,包括:

  • 新增了 [MediaSync](https://developer.android.com/reference/android/media/MediaSync) 类,可帮助应用同步渲染音频流和视频流。音频缓冲区以非锁定方式提交,并通过回调返回。此外,它还支持动态回放速率。
  • 新增了 [EVENT_SESSION_RECLAIMED](https://developer.android.com/reference/android/media/MediaDrm#EVENT_SESSION_RECLAIMED) 事件,它表示应用打开的会话已被资源管理器收回。如果您的应用使用 DRM 会话,则应处理此事件,并确保不使用收回的会话。
  • 新增了 [ERROR_RECLAIMED](https://developer.android.com/reference/android/media/MediaCodec.CodecException#ERROR_RECLAIMED) 错误代码,它表示资源管理器收回了编解码器使用的媒体资源。出现此异常时,必须释放编解码器,因为它已转入终止状态。
  • 新增了 [getMaxSupportedInstances()](https://developer.android.com/reference/android/media/MediaCodecInfo.CodecCapabilities#getMaxSupportedInstances()) 接口,用于获取有关支持的编解码器实例最大并发数量的提示。
  • 新增了 [setPlaybackParams()](https://developer.android.com/reference/android/media/MediaPlayer#setPlaybackParams(android.media.PlaybackParams)) 方法,用于设置快动作回放或慢动作回放的媒体回放速率。此外,它还会随视频一起自动拉长或加速音频回放。

相机功能

此版本提供了下列用于访问相机闪光灯和相机图像再处理的新 API:

Flashlight API

如果相机设备带有闪光灯,您可以通过调用 [setTorchMode()](https://developer.android.com/reference/android/hardware/camera2/CameraManager#setTorchMode(java.lang.String,%20boolean)) 方法,在不打开相机设备的情况下打开或关闭闪光灯的火炬模式。应用对闪光灯或相机设备不享有独占所有权。每当相机设备不可用,或者开启火炬的其他相机资源不可用时,火炬模式即会被关闭并变为不可用状态。其他应用也可调用 [setTorchMode()](https://developer.android.com/reference/android/hardware/camera2/CameraManager#setTorchMode(java.lang.String,%20boolean)) 来关闭火炬模式。当最后一个开启火炬模式的应用关闭时,火炬模式就会被关闭。

您可以注册一个回调,通过调用 [registerTorchCallback()](https://developer.android.com/reference/android/hardware/camera2/CameraManager#registerTorchCallback(android.hardware.camera2.CameraManager.TorchCallback,%20android.os.Handler)) 方法接收有关火炬模式状态的通知。第一次注册回调时,系统会立即调用它,并返回所有当前已知配备闪光灯的相机设备的火炬模式状态。如果成功开启或关闭火炬模式,系统会调用 [onTorchModeChanged()](https://developer.android.com/reference/android/hardware/camera2/CameraManager.TorchCallback#onTorchModeChanged(java.lang.String,%20boolean)) 方法。

Reprocessing API

[Camera2](https://developer.android.com/reference/android/hardware/camera2/package-summary) API 进行了扩展,以支持 YUV 和专用不透明格式图像再处理。要确定这些再处理功能是否可用,请调用 [getCameraCharacteristics()](https://developer.android.com/reference/android/hardware/camera2/CameraManager#getCameraCharacteristics(java.lang.String)) 并检查有无 [REPROCESS_MAX_CAPTURE_STALL](https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics#REPROCESS_MAX_CAPTURE_STALL) 密钥。如果设备支持再处理,您可以通过调用 createReprocessableCaptureSession() 创建一个可再处理的相机采集会话并创建输入缓冲区再处理请求。

使用 [ImageWriter](https://developer.android.com/reference/android/media/ImageWriter) 类可将输入缓冲区流与相机再处理输入相连。要获得空白缓冲区,请遵循以下编程模型:

  1. 调用 [dequeueInputImage()](https://developer.android.com/reference/android/media/ImageWriter#dequeueInputImage()) 方法。
  2. 在输入缓冲区中填充数据。
  3. 通过调用 [queueInputImage()](https://developer.android.com/reference/android/media/ImageWriter#queueInputImage(android.media.Image)) 方法将缓冲区发送至相机。

如果您将 [ImageWriter](https://developer.android.com/reference/android/media/ImageWriter) 对象与 [PRIVATE](https://developer.android.com/reference/android/graphics/ImageFormat#PRIVATE) 图像一起使用,您的应用并不能直接访问图像数据。请改为调用 [queueInputImage()](https://developer.android.com/reference/android/media/ImageWriter#queueInputImage(android.media.Image)) 方法,将 [PRIVATE](https://developer.android.com/reference/android/graphics/ImageFormat#PRIVATE) 图像直接传递给 [ImageWriter](https://developer.android.com/reference/android/media/ImageWriter),而不进行任何缓冲区复制。

[ImageReader](https://developer.android.com/reference/android/media/ImageReader) 类现在支持 [PRIVATE](https://developer.android.com/reference/android/graphics/ImageFormat#PRIVATE) 格式图像流。凭借此支持特性,您的应用可使 [ImageReader](https://developer.android.com/reference/android/media/ImageReader) 输出图像保持为循环图像队列,还可选择一个或多个图像并将其发送给 [ImageWriter](https://developer.android.com/reference/android/media/ImageWriter) 进行相机再处理。

Android for Work 功能

此版本提供了下列用于 Android for Work 的新 API:

  • 用于企业所有、单一用途设备的增强型控件:现在,设备所有者可以通过控制以下设置来改善企业所有、单一用途 (COSU) 设备的管理:

    • 通过 [setKeyguardDisabled()](https://developer.android.com/reference/android/app/admin/DevicePolicyManager#setKeyguardDisabled(android.content.ComponentName,%20boolean)) 方法停用或重新启用键盘锁。
    • 通过 [setStatusBarDisabled()](https://developer.android.com/reference/android/app/admin/DevicePolicyManager#setStatusBarDisabled(android.content.ComponentName,%20boolean)) 方法停用或重新启用状态栏(包括快速设置、通知以及启动 Google 即时的向上划动导航手势)。
    • 通过 [UserManager](https://developer.android.com/reference/android/os/UserManager) 常量 [DISALLOW_SAFE_BOOT](https://developer.android.com/reference/android/os/UserManager#DISALLOW_SAFE_BOOT) 停用或重新启用安全启动。
    • 通过 [STAY_ON_WHILE_PLUGGED_IN](https://developer.android.com/reference/android/provider/Settings.Global#STAY_ON_WHILE_PLUGGED_IN) 常量防止屏幕在插入电源的情况下关闭。
  • 设备所有者静默式安装和卸载应用:现在,设备所有者可使用 [PackageInstaller](https://developer.android.com/reference/android/content/pm/PackageInstaller) API 在不依赖 Google Play for Work 的情况下静默式安装和卸载应用。现在,您可以通过设备所有者配置设备,从而无需用户干预即可获取并安装应用。此功能可用于在不激活 Google 帐户的情况下实现信息亭或其他此类设备的一键式配置。

  • 静默式企业证书访问: 现在,当应用调用 [choosePrivateKeyAlias()](https://developer.android.com/reference/android/security/KeyChain#choosePrivateKeyAlias(android.app.Activity,%20android.security.KeyChainAliasCallback,%20java.lang.String[],%20java.security.Principal[],%20java.lang.String,%20int,%20java.lang.String)) 时,配置文件所有者或设备所有者可以在系统提示用户选择证书前调用 [onChoosePrivateKeyAlias()](https://developer.android.com/reference/android/app/admin/DeviceAdminReceiver#onChoosePrivateKeyAlias(android.content.Context,%20android.content.Intent,%20int,%20android.net.Uri,%20java.lang.String)) 方法,静默式向发出请求的应用提供别名。此功能让您可以在无需用户交互的情况下授予托管应用访问证书的权限。

  • 自动接受系统更新。现在,设备所有者可以通过 [setSystemUpdatePolicy()](https://developer.android.com/reference/android/app/admin/DevicePolicyManager#setSystemUpdatePolicy(android.content.ComponentName,%20android.app.admin.SystemUpdatePolicy)) 设置一个系统更新政策来自动接受系统更新(例如对于信息亭设备),或者推迟更新并在至多 30 天的时间内防止用户获取更新。此外,管理员还可设置每日必须获取更新的时间窗口,例如在信息亭设备无人使用的时段。有可用的系统更新时,系统会检查设备规范控制器应用是否设置了系统更新政策,并相应地执行操作。

  • 授权证书安装:配置文件所有者或设备所有者现在可以授权第三方应用调用以下 [DevicePolicyManager](https://developer.android.com/reference/android/app/admin/DevicePolicyManager) 证书管理 API:

    • [getInstalledCaCerts()](https://developer.android.com/reference/android/app/admin/DevicePolicyManager#getInstalledCaCerts(android.content.ComponentName))
    • [hasCaCertInstalled()](https://developer.android.com/reference/android/app/admin/DevicePolicyManager#hasCaCertInstalled(android.content.ComponentName,%20byte[]))
    • [installCaCert()](https://developer.android.com/reference/android/app/admin/DevicePolicyManager#installCaCert(android.content.ComponentName,%20byte[]))
    • [uninstallCaCert()](https://developer.android.com/reference/android/app/admin/DevicePolicyManager#uninstallCaCert(android.content.ComponentName,%20byte[]))
    • [uninstallAllUserCaCerts()](https://developer.android.com/reference/android/app/admin/DevicePolicyManager#uninstallAllUserCaCerts(android.content.ComponentName))
    • [installKeyPair()](https://developer.android.com/reference/android/app/admin/DevicePolicyManager#installKeyPair(android.content.ComponentName,%20java.security.PrivateKey,%20java.security.cert.Certificate,%20java.lang.String))
  • 流量消耗情况跟踪。现在,配置文件所有者或设备所有者可以利用新增的 [NetworkStatsManager](https://developer.android.com/reference/android/app/usage/NetworkStatsManager) 方法查询 Settings > Data Usage 中显示的流量使用情况统计信息。配置文件所有者会被自动授予查询其管理的配置文件相关数据的权限,而设备所有者则被授予对其管理的主要用户使用情况数据的访问权。

  • 运行时权限管理

    配置文件所有者或设备所有者可以利用 [setPermissionPolicy()](https://developer.android.com/reference/android/app/admin/DevicePolicyManager#setPermissionPolicy(android.content.ComponentName,%20int)) 设置适用于所有应用全部运行时请求的权限政策,以提示用户授予权限,或自动以静默方式授予或拒绝权限。如果设置后一种政策,则用户将无法修改配置文件所有者或设备所有者在应用权限屏幕的 Settings 内所做的选择。

  • Settings 中的 VPN:现在,Settings > More > VPN 中会显示 VPN 应用。此外,现在,关于 VPN 使用情况的通知取决于该 VPN 的配置方式。对于配置文件所有者,通知取决于该 VPN 是针对托管配置文件、个人配置文件还是同时针对这两者进行配置。对于设备所有者,通知取决于 VPN 是否针对整个设备进行配置。

  • 工作状态通知:现在,每当来自托管配置文件的应用具有前台 Activity 时,状态栏就会出现一个公文包图标。此外,如果设备直接解锁到托管配置文件中某个应用的 Activity,则会显示一个 Toast,通知用户他们位于托管配置文件内。

Android 6.0(API 级别 23)除了提供诸多新特性和功能外,还对系统和 API 行为做出了各种变更。

如果您之前发布过 Android 应用,请注意您的应用可能受到这些平台变更的影响。

运行时权限

此版本引入了一种新的权限模式,如今,用户可直接在运行时管理应用权限。这种模式让用户能够更好地了解和控制权限,同时为应用开发者精简了安装和自动更新过程。用户可为所安装的各个应用分别授予或撤销权限。

对于以 Android 6.0(API 级别 23)或更高版本为目标平台的应用,请务必在运行时检查和请求权限。要确定您的应用是否已被授予权限,请调用新增的 [checkSelfPermission()](https://developer.android.com/reference/android/content/Context#checkSelfPermission(java.lang.String)) 方法。要请求权限,请调用新增的 [requestPermissions()](https://developer.android.com/reference/android/app/Activity#requestPermissions(java.lang.String[],%20int)) 方法。即使您的应用并不以 Android 6.0(API 级别 23)为目标平台,您也应该在新权限模式下测试您的应用。

如需了解有关在您的应用中支持新权限模式的详情,请参阅使用系统权限。如需了解有关如何评估新模式对应用的影响的提示,请参阅权限最佳做法

低电耗模式和应用待机模式

此版本引入了针对空闲设备和应用的最新节能优化技术。这些功能会影响所有应用,因此请务必在这些新模式下测试您的应用。

  • 低电耗模式:如果用户拔下设备的电源插头,并在屏幕关闭后的一段时间内使其保持不活动状态,设备会进入低电耗模式,在该模式下设备会尝试让系统保持休眠状态。在该模式下,设备会定期短时间恢复正常工作,以便进行应用同步,还可让系统执行任何挂起的操作。
  • 应用待机模式:应用待机模式允许系统判定应用在用户未主动使用它时处于空闲状态。当用户有一段时间未触摸应用时,系统便会作出此判定。如果拔下了设备电源插头,系统会为其视为空闲的应用停用网络访问以及暂停同步和作业。

要详细了解这些节能变更,请参阅对低电耗模式和应用待机模式进行针对性优化

取消支持 Apache HTTP 客户端

Android 6.0 版移除了对 Apache HTTP 客户端的支持。如果您的应用使用该客户端,并以 Android 2.3(API 级别 9)或更高版本为目标平台,请改用 [HttpURLConnection](https://developer.android.com/reference/java/net/HttpURLConnection) 类。此 API 效率更高,因为它可以通过透明压缩和响应缓存减少网络使用,并可最大限度降低耗电量。要继续使用 Apache HTTP API,您必须先在 build.gradle 文件中声明以下编译时依赖项:

android {
    useLibrary 'org.apache.http.legacy'
}

BoringSSL

Android 正在从使用 OpenSSL 库转向使用 BoringSSL 库。如果您要在应用中使用 Android NDK,请勿链接到并非 NDK API 组成部分的加密库,如 libcrypto.solibssl.so。这些库并非公共 API,可能会在不同版本和设备上毫无征兆地发生变化或出现故障。此外,您还可能让自己暴露在安全漏洞的风险之下。请改为修改原生代码,以通过 JNI 调用 Java 加密 API,或静态链接到您选择的加密库。

硬件标识符访问权

为给用户提供更严格的数据保护,从此版本开始,对于使用 WLAN API 和 Bluetooth API 的应用,Android 移除了对设备本地硬件标识符的编程访问权。[WifiInfo.getMacAddress()](https://developer.android.com/reference/android/net/wifi/WifiInfo#getMacAddress()) 方法和 [BluetoothAdapter.getAddress()](https://developer.android.com/reference/android/bluetooth/BluetoothAdapter#getAddress()) 方法现在会返回常量值 02:00:00:00:00:00

现在,要通过蓝牙和 WLAN 扫描访问附近外部设备的硬件标识符,您的应用必须拥有 [ACCESS_FINE_LOCATION](https://developer.android.com/reference/android/Manifest.permission#ACCESS_FINE_LOCATION)[ACCESS_COARSE_LOCATION](https://developer.android.com/reference/android/Manifest.permission#ACCESS_COARSE_LOCATION) 权限。

  • [WifiManager.getScanResults()](https://developer.android.com/reference/android/net/wifi/WifiManager#getScanResults())
  • [BluetoothDevice.ACTION_FOUND](https://developer.android.com/reference/android/bluetooth/BluetoothDevice#ACTION_FOUND)
  • [BluetoothLeScanner.startScan()](https://developer.android.com/reference/android/bluetooth/le/BluetoothLeScanner#startScan(android.bluetooth.le.ScanCallback))

:当运行 Android 6.0(API 级别 23)的设备发起后台 WLAN 或蓝牙扫描时,在外部设备看来,该操作的发起来源是一个随机化 MAC 地址。

通知

此版本移除了 Notification.setLatestEventInfo() 方法。请改用 [Notification.Builder](https://developer.android.com/reference/android/app/Notification.Builder) 类来构建通知。要重复更新通知,请重复使用 [Notification.Builder](https://developer.android.com/reference/android/app/Notification.Builder) 实例。调用 [build()](https://developer.android.com/reference/android/app/Notification.Builder#build()) 方法可获取更新后的 [Notification](https://developer.android.com/reference/android/app/Notification) 实例。

adb shell dumpsys notification 命令不再打印输出您的通知文本。请改用 adb shell dumpsys notification --noredact 命令打印输出 notification 对象中的文本。

音频管理器变更

不再支持通过 [AudioManager](https://developer.android.com/reference/android/media/AudioManager) 类直接设置音量或将特定音频流静音。[setStreamSolo()](https://developer.android.com/reference/android/media/AudioManager#setStreamSolo(int,%20boolean)) 方法已弃用,您应该改为调用 [requestAudioFocus()](https://developer.android.com/reference/android/media/AudioManager#requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener,%20int,%20int)) 方法。类似地,[setStreamMute()](https://developer.android.com/reference/android/media/AudioManager#setStreamMute(int,%20boolean)) 方法也已弃用,请改为调用 [adjustStreamVolume()](https://developer.android.com/reference/android/media/AudioManager#adjustStreamVolume(int,%20int,%20int)) 方法并传入方向值 [ADJUST_MUTE](https://developer.android.com/reference/android/media/AudioManager#ADJUST_MUTE)[ADJUST_UNMUTE](https://developer.android.com/reference/android/media/AudioManager#ADJUST_UNMUTE)

文本选择

现在,当用户在您的应用中选择文本时,您可以在一个浮动工具栏中显示“剪切”“复制”“粘贴”等文本选择操作。其在用户交互实现上与为单个视图启用上下文操作模式中所述的上下文操作栏类似。

要实现可用于文本选择的浮动工具栏,请在您的现有应用中做出以下更改:

  1. [View](https://developer.android.com/reference/android/view/View) 对象或 [Activity](https://developer.android.com/reference/android/app/Activity) 对象中,将 [ActionMode](https://developer.android.com/reference/android/view/ActionMode) 调用从 startActionMode(Callback) 更改为 startActionMode(Callback, ActionMode.TYPE_FLOATING)
  2. 改为使用 ActionMode.Callback 的现有实现扩展 [ActionMode.Callback2](https://developer.android.com/reference/android/view/ActionMode.Callback2)
  3. 替代 [onGetContentRect()](https://developer.android.com/reference/android/view/ActionMode.Callback2#onGetContentRect(android.view.ActionMode,%20android.view.View,%20android.graphics.Rect)) 方法,用于提供 [Rect](https://developer.android.com/reference/android/graphics/Rect) 内容对象(如文本选择矩形)在视图中的坐标。
  4. 如果矩形的定位不再有效,并且这是唯一需要声明为无效的元素,请调用 [invalidateContentRect()](https://developer.android.com/reference/android/view/ActionMode#invalidateContentRect()) 方法。

请注意,如果您使用 Android 支持库 22.2 修订版,浮动工具栏不向后兼容,默认情况下 appcompat 会获得对 [ActionMode](https://developer.android.com/reference/android/view/ActionMode) 对象的控制权。这会禁止显示浮动工具栏。要在 [ActionMode](https://developer.android.com/reference/android/view/ActionMode) 中启用 [AppCompatActivity](https://developer.android.com/reference/android/support/v7/app/AppCompatActivity) 支持,请调用 [getDelegate()](https://developer.android.com/reference/android/support/v7/app/AppCompatActivity#getDelegate()),然后对返回的 [setHandleNativeActionModesEnabled()](https://developer.android.com/reference/android/support/v7/app/AppCompatDelegate#setHandleNativeActionModesEnabled(boolean)) 对象调用 [AppCompatDelegate](https://developer.android.com/reference/android/support/v7/app/AppCompatDelegate),并将输入参数设置为 false。此调用会将 [ActionMode](https://developer.android.com/reference/android/view/ActionMode) 对象的控制权交还给框架。在运行 Android 6.0(API 级别 23)的设备上,框架可以支持 [ActionBar](https://developer.android.com/reference/android/support/v7/app/ActionBar) 模式或浮动工具栏模式;而在运行 Android 5.1(API 级别 22)或之前版本的设备上,框架仅支持 [ActionBar](https://developer.android.com/reference/android/support/v7/app/ActionBar) 模式。

浏览器书签变更

此版本移除了对全局书签的支持。android.provider.Browser.getAllBookmarks()android.provider.Browser.saveBookmark() 方法现已移除。同样,READ_HISTORY_BOOKMARKS 权限和 WRITE_HISTORY_BOOKMARKS 权限也已移除。如果您的应用以 Android 6.0(API 级别 23)或更高版本为目标平台,请勿从全局提供程序访问书签或使用书签权限。您的应用应改为在内部存储书签数据。

Android 密钥库变更

从此版本开始,Android 密钥库提供程序不再支持 DSA。但仍支持 ECDSA。

停用或重置安全锁定屏幕时(例如,由用户或设备管理员执行此类操作时),系统将不再删除需要闲时加密的密钥,但在上述事件期间会删除需要闲时加密的密钥。

WLAN 和网络连接变更

此版本对 WLAN API 和 Networking API 引入了以下行为变更。

  • 现在,您的应用只能更改由您创建的 [WifiConfiguration](https://developer.android.com/reference/android/net/wifi/WifiConfiguration) 对象的状态。系统不允许您修改或删除由用户或其他应用创建的 [WifiConfiguration](https://developer.android.com/reference/android/net/wifi/WifiConfiguration) 对象。
  • 在之前的版本中,如果应用利用带有 disableAllOthers=true 设置的 [enableNetwork()](https://developer.android.com/reference/android/net/wifi/WifiManager#enableNetwork(int,%20boolean)) 强制设备连接特定 WLAN 网络,设备将会断开与移动数据网络等其他网络的连接。在此版本中,设备不再断开与上述其他网络的连接。如果您的应用的 targetSdkVersion“20” 或更低,则会固定连接所选 WLAN 网络。如果您的应用的 targetSdkVersion“21” 或更高,请使用多网络 API(如 [openConnection()](https://developer.android.com/reference/android/net/Network#openConnection(java.net.URL))[bindSocket()](https://developer.android.com/reference/android/net/Network#bindSocket(java.net.Socket)) 和新增的 [bindProcessToNetwork()](https://developer.android.com/reference/android/net/ConnectivityManager#bindProcessToNetwork(android.net.Network)) 方法)来确保通过所选网络传送网络流量。

相机服务变更

在此版本中,相机服务中共享资源的访问模式已从之前的“先到先得”访问模式更改为高优先级进程优先的访问模式。对服务行为的变更包括:

  • 根据客户端应用进程的“优先级”授予对相机子系统资源的访问权,包括打开和配置相机设备。带有对用户可见 Activity 或前台 Activity 的应用进程一般会被授予较高的优先级,从而使相机资源的获取和使用更加可靠;
  • 当高优先级的应用尝试使用相机时,系统可能会“驱逐”正在使用相机客户端的低优先级应用。在已弃用的 [Camera](https://developer.android.com/reference/android/hardware/Camera) API 中,这会导致系统为被驱逐的客户端调用 [onError()](https://developer.android.com/reference/android/hardware/Camera.ErrorCallback#onError(int,%20android.hardware.Camera))。在 [Camera2](https://developer.android.com/reference/android/hardware/camera2/package-summary) API 中,这会导致系统为被驱逐的客户端调用 [onDisconnected()](https://developer.android.com/reference/android/hardware/camera2/CameraDevice.StateCallback#onDisconnected(android.hardware.camera2.CameraDevice))
  • 在配备相应相机硬件的设备上,不同的应用进程可同时独立打开和使用不同的相机设备。但现在,如果在多进程用例中同时访问相机会造成任何打开的相机设备的性能或能力严重下降,相机服务会检测到这种情况并禁止同时访问。即使并没有其他应用直接尝试访问同一相机设备,此变更也可能导致低优先级客户端被“驱逐”。
  • 更改当前用户会导致之前用户帐户拥有的应用内活动相机客户端被驱逐。对相机的访问仅限于访问当前设备用户拥有的用户个人资料。举例来说,这意味着,当用户切换到其他帐户后,“来宾”帐户实际上无法让使用相机子系统的进程保持运行状态。

运行时

ART 运行时环境现在可正确实现 [newInstance()](https://developer.android.com/reference/java/lang/reflect/Constructor#newInstance(java.lang.Object...)) 方法的访问规则。此变更修正了之前版本中 Dalvik 无法正确检查访问规则的问题。如果您的应用使用 [newInstance()](https://developer.android.com/reference/java/lang/reflect/Constructor#newInstance(java.lang.Object...)) 方法,并且您想重写访问检查,请调用 [setAccessible()](https://developer.android.com/reference/java/lang/reflect/AccessibleObject#setAccessible(boolean)) 方法(将输入参数设置为 true)。如果您的应用使用 v7 appcompat 库v7 recyclerview 库,则您必须更新应用以使用这些库的最新版本。否则,请务必更新从 XML 引用的任何自定义类,以便能够访问它们的类构造函数。

此版本更新了动态链接程序的行为。动态链接程序现在可以识别库的 soname 与其路径之间的差异(公开错误 6670),并且现在已实现了按 soname 搜索。之前包含错误的 DT_NEEDED 条目(通常是开发计算机文件系统上的绝对路径)却仍工作正常的应用,如今可能会出现加载失败。

现已正确实现 dlopen(3) RTLD_LOCAL 标记。请注意,RTLD_LOCAL 是默认值,因此不显式使用 RTLD_LOCALdlopen(3) 调用将受到影响(除非您的应用显式使用 RTLD_GLOBAL)。使用 RTLD_LOCAL 时,在随后通过调用 dlopen(3) 加载的库中并不能使用这些符号(这与由 DT_NEEDED 条目引用的情况截然不同)。

在之前版本的 Android 上,如果您的应用请求系统加载包含文本重定位信息的共享库,系统会显示警告,但仍允许加载共享库。从此版本开始,如果您的应用的目标 SDK 版本为 23 或更高,则系统会拒绝加载该库。为帮助您检测库是否加载失败,您的应用应该记录 dlopen(3) 失败日志,并在日志中加入 dlerror(3) 调用返回的问题描述文本。要详细了解如何处理文本重定位,请参阅此指南

APK 验证

该平台现在执行的 APK 验证更为严格。如果在清单中声明的文件在 APK 中并不存在,该 APK 将被视为已损坏。移除任何内容后必须重新签署 APK。

USB 连接

默认情况下,现在通过 USB 端口进行的设备连接设置为仅充电模式。要通过 USB 连接访问设备及其内容,用户必须明确地为此类交互授予权限。如果您的应用支持用户通过 USB 端口与设备进行交互,请将必须显式启用交互考虑在内。

Android for Work 变更

此版本包含下列针对 Android for Work 的行为变更:

  • 个人上下文中的工作联系人。Google 拨号器通话记录现在会在用户查看通话记录时显示工作联系人。将 [setCrossProfileCallerIdDisabled()](https://developer.android.com/reference/android/app/admin/DevicePolicyManager#setCrossProfileCallerIdDisabled(android.content.ComponentName,%20boolean)) 设置为 true 可在 Google 拨号器通话记录中隐藏托管配置文件联系人。仅当您将 [setBluetoothContactSharingDisabled()](https://developer.android.com/reference/android/app/admin/DevicePolicyManager#setBluetoothContactSharingDisabled(android.content.ComponentName,%20boolean)) 设置为 false 时,才可以通过蓝牙将工作联系人随个人联系人一起显示给设备。默认情况下,它设置为 true
  • WLAN 配置删除:现在,当删除某个托管配置文件时,将会移除由配置文件所有者添加的 WLAN 配置(例如,通过调用 [addNetwork()](https://developer.android.com/reference/android/net/wifi/WifiManager#addNetwork(android.net.wifi.WifiConfiguration)) 方法添加的配置)。
  • WLAN 配置锁定:如果 [WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN](https://developer.android.com/reference/android/provider/Settings.Global#WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN) 不为零,则用户无法再修改或删除任何由活动设备所有者创建的 WLAN 配置。用户仍可创建和修改其自己的 WLAN 配置。活动设备所有者拥有编辑或删除任何 WLAN 配置(包括并非由其创建的配置)的权限。
  • 通过添加 Google 帐户下载设备规范控制器:向托管环境以外的设备添加需要通过设备规范控制器 (DPC) 应用管理的 Google 帐户时,帐户添加流程现在会提示用户安装相应的 WPC。在设备初始设置向导中通过 Settings > Accounts 添加帐户时,也会出现此行为。
  • 对特定 [DevicePolicyManager](https://developer.android.com/reference/android/app/admin/DevicePolicyManager) API 行为的变更:
    • 调用 [setCameraDisabled()](https://developer.android.com/reference/android/app/admin/DevicePolicyManager#setCameraDisabled(android.content.ComponentName,%20boolean)) 方法只会影响调用该方法的用户的相机;从托管配置文件调用它不会影响主用户运行的相机应用。
    • 此外,[setKeyguardDisabledFeatures()](https://developer.android.com/reference/android/app/admin/DevicePolicyManager#setKeyguardDisabledFeatures(android.content.ComponentName,%20int)) 方法现在除了可供设备所有者使用外,还可供配置文件所有者使用。
    • 配置文件所有者可设置以下键盘锁限制:
      • [KEYGUARD_DISABLE_TRUST_AGENTS](https://developer.android.com/reference/android/app/admin/DevicePolicyManager#KEYGUARD_DISABLE_TRUST_AGENTS)[KEYGUARD_DISABLE_FINGERPRINT](https://developer.android.com/reference/android/app/admin/DevicePolicyManager#KEYGUARD_DISABLE_FINGERPRINT),它们影响配置文件上级用户的键盘锁设置。
      • [KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS](https://developer.android.com/reference/android/app/admin/DevicePolicyManager#KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS),它只影响应用在托管配置文件中生成的通知。
    • DevicePolicyManager.createAndInitializeUser() 方法和 DevicePolicyManager.createUser() 方法已弃用。
    • 当给定用户的应用在前台运行时,[setScreenCaptureDisabled()](https://developer.android.com/reference/android/app/admin/DevicePolicyManager#setScreenCaptureDisabled(android.content.ComponentName,%20boolean)) 方法现在也会屏蔽辅助结构。
    • [EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM](https://developer.android.com/reference/android/app/admin/DevicePolicyManager#EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM) 现在默认为 SHA-256。出于向后兼容性考虑,仍然支持 SHA-1,但未来将会取消该支持。[EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM](https://developer.android.com/reference/android/app/admin/DevicePolicyManager#EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM) 现在只接受 SHA-256。
    • Android 6.0(API 级别 23)中曾经存在的 Device initializer API 现已删除
    • EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS 已删除,因此 NFC 占位配置无法通过编程解锁受恢复出厂设置保护的设备
    • 您现在可以使用 [EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE](https://developer.android.com/reference/android/app/admin/DevicePolicyManager#EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE) extra 在对托管设备进行 NFC 配置期间向设备所有者应用传递数据。
    • Android for Work API 针对 M 运行时权限(包括 Work 配置文件、辅助层及其他内容)进行了优化。新增的 [DevicePolicyManager](https://developer.android.com/reference/android/app/admin/DevicePolicyManager) 权限 API 不会影响 M 之前版本的应用。
    • 当用户退出通过 [ACTION_PROVISION_MANAGED_PROFILE](https://developer.android.com/reference/android/app/admin/DevicePolicyManager#ACTION_PROVISION_MANAGED_PROFILE)[ACTION_PROVISION_MANAGED_DEVICE](https://developer.android.com/reference/android/app/admin/DevicePolicyManager#ACTION_PROVISION_MANAGED_DEVICE) intent 发起的设置流程的同步部分时,系统现在会返回 [RESULT_CANCELED](https://developer.android.com/reference/android/app/Activity#RESULT_CANCELED) 结果代码。
  • 对其他 API 的变更
    • 流量消耗:android.app.usage.NetworkUsageStats 类已重命名为 [NetworkStats](https://developer.android.com/reference/android/app/usage/NetworkStats)
  • 对全局设置的变更
    • 这些设置不再通过 [setGlobalSettings()](https://developer.android.com/reference/android/app/admin/DevicePolicyManager#setGlobalSetting(android.content.ComponentName,%20java.lang.String,%20java.lang.String)) 进行设置:
      • BLUETOOTH_ON
      • DEVELOPMENT_SETTINGS_ENABLED
      • MODE_RINGER
      • NETWORK_PREFERENCE
      • WIFI_ON
    • 这些全局设置现在可通过 [setGlobalSettings()](https://developer.android.com/reference/android/app/admin/DevicePolicyManager#setGlobalSetting(android.content.ComponentName,%20java.lang.String,%20java.lang.String)) 进行设置:
      • [WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN](https://developer.android.com/reference/android/provider/Settings.Global#WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349