Android 6.0 API

Android 6.0 (M) 为用户和应用开发者提供了新功能。本文档简要介绍了最值得关注的 API。

开始开发

如需开始为 Android 6.0 构建应用,您必须先获取 Android SDK。然后使用 SDK 管理器下载 Android 6.0 SDK 平台和系统映像。

更新目标 API 级别

为了更好地针对搭载 Android 的设备优化应用,请将 targetSdkVersion 设置为 "23",在 Android 系统映像上安装应用并进行测试,然后发布包含此变更的更新版应用。

您可以使用 Android API,同时通过在代码中添加条件来检查系统 API 级别,从而支持旧版本。这样一来,在执行 minSdkVersion 不支持的 API 之前,系统会先检查 API 级别。如需详细了解如何保持向后兼容性,请参阅支持不同的平台版本。

如需详细了解 API 级别的工作原理,请参阅什么是 API 级别?

指纹身份验证

此版本提供了一些新的 API,可让您在支持的设备上通过指纹扫描对用户进行身份验证。请结合使用这些 API 和 Android 密钥库系统。

如需通过指纹扫描对用户进行身份验证,请获取新 FingerprintManager 类的实例并调用 authenticate() 方法。您的应用必须在配备指纹传感器的兼容设备上运行。您必须在应用中实现指纹身份验证流程的界面,并在界面中使用标准的 Android 指纹图标。Android 指纹图标 (c_fp_40px.png) 包含在生物识别身份验证示例中。 如果您正在开发多款使用指纹身份验证的应用,请注意,每款应用都必须独立验证用户的指纹。

如需在应用中使用此功能,请先在清单中添加 USE_FINGERPRINT 权限。

<uses-permission
        android:name="android.permission.USE_FINGERPRINT" />
显示指纹身份验证功能的移动设备

如需查看指纹身份验证的应用实现,请参阅生物识别身份验证示例。 如需观看演示如何将这些身份验证 API 与其他 Android API 搭配使用,请观看视频 指纹和付款 API。

如果您正在测试此功能,请按以下步骤操作:

  1. 安装 Android SDK 工具修订版 24.3(如果您尚未安装)。
  2. 在模拟器中注册新指纹,方法是依次前往设置 > 安全 > 指纹,然后按照注册说明进行操作。
  3. 使用模拟器通过以下命令模拟指纹触控事件。使用同一命令可在锁屏界面或应用中模拟指纹触摸事件。
    adb -e emu finger touch <finger_id>
    

    在 Windows 上,您可能需要先运行 telnet 127.0.0.1 <emulator-id>,然后再运行 finger touch <finger_id>。

确认凭据

您的应用可以根据用户上次解锁设备的最近时间来验证用户身份。此功能可让用户不必记住其他特定于应用的密码,并避免您需要实现自己的身份验证用户界面。您的应用应将此功能与公钥或密钥实现结合使用,以进行用户身份验证。

如需设置在用户成功通过身份验证后可重复使用同一密钥的超时时长,请在设置 KeyGenerator 或 KeyPairGenerator 时调用新的 setUserAuthenticationValidityDurationSeconds() 方法。

避免过度显示重新身份验证对话框 - 您的应用应先尝试使用加密对象,如果超时时间到期,则使用 createConfirmDeviceCredentialIntent() 方法在应用内重新对用户进行身份验证。

应用关联

此版本通过提供更强大的应用链接功能来增强 Android 的 intent 系统。借助此功能,您可以将应用与您拥有的网域相关联。根据此关联,平台可以确定用于处理特定网页链接的默认应用,并跳过提示用户选择应用这一步骤。如需了解如何实现此功能,请参阅处理应用链接。

应用自动备份

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

直接分享

显示“直接分享”功能的移动设备的底部

此版本为您提供了相关 API,可让用户直观快速地进行分享。您现在可以定义启动应用中特定 activity 的直接分享目标。这些直接分享目标通过分享菜单向用户公开。借助此功能,用户可以将内容分享给其他应用中的目标对象(例如联系人)。例如,直接分享目标可能会启动另一个社交网络应用中的 activity,让用户直接向该应用中的特定好友或社区分享内容。

