Android 6.0 (M) 为用户和应用开发者提供了新功能本文档介绍了 最值得关注的 API。
开始开发
要着手开发 Android 6.0 应用,您必须先获取 Android SDK。然后使用 SDK 管理器 下载 Android 6.0 SDK Platform 和系统映像。
更新目标 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" />
![一部手机,上面显示的是指纹身份验证功能](https://developer.android.google.cn/static/images/android-6.0/fingerprint-screen.png?authuser=9&hl=sv)
如需查看指纹身份验证的应用实现,请参阅 生物识别身份验证示例。 有关如何使用这些身份验证的演示 可结合使用 API 与其他 Android API,请观看视频 <ph type="x-smartling-placeholder"></ph> Fingerprint API 和 Payment API。
如果您要测试此功能,请执行以下步骤:
- 如果您尚未安装 Android SDK 工具 24.3 修订版,请执行此操作。
- 在模拟器中注册新指纹,方法是依次前往 设置 >安全 >指纹,然后按照注册说明操作。
- 使用模拟器通过
。使用同一命令模拟锁屏上的指纹触摸事件,或
。
adb -e emu finger touch <finger_id>
在 Windows 上,您可能需要运行
telnet 127.0.0.1 <emulator-id>
,后跟finger touch <finger_id>
。
确认凭据
您的应用可以根据用户最近一次解锁设备的时间来执行身份验证。这个 该功能让用户不必记住其他应用专用密码, 供您实现自己的身份验证界面。您的应用应在以下版本中使用此功能: 结合用于用户身份验证的公钥或密钥实现。
设置超时时长,以便在用户成功登录之后可以重复使用同一密钥
则调用新的
setUserAuthenticationValidityDurationSeconds()
KeyGenerator
或
KeyPairGenerator
。
避免过多显示重新验证对话框,您的应用应尝试使用
加密对象,如果超时过期,则使用
createConfirmDeviceCredentialIntent()
方法,在您的应用中重新验证用户身份。
应用关联
此版本通过提供更强大的应用链接,增强了 Android 的 intent 系统。 此功能可让您将应用与您拥有的某个网域相关联。根据 关联,平台可以确定在处理特定 网页链接,并跳过提示用户选择应用的步骤。要了解如何实现此功能,请参阅 处理应用链接。
自动备份应用
系统现在会对应用执行自动完整数据备份和恢复。您的应用必须以 Android 6.0(API 级别 23)来启用此行为;您无需额外添加任何代码。 如果用户删除其 Google 账号,其备份数据也会被删除。为了了解 功能的工作原理以及如何配置要在文件系统中备份的内容,请参阅 配置应用自动备份。
直接共享
![显示“直接共享”功能的移动设备的底部](https://developer.android.google.cn/static/images/android-6.0/direct-share-screen.png?authuser=9&hl=sv)
此版本为您提供了一些 API,可让用户直观快捷地进行共享。现在,您可以 定义可启动应用中特定 activity 的直接分享目标。这些直接共享 目标通过共享菜单向用户显示。借助此功能,用户可以 向其他应用中的目标(如联系人)传递内容。例如,直接共享目标可以 在另一个社交网络应用中启动一个 activity,让用户可以将内容直接 特定朋友或社区。
要启用直接共享目标,您必须定义一个类,用于扩展
ChooserTargetService
类。声明
服务。在该声明中,指定
BIND_CHOOSER_TARGET_SERVICE
权限和
使用
SERVICE_INTERFACE
操作。
以下示例展示了如何声明
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>
对于您想要公开的每个 activity
ChooserTargetService
,请添加
<meta-data>
元素的名称
"android.service.chooser.chooser_target_service"
。
<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()
方法,用于确定是否触发了语音操作
活动如果是这样,您的应用可以使用
VoiceInteractor
类来请求用户进行语音确认,请选择
选项列表等。
大多数语音交互都源于用户语音操作。语音互动 activity 可以
但也无需用户输入即可启动例如,通过语音启动的其他应用
互动也可以发送 intent 来启动语音互动。为了确定您的活动记录是否
从用户语音查询或其他语音交互应用启动,调用
isVoiceInteractionRoot()
方法结合使用。如果其他应用启动了您的
activity,该方法会返回 false
。然后,您的应用可能会提示用户确认
应该执行的操作。
要详细了解如何实施语音操作,请参阅 语音操作开发者网站。
Assist API
此版本为用户提供了一种通过助理与您的应用互动的新方式。要使用此 功能,用户必须启用助理以使用当前上下文。启用后 可通过长按主屏幕按钮在任何应用中调用 Google 助理。
您的应用可以通过设置
FLAG_SECURE
标志。除了
由平台传递给助理的一组标准信息,您的应用可以分享
通过使用新的 AssistContent
类提供更多信息。
要为助手提供您的应用内的其他上下文,请执行以下步骤:
- 实现
Application.OnProvideAssistDataListener
接口。 - 使用以下代码注册此监听器:
registerOnProvideAssistDataListener()
。 - 为了提供特定于 activity 的上下文信息,请替换
onProvideAssistData()
(可选)新的onProvideAssistContent()
回调。
可采用的存储设备
在此版本中,用户可以采用 SD 卡等外部存储设备。采用
外部存储设备会加密和格式化设备,使其运行方式与内部存储设备类似。这个
功能允许用户在存储设备之间移动应用及其私有数据。时间
移动应用时,系统会遵循
android:installLocation
偏好设置
如果您的应用访问以下 API 或字段,请注意它们返回的文件路径 将在内部和外部存储设备之间移动时动态更改。 强烈建议您在构建文件路径时始终动态调用这些 API。 请勿使用硬编码文件路径或之前生成的永久性完全限定文件路径。
Context
方法: <ph type="x-smartling-placeholder">ApplicationInfo
字段: <ph type="x-smartling-placeholder">
如需调试此功能,您可以启用 运行以下命令,即可通过 USB On-The-Go (OTG) 数据线连接到 Android 设备:
$ adb shell sm set-force-adoptable true
通知
此版本针对通知功能引入了下列 API 变更:
- 新的
INTERRUPTION_FILTER_ALARMS
过滤级别 对应于新的仅限闹钟免打扰模式。 - 新的
CATEGORY_REMINDER
类别值,用于 区分用户安排的提醒与其他活动 (CATEGORY_EVENT
) 和闹钟 (CATEGORY_ALARM
)。 - 新的
Icon
类,您可以将其附加到通知中 通过setSmallIcon()
和setLargeIcon()
方法。同样,addAction()
方法现在接受Icon
对象,而不是 可绘制资源 ID。 - 新的
getActiveNotifications()
方法,允许您 来了解哪些通知目前处于活动状态。
蓝牙触控笔支持
此版本改进了对用户使用蓝牙触控笔输入的支持。用户可以配对
并将兼容的蓝牙触控笔与其手机或平板电脑连接。连接后,将
触摸屏的信息与来自触控笔的压力和按钮信息融合在一起,
能够提供比单纯的触摸屏更丰富的表达范围。您的应用可以监听
通过注册设备,按下触控笔按钮并执行辅助操作
View.OnContextClickListener
和
您的 activity 中有 GestureDetector.OnContextClickListener
对象。
使用 MotionEvent
方法和常量检测触控笔按钮
互动:
- 如果用户使用带按钮的触控笔触按应用屏幕,
getTooltype()
方法返回TOOL_TYPE_STYLUS
。 - 对于以 Android 6.0(API 级别 23)为目标平台的应用,
getButtonState()
方法返回BUTTON_STYLUS_PRIMARY
触控笔主键。如果触控笔有辅助按键,系统会返回相同的方法BUTTON_STYLUS_SECONDARY
。如果用户按 则此方法会同时返回通过 OR 运算得到的两个值 (BUTTON_STYLUS_PRIMARY
|BUTTON_STYLUS_SECONDARY
)。 -
对于以较低平台版本为目标平台的应用,
getButtonState()
方法返回BUTTON_SECONDARY
(用于按下触控笔主按钮),BUTTON_TERTIARY
(按下触控笔辅助按钮),或两者都使用。
改进的蓝牙低功耗扫描
如果您的应用执行低功耗蓝牙扫描,请使用新的
setCallbackType()
方法指定您希望系统在首次找到回调时通知回调,或在
与设置的 ScanFilter
匹配的通告包。这个
扫描方法比以前的平台版本中提供的方法更加节能。
Hotspot 2.0 第 1 版支持
此版本在 Nexus 6 和 Nexus 9 设备上增加了对 Hotspot 2.0 第 1 版规范的支持。接收者
预配 Hotspot 2.0 凭据时,请使用
WifiEnterpriseConfig
类,如
setPlmn()
和
setRealm()
。在
WifiConfiguration
对象,您可以设置
FQDN
和
providerFriendlyName
字段。
新的 isPasspointNetwork()
方法可指示系统是否检测到
代表一个热点 2.0 接入点。
4K 显示模式
该平台现在允许应用请求将显示分辨率升级到 4K 渲染
在兼容硬件上运行如需查询当前的物理分辨率,请使用新的
Display.Mode
API。如果界面是以较低的逻辑分辨率绘制,并且
放大到更大的物理分辨率,请注意,
getPhysicalWidth()
方法的返回值可能与逻辑语句中的
getSize()
报告的分辨率。
您可以请求系统更改应用运行时的物理分辨率,方法是设置
应用的 preferredDisplayModeId
属性
窗口。如果您想切换到 4K 显示分辨率,此功能会非常有用。在 4K 显示屏中时
模式时,界面会继续以原始分辨率(如 1080p)渲染,并会调高到
4K,但 SurfaceView
对象可能会以原生分辨率显示内容。
主题化 ColorStateList
现在支持以下主题属性:
ColorStateList
(适用于搭载 Android 6.0(API 级别 23)的设备)。通过
Resources.getColorStateList()
和
已设置 Resources.getColor()
个方法
已弃用。如果您要调用这些 API,请调用新
Context.getColorStateList()
或
Context.getColor()
方法。这些方法包括
也可在 v4 appcompat 库中通过 ContextCompat
获取。
音频功能
此版本增强了 Android 上的音频处理功能,包括:
- 支持 MIDI
协议,使用新的
android.media.midi
API。使用这些 API 发送和接收 MIDI 事件。 - 新的
AudioRecord.Builder
和AudioTrack.Builder
类分别创建数字音频捕获和播放对象,并配置音频 来源和接收器属性,以覆盖系统默认值。 - 用于关联音频和输入设备的 API 钩子。如果您的应用
允许用户通过连接到 Android 的游戏控制器或遥控器启动语音搜索
电视。系统会调用新的
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
类将输入缓冲区流连接到相机
重新处理输入。要获得空白缓冲区,请遵循以下编程模型:
- 调用
dequeueInputImage()
方法。 - 在输入缓冲区中填充数据。
- 通过调用
queueInputImage()
方法结合使用。
如果您将 ImageWriter
对象与
PRIVATE
张图片,您的应用无法访问该图片
数据。请改为将 PRIVATE
图片直接传递给
ImageWriter
:调用
queueInputImage()
方法
而无需执行任何缓冲区复制操作
ImageReader
类现在支持
PRIVATE
格式的图片流。这种支持可让您的应用
维护一个包含 ImageReader
个输出图片的圆形图片队列,请选择一张或
更多图像,并发送到 ImageWriter
进行相机重新处理。
Android for Work 功能
此版本提供了下列用于 Android for Work 的新 API:
- 针对企业所有、单一用途设备的增强型控件:设备所有者
现在可以控制以下设置,
企业所有、单一用途 (COSU) 设备:
<ph type="x-smartling-placeholder">
- </ph>
- 使用
setKeyguardDisabled()
方法结合使用。 - 停用或重新启用状态栏(包括快速设置、通知和
(打开 Google 即时的向上滑动导航手势)
setStatusBarDisabled()
方法。 - 使用
UserManager
常量停用或重新启用安全启动DISALLOW_SAFE_BOOT
。 - 防止屏幕在插入电源时关闭
STAY_ON_WHILE_PLUGGED_IN
常量。
- 使用
- 由设备所有者以静默方式安装和卸载应用:设备所有者现在可以
使用
PackageInstaller
静默安装和卸载应用 API 独立于 Google Play for Work。您现在可以通过设备所有者配置设备 无需用户互动即可获取和安装应用。此功能对于启用一键式功能非常有用 配置自助服务终端或其他此类设备,而无需激活 Google 账号。 - 静默式企业证书访问 :当应用调用
choosePrivateKeyAlias()
, 现在,配置文件所有者或设备所有者可以调用onChoosePrivateKeyAlias()
方法以静默方式向请求应用程序提供别名。借助此功能,您可以 让受管理的应用无需用户互动即可访问证书。 - 自动接受系统更新。设置一项系统更新政策
setSystemUpdatePolicy()
, 设备所有者现在可以自动接受系统 或推迟更新并阻止更新 保留了 30 天此外,管理员可以在 必须进行更新,例如在自助服务终端设备无人使用的时段。时间 有可用的系统更新时,系统会检查 Device Policy Controller 应用是否已设置系统 更新政策,并进行相应操作。 -
委托证书安装:个人资料所有者或设备所有者现在可以授予
第三方应用调用这些
DevicePolicyManager
证书的功能 Management API: - 流量使用情况跟踪。配置文件所有者或设备所有者现在可以查询
您可以在设置 >使用新版数据
NetworkStatsManager
方法。系统会自动授予商家资料所有者权限 有权查询所管理的个人资料中的数据,而设备所有者则有权访问使用情况数据 所管理的主要用户的身份 - 运行时权限管理:
配置文件所有者或设备所有者可以设置权限政策 所有使用
setPermissionPolicy()
,用于提示用户授予权限,或自动授予或 静默拒绝权限。如果您设置了后一种政策,用户便无法 您可在以下位置修改配置文件所有者或设备所有者在应用的权限屏幕中做出的选择: 设置。 - “设置”中的 VPN:现在,VPN 应用显示在以下位置: 设置 >更多 >VPN。 此外,现在,关于 VPN 使用情况的通知取决于该 VPN 配置。对于配置文件所有者,通知取决于 VPN 是否已配置 和/或个人资料。对于设备所有者,通知包括 取决于是否针对整个设备配置了 VPN。
- 工作状态通知:现在,无论何时,只要 来自受管理资料的应用具有前台 activity。此外,如果设备 直接解锁到受管理个人资料中某个应用的 activity,系统会显示一个消息框, 在工作资料中向该用户授予相关权限。
![显示 Android for Work 中工作状态通知功能的移动设备](https://developer.android.google.cn/static/images/android-6.0/work-profile-screen.png?authuser=9&hl=sv)