Android 6.0 API

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

着手开发

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

更新目标 API 级别

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

您可以在使用 Android 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 结合使用的演示,请观看视频 Fingerprint API 和 Payment API

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

  1. 如果您尚未安装 Android SDK 工具 24.3 修订版,请执行此操作。
  2. 依次进入 Settings > Security > Fingerprint,然后按照注册说明进行操作,即可在模拟器中注册新指纹。
  3. 使用模拟器通过以下命令模拟指纹触摸事件。使用同一命令模拟锁屏上或应用中的指纹触摸事件。
    adb -e emu finger touch <finger_id>
    

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

确认凭据

您的应用可以根据用户上次解锁设备的时间距离,对用户进行身份验证。此功能让用户不必记住其他应用专用密码,您也无需实现自己的身份验证界面。您的应用应将此功能与实现公钥或密钥结合使用来进行用户身份验证。

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

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

应用关联

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

自动备份应用

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

直接共享

显示直接共享功能的移动设备的底部

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

如需启用直接共享目标,您必须定义一个类来扩展 ChooserTargetService 类。在清单中声明您的服务。在该声明中,使用 SERVICE_INTERFACE 操作指定 BIND_CHOOSER_TARGET_SERVICE 权限和 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,与语音操作一起使用时,可让您在应用中打造对话式语音体验。调用 isVoiceInteraction() 方法可确定语音操作是否触发了您的 activity。如果是这样,您的应用可以使用 VoiceInteractor 类请求用户进行语音确认、从选项列表中进行选择以及执行其他操作。

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

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

Assist API

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

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

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

  1. 实现 Application.OnProvideAssistDataListener 接口。
  2. 使用 registerOnProvideAssistDataListener() 注册此监听器。
  3. 如需提供特定于 activity 的上下文信息,请替换 onProvideAssistData() 回调和新的 onProvideAssistContent() 回调(可选)。

可采用的存储设备

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

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

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

$ adb shell sm set-force-adoptable true

通知

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

蓝牙触控笔支持

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

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

改进的蓝牙低功耗扫描

如果您的应用执行蓝牙低功耗扫描,请使用新的 setCallbackType() 方法指定您希望系统在首次找到与设置的 ScanFilter 匹配的通告包,或在长时间后看到与所设的 ScanFilter 匹配的通告包时通知回调。与旧平台版本中提供的方法相比,这种扫描方法更节能。

Hotspot 2.0 第 1 版支持

此版本在 Nexus 6 和 Nexus 9 设备上添加了对 Hotspot 2.0 第 1 版规范的支持。如需在应用中配置 Hotspot 2.0 凭据,请使用 WifiEnterpriseConfig 类的新方法,例如 setPlmn()setRealm()。在 WifiConfiguration 对象中,您可以设置 FQDNproviderFriendlyName 字段。新的 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 上的音频处理功能,包括:

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

视频功能

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

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

相机功能

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

Flashlight API

如果摄像头设备具有闪光灯,您可以通过调用 setTorchMode() 方法,在不打开摄像头设备的情况下开启或关闭闪光灯的手电筒模式。应用对闪光灯或相机设备不享有专有所有权。每当相机设备不可用,或者开启手电筒的其他相机资源不可用时,手电筒模式就会关闭并变为不可用状态。其他应用也可调用 setTorchMode() 来关闭手电筒模式。当最后一个开启手电筒模式的应用关闭时,手电筒模式会关闭。

您可以注册一个回调,通过调用 registerTorchCallback() 方法来接收手电筒模式状态的相关通知。首次注册回调时,系统会立即调用它,并返回所有当前已知配备闪光灯的相机设备的火炬模式状态。如果成功开启或关闭手电筒模式,系统会调用 onTorchModeChanged() 方法。

Reprocessing 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 for Work 无关。您现在可以通过设备所有者配置设备,让其无需用户互动即可获取并安装应用。此功能可用于在不激活 Google 帐号的情况下实现自助服务终端或其他此类设备的一键配置。
  • 静默式企业证书访问 :当应用调用 choosePrivateKeyAlias() 时,在提示用户选择证书之前,个人资料所有者或设备所有者可以调用 onChoosePrivateKeyAlias() 方法,静默地向发出请求的应用提供别名。借助此功能,您无需用户互动即可授予受管应用访问证书的权限。
  • 自动接受系统更新。现在,通过使用 setSystemUpdatePolicy() 设置系统更新政策,设备所有者可以自动接受系统更新(例如对于自助服务终端设备),也可以推迟更新,在最多 30 天内防止用户进行更新。此外,管理员还可设置每日必须获取更新的时间窗口,例如在自助服务终端设备无人使用的时段。当有可用的系统更新时,系统会检查设备政策控制器应用是否设置了系统更新政策,并相应地执行操作。
  • 委托证书安装:资料所有者或设备所有者现在可以授权第三方应用调用以下 DevicePolicyManager 证书管理 API:
  • 显示 Android for Work 中工作状态通知功能的移动设备
  • 跟踪流量消耗。个人资料所有者或设备所有者现在可以使用新的 NetworkStatsManager 方法查询流量使用情况统计信息(位于设置 > 数据使用情况中)。系统会自动向资料所有者授予查询其管理的资料相关数据的权限,而设备所有者则获得对受管理主要用户的使用情况数据的访问权限。
  • 运行时权限管理

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

  • 设置中的 VPN:现在,您可以在设置 > 更多 > VPN 中找到 VPN 应用。此外,现在,有关 VPN 使用情况的通知取决于该 VPN 的配置方式。对于资料所有者,通知取决于 VPN 是为受管理个人资料、个人资料还是同时针对这两者进行配置。对于设备所有者,通知取决于 VPN 是否针对整个设备进行了配置。
  • 工作状态通知:现在,每当受管理资料中的应用具有前台 activity 时,都会显示状态栏公文包图标。此外,如果设备直接解锁到受管理资料中某个应用的 activity,系统会显示一个消息框,告知用户他们在工作资料中。