如需启用直接分享目标,您必须定义一个扩展 ChooserTargetService 类的类。在清单中声明您的服务。在该声明中,指定 BIND_CHOOSER_TARGET_SERVICE 权限和使用 SERVICE_INTERFACE 操作的 intent 过滤器。

以下示例展示了如何在清单中声明 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 公开的每个 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,该 API 与语音操作一起,可让您在应用中构建对话式语音体验。调用 isVoiceInteraction() 方法来确定语音操作是否触发了您的 activity。如果是,您的应用可以使用 VoiceInteractor 类来请求用户进行语音确认、从选项列表中进行选择等。

大多数语音互动都源自用户语音操作。不过,语音互动 activity 也可以在没有用户输入的情况下启动。例如,通过语音互动启动的另一个应用也可以发送 intent 来启动语音互动。如需确定您的 activity 是从用户语音查询还是从其他语音互动应用启动的,请调用 isVoiceInteractionRoot() 方法。如果您的 activity 是由其他应用启动的,该方法会返回 false。然后,您的应用可能会提示用户确认他们是否确实要执行此操作。

如需详细了解如何实现语音操作,请访问语音操作开发者网站。

Assist API

此版本提供了一种新方式,让用户可以通过助理与您的应用互动。如需使用此功能,用户必须允许助理使用当前上下文。启用后,用户可以在任何应用中长按主屏幕按钮来唤出助理。

您的应用可以选择不与助理分享当前上下文,只需设置 FLAG_SECURE 标志即可。除了平台传递给助理的标准信息集之外,您的应用还可以使用新的 AssistContent 类分享其他信息。

如需为助理提供来自应用的更多上下文,请按以下步骤操作:

  1. 实现 Application.OnProvideAssistDataListener 接口。
  2. 使用 registerOnProvideAssistDataListener() 注册此监听器。
  3. 为了提供特定于 activity 的情境信息,请替换 onProvideAssistData() 回调,并可选择替换新的 onProvideAssistContent() 回调。

可合并的存储设备

在此版本中,用户可以采用外部存储设备(例如 SD 卡)。合并外部存储设备会加密并格式化该设备,使其像内部存储设备一样运行。借助此功能,用户可以在存储设备之间移动应用和这些应用的私密数据。移动应用时,系统会遵循清单中的 android:installLocation 偏好设置。

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

如需调试此功能,您可以运行以下命令,以启用对通过 USB On-The-Go (OTG) 数据线连接到 Android 设备的 USB 驱动器的采用:

$ adb shell sm set-force-adoptable true

通知

此版本针对通知添加了以下 API 变更:

蓝牙触控笔支持

此版本改进了对使用蓝牙触控笔输入的用户输入的支持。用户可以将兼容的蓝牙触控笔与手机或平板电脑配对并连接。连接后,触控屏的位置信息会与触控笔的压力和按钮信息融合,从而提供比仅使用触控屏更广泛的表达方式。通过在 activity 中注册 View.OnContextClickListener 和 GestureDetector.OnContextClickListener 对象,您的应用可以监听触控笔按钮按压操作并执行辅助操作。

使用 MotionEvent 方法和常量来检测触控笔按钮互动:

改进了低功耗蓝牙扫描

如果您的应用执行低功耗蓝牙扫描,请使用新的 setCallbackType() 方法指定您希望系统在首次发现或长时间后发现与设置的 ScanFilter 匹配的广告数据包时通知回调。与之前的平台版本相比,这种扫描方法更省电。

支持 Hotspot 2.0 Release 1

此版本在 Nexus 6 和 Nexus 9 设备上增加了对 Hotspot 2.0 版本 1 规范的支持。如需在应用中配置 Hotspot 2.0 凭据,请使用 WifiEnterpriseConfig 类的新方法,例如 setPlmn() 和 setRealm()。在 WifiConfiguration 对象中,您可以设置 FQDN 和 providerFriendlyName 字段。新的 isPasspointNetwork() 方法用于指示检测到的网络是否表示 Hotspot 2.0 接入点。

4K 显示模式

平台现在允许应用请求在兼容的硬件上将显示分辨率升级为 4K 渲染。如需查询当前实际分辨率,请使用新的 Display.Mode API。如果界面以较低的逻辑分辨率绘制,并放大到较高的物理分辨率,请注意,getPhysicalWidth() 方法返回的物理分辨率可能与 getSize() 报告的逻辑分辨率不同。

您可以在应用运行时,通过设置应用窗口的 preferredDisplayModeId 属性来请求系统更改物理分辨率。如果您想切换到 4K 显示分辨率,此功能会非常有用。在 4K 显示模式下,界面会继续以原始分辨率(例如 1080p)进行渲染,并放大到 4K,但 SurfaceView 对象可能会以原生分辨率显示内容。

可设置主题的 ColorStateList

现在,在搭载 Android 6.0(API 级别 23)的设备上,ColorStateList 中支持主题属性。Resources.getColorStateList() 和 Resources.getColor() 方法已废弃。如果您正在调用这些 API,请改为调用新的 Context.getColorStateList() 或 Context.getColor() 方法。这些方法也可通过 ContextCompat 在 v4 appcompat 库中使用。

音频功能

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

  • 支持 MIDI 协议,并提供新的 android.media.midi API。使用这些 API 可发送和接收 MIDI 事件。
  • 新增了 AudioRecord.Builder 和 AudioTrack.Builder 类,分别用于创建数字音频捕获和播放对象,以及配置音频源和音频接收器属性以替换系统默认设置。
  • 用于关联音频和输入设备的 API 钩子。如果您的应用允许用户通过连接到 Android TV 的游戏控制器或遥控器发起语音搜索,此功能就特别有用。当用户开始搜索时,系统会调用新的 onSearchRequested() 回调。如需确定用户的输入设备是否具有内置麦克风,请从该回调中检索 InputDevice 对象,然后调用新的 hasMicrophone() 方法。
  • 新增了 getDevices() 方法,可用于检索当前连接到系统的所有音频设备的列表。如果您希望系统在音频设备连接或断开连接时通知您的应用,还可以注册一个 AudioDeviceCallback 对象。

视频功能

此版本为视频处理 API 新增了多项功能,包括:

  • 新的 MediaSync 类,可帮助应用同步渲染音频和视频流。音频缓冲区以非阻塞方式提交,并通过回调返回。它还支持动态播放速度。
  • 新的 EVENT_SESSION_RECLAIMED 事件,表示应用打开的会话已被资源管理器回收。如果您的应用使用 DRM 会话,您应处理此事件,并确保不使用回收的会话。
  • 新的 ERROR_RECLAIMED 错误代码,表示资源管理器回收了编解码器使用的媒体资源。出现此异常时,必须释放编解码器,因为编解码器已进入终止状态。
  • 新增了 getMaxSupportedInstances() 接口,用于获取支持的最大并发编解码器实例数的提示。
  • 新增了 setPlaybackParams() 方法,用于设置媒体播放速度,以实现快放或慢动作播放。它还会自动拉伸或加快音频播放速度,以配合视频。

相机功能

此版本包含以下新 API,用于访问相机的手电筒和对图像进行相机后处理:

手电筒 API

如果相机设备有闪光灯单元,您可以调用 setTorchMode() 方法来开启或关闭闪光灯单元的照明模式,而无需打开相机设备。应用不拥有闪光灯单元或相机设备的独占所有权。每当相机设备变得不可用时,或者当保持手电筒开启状态的其他相机资源变得不可用时,手电筒模式都会关闭并变得不可用。其他应用也可以调用 setTorchMode() 来关闭手电筒模式。当开启手电筒模式的最后一个应用关闭时,手电筒模式也会关闭。

您可以调用 registerTorchCallback() 方法注册回调,以接收有关手电筒模式状态的通知。首次注册回调时,系统会立即调用该回调,并提供所有当前已知且带有闪光灯单元的相机设备的闪光灯模式状态。如果成功开启或关闭手电筒模式,系统会调用 onTorchModeChanged() 方法。

重新处理 API

扩展了 Camera2 API,以支持 YUV 和专用不透明格式的图片后处理。如需确定这些重新处理功能是否可用,请调用 getCameraCharacteristics() 并检查 REPROCESS_MAX_CAPTURE_STALL 键。如果设备支持重新处理,您可以调用 createReprocessableCaptureSession() 创建可重新处理的相机拍摄会话,并创建输入缓冲区重新处理请求。

使用 ImageWriter 类将输入缓冲区流连接到相机后处理输入。如需获取空缓冲区,请遵循以下编程模型:

  1. 调用 dequeueInputImage() 方法。
  2. 将数据填充到输入缓冲区中。
  3. 通过调用 queueInputImage() 方法将缓冲区发送到相机。

如果您同时使用 ImageWriter 对象和 PRIVATE 图片,您的应用将无法直接访问图片数据。而是通过调用 queueInputImage() 方法将 PRIVATE 图像直接传递给 ImageWriter,而无需任何缓冲区复制。

ImageReader 类现在支持 PRIVATE 格式的图片流。此支持可让您的应用维护一个包含 ImageReader 张输出图片的循环图片队列,选择一张或多张图片,然后将其发送到 ImageWriter 以进行相机后处理。

Android for Work 功能

此版本包含以下适用于 Android for Work 的新 API:

  • 针对公司自有、单一用途设备的增强型控制功能:设备所有者现在可以控制以下设置,以改进对公司自有、单一用途 (COSU) 设备的管理:
  • 设备所有者静默安装和卸载应用:设备所有者现在可以使用 PackageInstaller API 静默安装和卸载应用,而无需使用 Google Play 企业版。现在,您可以通过设备所有者来配置设备,该设备所有者可以获取并安装应用,而无需用户互动。此功能有助于在不激活 Google 账号的情况下,通过一键操作完成信息亭或其他此类设备的配置。
  • 静默企业证书访问: 当应用在提示用户选择证书之前调用 choosePrivateKeyAlias() 时,配置文件或设备所有者现在可以调用 onChoosePrivateKeyAlias() 方法,以静默方式向请求应用提供别名。借助此功能,您无需用户互动即可向受管理的应用授予对证书的访问权限。
  • 自动接受系统更新。通过使用 setSystemUpdatePolicy() 设置系统更新政策,设备所有者现在可以自动接受系统更新(例如在自助服务终端设备的情况下),或者推迟更新并阻止用户在最多 30 天内接受更新。此外,管理员还可以设置必须进行更新的每日时间窗口,例如在自助服务终端设备未使用的时段。当有系统更新可用时,系统会检查设备政策控制器应用是否已设置系统更新政策,并相应地采取行动。
  • 委托证书安装:个人资料或设备所有者现在可以向第三方应用授予调用以下 DevicePolicyManager 证书管理 API 的权限:
  • 手机显示 Android for Work 中的工作状态通知功能
  • 流量使用情况跟踪。现在,配置文件或设备所有者可以使用新的 NetworkStatsManager 方法查询 “设置”>“流量使用情况”中显示的流量使用情况统计信息。系统会自动向资料所有者授予查询其所管理资料中的数据的权限,而设备所有者则可以访问受管理的相应主要用户的用量数据。
  • 运行时权限管理:

    Profile 或 Device Owner 可以使用 setPermissionPolicy() 为所有应用的全部运行时请求设置权限政策,以提示用户授予权限,或自动静默授予或拒绝权限。如果设置了后一种政策,用户将无法在设置中的应用权限界面内修改个人资料或设备所有者所做的选择。

  • “设置”中的 VPN:VPN 应用现在显示在“设置”>“更多”>“VPN”中。 此外,与 VPN 使用情况相关的通知现在会具体说明相应 VPN 的配置方式。对于资料所有者,通知会具体说明 VPN 是为受管资料、个人资料还是同时为两者配置的。对于设备所有者,通知具体取决于 VPN 是否已针对整个设备配置。
  • 工作状态通知:现在,每当受管理个人资料中的应用在前台有活动时,状态栏中都会显示一个公文包图标。此外,如果设备直接解锁到受管资料中的应用活动,系统会显示消息框,通知用户他们位于工作资料中。