Android 4.0 API

API 级别14

Android 4.0 (ICE_CREAM_SANDWICH) 是一个重大的平台版本,为用户和应用开发者添加了各种新功能。除了下面讨论的所有新功能和 API 之外,Android 4.0 还是 平台版本,因为它带来 Android 3.x 中的丰富 API 和全息主题 小屏幕设备作为应用开发者,您现在可以使用单一平台和统一的 API 框架,通过单个 APK 开发和发布应用,为搭载相同 Android 版本(Android 4.0 [API 级别 14] 或更高版本)的手机、平板电脑等设备提供经过优化的用户体验。

对于开发者,Android 4.0 平台以 Android SDK 的可下载组件该可下载平台包括: Android 库和系统映像,以及一组模拟器皮肤和 。如需开始针对 Android 4.0 进行开发或测试,请使用 Android SDK 管理器将该平台下载到您的 SDK 中。

API 概览

以下部分提供了 Android 4.0 中新 API 的技术概览。

联系人提供程序中的社交 API

ContactsContract 提供程序定义的联系人 API 已 扩展以支持新的社交功能,例如设备所有者的个人资料和 用户可以邀请各个联系人加入安装在 设备。

用户个人资料

Android 现在包含代表设备所有者的个人资料,该个人资料由 ContactsContract.Profile 表。用于维护用户身份的社交应用 可通过在 ContactsContract.Profile 中创建新的 ContactsContract.RawContacts 条目来提供用户的个人资料数据。也就是说,表示设备用户的原始联系人不属于由 ContactsContract.RawContacts Uri 定义的传统原始联系人表;而是必须在 CONTENT_RAW_CONTACTS_URI 处的表中添加个人资料原始联系人。然后,此表中的原始联系人会汇总到标记为“我”的单个用户可见个人资料中。

如需为个人资料添加新的原始联系人,需要 android.Manifest.permission#WRITE_PROFILE 权限。同样,如需从配置文件表中读取数据,您必须请求 android.Manifest.permission#READ_PROFILE 权限。不过, 大部分应用都不需要读取用户个人资料,即使向 个人资料。读取用户个人资料是一项敏感权限,您应该预料到用户会对请求此权限的应用持怀疑态度。

邀请意图

INVITE_CONTACT intent 操作允许应用调用一个操作,以指示用户想要将联系人添加到社交网络。应用 使用该应用邀请指定的联系人加入 社交网络。大多数应用都将是此操作的接收端。例如, 当用户选择“添加连接”时,内置的“联系人”应用会调用邀请 intent特定 用户详细联系信息中列出的社交应用。

如需让您的应用可见(如“添加连接”所示)列表中,您的应用必须提供一个同步适配器 同步您社交网络中的联系人信息。然后,您必须向系统表明 应用会通过以下方式响应 INVITE_CONTACT intent: 将 inviteContactActivity 属性添加到应用的同步配置文件,并使用 系统在发送邀请 intent 时应启动的 activity 的完全限定名称。 然后,启动的 activity 可以从 intent 的数据中检索相关联系人的 URI,并执行必要的工作来邀请该联系人加入网络或将该联系人添加到用户的联系人中。

大照片

Android 现在支持使用高分辨率照片作为联系人照片。现在,当您将照片推送到 联系人记录,系统会同时将其处理成 96x96 的缩略图(和之前一样)和 256 x 256“显示照片”存储在新创建的文件型照片存储区中的此类照片( 的选择将来可能有所不同)。你可以为联系人添加一张大照片 照片的常规PHOTO列, 然后,系统会将该数据行处理成相应的缩略图,并显示照片 记录。

联系人使用情况反馈

新的 ContactsContract.DataUsageFeedback API 可帮助您跟踪 用户使用特定方法联系人员的频率,例如, 每个电话号码或电子邮件地址这些信息有助于提高与每个人关联的每种联系方式的排名,并提供更实用的联系建议。

日历提供程序

借助新的日历 API,您可以读取、添加、修改和删除日历、活动、参加者 提醒和提醒,存储在日历提供程序中。

各种应用和微件都可以使用这些 API 来读取和修改日历活动。不过, 一些最引人注目的用例是同步适配器,它会将用户的日历从 日历提供程序,以便为所有日历提供程序提供统一的位置 用户的事件。例如,Google 日历活动会通过 Google 日历同步适配器可以让您通过 Android 的内置 日历应用。

日历提供程序中日历和活动相关信息的数据模型由 CalendarContract 定义。用户的所有日历数据存储在 由 CalendarContract 的各个子类定义的表的数量:

  • CalendarContract.Calendars 表存储日历特定信息。此表中的每一行都包含一个日历的详细信息,例如名称、颜色、同步信息等。
  • CalendarContract.Events 表保存特定于事件的信息。 此表中的每一行都包含一个事件的信息,例如 活动标题、地点、开始时间、结束时间等。该事件可以仅发生一次,也可重复发生 。参加者、提醒和扩展属性存储在单独的表内,并使用活动的 _ID 将它们与活动相关联。
  • CalendarContract.Instances 表包含 事件的发生次数。此表中的每一行都表示一个实例。一次性活动 实例到事件是一对一的映射关系。对于重复事件,系统会自动生成多个行,分别对应多个事件实例。
  • CalendarContract.Attendees 表用于保存活动参加者或邀请对象 信息。每一行都表示事件的一位来宾。它用于指定 该人员是 以及该人员对该事件的响应。
  • CalendarContract.Reminders 表存储提醒/通知数据。每一行都表示事件的一个提醒。一个活动可以有多个提醒。您获得的 每个事件的提醒在 MAX_REMINDERS 中指定,后者由 拥有指定日历。提醒以事件发生前的分钟数形式指定 并指定一个闹钟方法,例如使用提醒、电子邮件或短信来提醒 用户。
  • CalendarContract.ExtendedProperties 表存储同步适配器使用的不透明数据字段。该提供商不会对此表中的内容执行任何操作,但只删除 并在其相关活动被删除时通知您。

要通过日历提供程序访问用户的日历数据,您的应用必须请求 READ_CALENDAR 权限(用于读取权限)和 WRITE_CALENDAR(用于写入权限)。

事件 intent

如果您只想向用户的日历添加活动,可以使用 ACTION_INSERT intent 和 Events.CONTENT_URI 定义的数据,以便在 Google 日历应用中启动用于创建新活动的 activity。使用 intent 不需要任何权限,您可以使用以下 extra 指定事件详情:

语音信箱提供程序

借助新的语音信箱提供程序,应用可以向设备添加语音信息,以便在单个视觉呈现中显示用户的所有语音信息。例如, 用户可能会有多个语音信息来源,例如 一个来自手机服务提供商,另一个来自 VoIP 或其他备选语音 服务。这些应用可以使用 Voicemail Provider API 将其语音信息添加到设备。然后,内置的“电话”应用会以统一的方式向用户显示所有语音信箱。虽然系统的“电话”应用是唯一可以读取所有语音信息的应用,但提供语音信息的每个应用都可以读取其添加到系统中的语音信息(但无法读取其他服务中的语音信息)。

由于这些 API 目前不允许第三方应用读取 系统中,唯一应使用语音信箱 API 的第三方应用是具有语音信箱功能的 投放给用户

VoicemailContract 类定义了语音信箱提供程序的内容提供程序。VoicemailContract.VoicemailsVoicemailContract.Status 子类提供了表,应用可以在其中 插入语音信息数据以在设备上存储。如需查看语音信息提供程序应用示例,请参阅语音信息提供程序演示

多媒体

Android 4.0 针对与媒体(如照片、 视频和音乐

媒体效果

借助新的媒体效果框架,你可以将各种视觉效果应用于图片和 视频。例如,借助图片效果,你可以轻松修正红眼、将图片转换为灰度, 调整亮度、调整饱和度、旋转图片、应用鱼眼效果等。系统会在 GPU 上执行所有特效处理,以获得最佳性能。

为了尽可能提高性能,效果会直接应用于 OpenGL 纹理,因此您的应用必须具有有效的 OpenGL 上下文,才能使用效果 API。应用的纹理 也可能来自位图、视频,甚至是相机不过,也有一些限制 纹理必须符合:

  1. 它们必须绑定到 GL_TEXTURE_2D 纹理图片
  2. 它们必须至少包含一个 mipmap 级别

Effect 对象定义了可应用于图片帧的单个媒体效果。创建 Effect 的基本工作流程如下:

  1. 从 OpenGL ES 2.0 上下文调用 EffectContext.createWithCurrentGlContext()
  2. 使用返回的 EffectContext 调用 EffectContext.getFactory(),后者会返回 EffectFactory 实例。
  3. 调用 createEffect(),并向其传递一个 @link android.media.effect.EffectFactory} 的效果名称,例如 EFFECT_FISHEYEEFFECT_VIGNETTE

您可以通过调用 setParameter() 并传递参数名称和参数值来调整效果的参数。每种类型的效果接受不同的参数,这些参数会随效果名称一起记录在文档中。例如,EFFECT_FISHEYEscale 有一个参数, 失真。

如需对纹理应用效果,请对apply() Effect,并传入输入纹理、宽度和高度,以及 纹理。输入纹理必须绑定到 GL_TEXTURE_2D 纹理图片(通常通过调用 glTexImage2D() 函数来完成)。您可以提供多个 mipmap 级别。如果输出纹理未绑定到纹理图片,则效果会自动将其绑定为 GL_TEXTURE_2D,并使用一个 mipmap 级别 (0),该级别的大小与输入相同。

系统保证支持 EffectFactory 中列出的所有效果。不过,并非所有设备都支持外部库提供的某些其他效果,因此您必须先调用 isEffectSupported(),检查外部库中所需的效果是否受支持。

远程控制客户端

新的 RemoteControlClient 允许媒体播放器启用播放功能 远程控制客户端的控件,例如设备锁定屏幕。媒体播放器还可以公开有关当前正在播放的媒体的信息,以便在遥控器上显示,例如曲目信息和专辑封面。

如需为媒体播放器启用遥控器客户端,请使用其构造函数实例化 RemoteControlClient,并向其传递广播 ACTION_MEDIA_BUTTONPendingIntent。该 intent 还必须在应用中声明用于处理 ACTION_MEDIA_BUTTON 事件的显式 BroadcastReceiver 组件。

要声明您的播放器可以处理哪些媒体控件输入,您必须在setTransportControlFlags() RemoteControlClient,传递一组 FLAG_KEY_MEDIA_* 标志,例如 FLAG_KEY_MEDIA_PREVIOUSFLAG_KEY_MEDIA_NEXT

然后,您必须通过将 RemoteControlClient 传递给 MediaManager.registerRemoteControlClient() 来注册 RemoteControlClient。注册后,当您通过遥控器按下按钮时,您在实例化 RemoteControlClient 时声明的广播接收器将收到 ACTION_MEDIA_BUTTON 事件。您收到的 intent 包含按下的媒体按键的 KeyEvent,您可以使用 getParcelableExtra(Intent.EXTRA_KEY_EVENT) 从 intent 中检索该 KeyEvent

如需显示遥控器上有关媒体播放的信息,请调用 editMetaData() 并向返回的 RemoteControlClient.MetadataEditor。您可以为媒体图片提供位图 播放时长等数字信息以及曲目标题等文本信息。如需了解可用键,请参阅 MediaMetadataRetriever 中的 METADATA_KEY_* 标志。

有关实现示例,请参阅随机音乐播放器, 提供兼容性逻辑,以便在 Android 4.0 上启用遥控器客户端 同时继续为低于 Android 2.1 的设备提供支持。

媒体播放器

  • 现在,从“MediaPlayer”流式传输在线媒体内容需要 INTERNET 权限。如果您使用 MediaPlayer 执行以下操作: 播放来自互联网的内容,请务必添加 INTERNET 权限,否则从 Android 设备开始将无法播放媒体 4.0。
  • setSurface() 允许您定义一个 Surface 作为视频接收器的行为。
  • 借助 setDataSource(),您可以随请求发送其他 HTTP 标头,这对 HTTP(S) 直播非常有用
  • HTTP(S) 直播现在会在请求中遵循 HTTP Cookie

媒体类型

Android 4.0 增加了对以下内容的支持:

  • HTTP/HTTPS 实时流式传输协议版本 3
  • ADTS 原始 AAC 音频编码
  • WebP 图片
  • Matroska 视频

有关详情,请参阅支持的媒体 格式

相机

Camera 类现在包含用于检测人脸和控制人脸的 API 对焦和测光区域

人脸检测

相机应用现在可以使用 Android 的人脸检测 API 来增强其功能,而 不仅检测正文的面部,还可检测特定的面部特征,例如眼睛和嘴巴。

如需在相机应用中检测人脸,您必须通过调用 setFaceDetectionListener() 来注册 Camera.FaceDetectionListener。然后,您可以调用 startFaceDetection() 来启动相机 Surface 并开始检测人脸。

系统在相机场景中检测到一个或多个人脸时,会调用 onFaceDetection() 回调, Camera.FaceDetectionListener 的实现,其中包括 Camera.Face 对象。

Camera.Face 类的实例可提供有关检测到的面部的各种信息,包括:

  • 一个 Rect,用于指定相对于摄像头当前视野范围的人脸边界
  • 一个介于 1 到 100 之间的整数,表示系统对对象是人脸的置信度
  • 一个唯一 ID,可用于跟踪多个面孔
  • 多个 Point 对象,指示眼睛和嘴巴所在的位置 已定位

注意:某些设备可能不支持人脸检测,因此您应通过调用 getMaxNumDetectedFaces() 进行检查,并确保返回值大于零。此外,某些设备可能不支持识别眼睛和嘴巴,在这种情况下,Camera.Face 对象中的这些字段将为 null。

对焦和测光区域

相机应用现在可以控制相机用于对焦的区域和白色测光的区域 余额 和自动曝光这两项功能都使用新的 Camera.Area 类来指定 相机当前视图应聚焦或计量的区域的范围。Camera.Area 类的实例使用 Rect 定义区域边界,区域权重表示该区域的重要性级别 与考虑的其他区域相对的面积,以整数表示。

在设置对焦区域或测光区域之前,您应先分别调用 getMaxNumFocusAreas()getMaxNumMeteringAreas()。如果它们返回零,那么 设备不支持相应功能。

如需指定要使用的对焦区域或测光区域,只需调用 setFocusAreas()setMeteringAreas() 即可。每个都接受一个 Camera.Area 对象的 List,用于指明要考虑用于对焦或测光的区域。例如,您可以实现一项功能,让用户能够设置 对焦区域,您可以将其转换为 Camera.Area 对象,并请求相机对焦在场景中的该区域。 随着该区域场景的变化,该区域的焦点或曝光度将不断更新。

连续自动对焦(拍照)

现在,您可以在拍照时启用连续自动对焦 (CAF)。如需在相机应用中启用 CAF,请将 FOCUS_MODE_CONTINUOUS_PICTURE 传递给 setFocusMode()。准备好拍照后,调用 autoFocus()。您的 Camera.AutoFocusCallback 会立即收到回调,指示是否 才能够做到如需在收到回调后恢复 CAF,您必须调用 cancelAutoFocus()

注意:在 API 级别 9 中添加了 FOCUS_MODE_CONTINUOUS_VIDEO,在拍摄视频时,还支持使用 FOCUS_MODE_CONTINUOUS_VIDEO 进行连续自动对焦。

其他相机功能

相机广播 intent

  • Camera.ACTION_NEW_PICTURE: 这表示用户拍摄了新照片。内置的相机应用会调用 在拍摄照片后广播此 intent,并且第三方相机应用也应广播此 intent 。
  • Camera.ACTION_NEW_VIDEO: 这表示用户拍摄了新视频。内置的相机应用会调用 录制视频后广播,并且第三方相机应用也应广播此 intent 。

Android Beam(使用 NFC 的 NDEF 推送)

Android Beam 是一项新的 NFC 功能,可让您从一台设备向另一台设备发送 NDEF 消息(此过程也称为“NDEF 推送”)。当两部支持 Android Beam 的 Android 设备靠近(约 4 厘米)时,系统会发起数据传输,通常是背面相贴。NDEF 消息中的数据可以包含您希望在设备之间共享的任何数据。例如,“联系人”应用分享联系人、YouTube 分享视频以及“浏览器” 使用 Android Beam 分享网址

如需使用 Android Beam 在设备之间传输数据,您需要创建一个 NdefMessage,其中包含您希望在运行 activity 时分享的信息 前景。然后,您必须通过以下两种方式之一将 NdefMessage 传递给系统:

如果您希望在系统成功将 NDEF 消息传送到其他设备后运行一些特定代码,可以实现 NfcAdapter.OnNdefPushCompleteCallback 并使用 setNdefPushCompleteCallback() 进行设置。系统会 然后在消息传送时调用 onNdefPushComplete()

在接收设备上,系统会以与常规 NFC 类似的方式分派 NDEF 推送消息 代码。系统使用 ACTION_NDEF_DISCOVERED 调用 intent 操作启动 activity,其中包含根据 NdefMessage 中的第一个 NdefRecord 设置的网址或 MIME 类型。对于您希望响应的 activity,您可以为应用关注的网址或 MIME 类型声明 intent 过滤器。有关 有关代码调度的信息,请参阅 NFC 开发者指南。

如果您希望 NdefMessage 带有 URI,现在可以使用 createUri 方法,基于字符串或 Uri 对象构造新的 NdefRecord。如果 URI 采用您希望应用在 Android Beam 事件期间也接收的特殊格式,您应使用相同的 URI 架构为 activity 创建 intent 过滤器,以接收传入的 NDEF 消息。

您还应传递“Android 应用记录”您的NdefMessage 以确保您的应用会处理传入的 NDEF 消息,即使是其他消息, 应用过滤器针对相同的 intent 操作。您可以通过调用 createApplicationRecord() 并向其传递应用的软件包名称来创建 Android 应用记录。当其他设备收到包含应用记录的 NDEF 消息,并且多个应用包含用于处理指定 intent 的 activity 时,系统始终会将消息传递给应用中的 activity(基于匹配的应用记录)。如果目标设备目前未安装您的应用,系统会使用 Android 应用记录启动 Google Play,并将用户定向到该应用以便安装。

如果您的应用不使用 NFC API 执行 NDEF 推送消息传递,则 Android 会提供默认行为:当您的应用在一台设备上处于前台,并且通过另一部 Android 设备调用 Android Beam 时,另一部设备会收到包含用于标识您的应用的 Android 应用记录的 NDEF 消息。如果接收方设备的 系统会启动它如果没有安装,Google Play 就会打开 用户来安装您的应用。

如需详细了解 Android Beam 和其他 NFC 功能,请参阅 NFC 基础知识开发者指南。如需了解使用 Android Beam 的一些示例代码,请参阅 Android Beam 演示

Wi-Fi P2P

Android 现在支持 Android 设备与其他类型设备之间的 Wi-Fi 点对点 (P2P) 连接(符合 Wi-Fi 联盟的 Wi-Fi 直连™ 认证计划要求),无需热点或互联网连接。Android 框架提供了一个 一组 Wi-Fi P2P API,可让您在每台设备上发现并连接到其他设备 支持 Wi-Fi 点对点连接,那么可以通过快速连接跨越距离的快速通信, 蓝牙连接。

新软件包 android.net.wifi.p2p 包含用于通过 Wi-Fi 执行点对点连接的所有 API。您需要使用的主类是 WifiP2pManager,您可以通过调用 getSystemService(WIFI_P2P_SERVICE) 获取该类。WifiP2pManager 包含可让您执行以下操作的 API:

还有一些其他接口和类也是必要的,例如:

为了使用 Wi-Fi P2P API,您的应用必须请求以下用户权限:

  • ACCESS_WIFI_STATE
  • CHANGE_WIFI_STATE
  • INTERNET(虽然您的应用从技术层面来讲,它无法连接 连接到互联网,且使用标准 Java 套接字与 Wi-Fi 点对点连接通信需要连接到互联网 权限)。

Android 系统还会在特定 Wi-Fi P2P 事件期间广播多种不同的操作:

如需了解详情,请参阅 WifiP2pManager 文档。另请参阅 Wi-Fi P2P 演示示例应用。

蓝牙健康设备

Android 现在支持蓝牙健康配置文件设备,因此您可以创建使用 通过蓝牙与支持蓝牙功能的健康设备(如心率监测器)进行通信, 血糖仪、体温计和体重秤

与常规耳机和采用 A2DP 配置文件的设备类似,您必须使用 BluetoothProfile.ServiceListenerHEALTH 配置文件类型调用 getProfileProxy(),才能与配置文件建立连接 代理对象。

获取健康个人资料代理(BluetoothHealth 对象),连接配对健康设备并与之通信涉及以下新功能: Bluetooth 类:

如需详细了解如何使用蓝牙健康配置文件,请参阅 BluetoothHealth 的文档。

无障碍

Android 4.0 通过新的“轻触探索”模式改进了视障用户使用的无障碍功能 和扩展 API,这些 API 可让您提供有关查看内容或 开发高级无障碍服务。

触摸浏览模式

现在,视障用户可以通过轻触屏幕并在屏幕上拖动手指来浏览屏幕,并听取内容的语音描述。由于“通过触摸探索”模式的运作方式与虚拟光标类似,因此屏幕阅读器可以像用户使用方向键或轨迹球导航时一样识别描述性文本,即通过在模拟“悬停”事件时读取 android:contentDescriptionsetContentDescription() 提供的信息。因此, 提醒您一下,您应该为 尤其是 ImageButtonEditTextImageView 和其他可能自然不含描述性内容的 widget 文本。

视图的无障碍功能

如需增强屏幕阅读器等无障碍服务可以获得的信息,您可以 在自定义 View 组件中为无障碍事件实现新的回调方法。

首先需要注意的是,sendAccessibilityEvent() 方法的行为在 Android 4.0 中发生了变化。与以前的 Android 版本一样,当用户在设备上启用无障碍服务时 当发生点击或悬停等输入事件时,系统会使用对 sendAccessibilityEvent()。以前, sendAccessibilityEvent()的实现会 初始化 AccessibilityEvent 并将其发送到 AccessibilityManager。新行为涉及一些额外的回调 这些方法可让视图及其父项向事件添加更多上下文信息:

  1. 调用时,sendAccessibilityEvent()sendAccessibilityEventUnchecked() 方法会推迟到 onInitializeAccessibilityEvent()

    View 的自定义实现可能需要实现 onInitializeAccessibilityEvent() 以将其他无障碍信息附加到 AccessibilityEvent,但还应调用父级实现以提供标准内容说明、项索引等默认信息。但是,您不应在此回调中添加额外的文本内容 - 发生这种情况 继续。

  2. 初始化后,如果事件是应填充文本的多种类型之一 信息,视图随后会收到对 dispatchPopulateAccessibilityEvent() 的调用, 遵循onPopulateAccessibilityEvent() 回调。

    View 的自定义实现通常应实现 onPopulateAccessibilityEvent(),以添加额外的 如果 android:contentDescription 文本缺失或AccessibilityEvent 不足。要向 AccessibilityEvent,调用 getText()add()

  3. 此时,View 会通过对父视图调用 requestSendAccessibilityEvent() 将事件向上传递到视图层次结构。每个父视图都有机会通过 添加 AccessibilityRecord,直到它 最终到达根视图,该视图使用 sendAccessibilityEvent() 将事件发送到 AccessibilityManager

除了上述在扩展 View 类时非常有用的新方法之外,您还可以通过扩展 AccessibilityDelegate 并使用 setAccessibilityDelegate() 在视图上设置它,来拦截任何 View 上的这些事件回调。这样一来,视图中的每个无障碍功能方法都会推迟对代理中相应方法的调用。例如,当视图收到对 onPopulateAccessibilityEvent() 的调用时,它会将其传递给 View.AccessibilityDelegate 中的同一方法。任何不由 委托会直接返回视图,以执行默认行为。这样一来,您无需扩展 View 类,即可仅替换任何给定视图所需的方法。

如果您希望保持与 Android 4.0 之前的版本兼容,同时支持 最新的无障碍功能 API,但您可以使用最新版 v4 支持 库(在兼容性包 r4 中) 使用一组实用程序类,这些实用程序类在向后兼容的环境中提供新的无障碍功能 API, 设计。

辅助功能服务

如果您正在开发无障碍服务,那么有关各种无障碍功能事件的信息 经过大幅扩展,可为用户提供更高级的无障碍功能反馈。在 具体来说,事件是基于视图构成生成的,可提供更好的上下文信息和 可让无障碍服务遍历视图层次结构,以获取额外的视图信息和 处理特殊情况。

如果您正在开发无障碍服务(例如屏幕阅读器),则可以按照以下步骤访问其他内容信息并遍历视图层次结构:

  1. 收到应用发出的 AccessibilityEvent 后, 调用 AccessibilityEvent.getRecord() 来检索特定的 AccessibilityRecord(可能有多个记录附加到 事件)。
  2. 您可以从 AccessibilityEvent 或单个 AccessibilityRecord 调用 getSource() 来检索 AccessibilityNodeInfo 对象。

    AccessibilityNodeInfo 表示单个节点 窗口内容的格式,让您能够查询有关该内容的无障碍信息 节点。从 AccessibilityEvent 返回的 AccessibilityNodeInfo 对象描述事件来源,而 AccessibilityRecord 中的来源描述事件来源的前身。

  3. 借助 AccessibilityNodeInfo,您可以查询其相关信息、调用 getParent()getChild() 来遍历视图层次结构,甚至可以向节点添加子视图。

为了让应用能够将自身作为无障碍服务发布到系统,它必须声明与 AccessibilityServiceInfo 对应的 XML 配置文件。如需详细了解如何创建无障碍服务,请参阅 AccessibilityServiceSERVICE_META_DATA,了解 XML 配置。

其他无障碍功能 API

如果您对设备的无障碍状态感兴趣,不妨看看 AccessibilityManager 提供了一些新的 API,例如:

拼写检查服务

一种新的拼写检查工具框架可让应用以类似于 输入法框架(针对 IME)。要创建新的拼写检查工具,您必须实现一项 扩展 SpellCheckerService 并扩展 SpellCheckerService.Session 类,以提供基于拼写的拼写建议 。在 SpellCheckerService.Session 回调方法中,您必须将拼写建议作为 SuggestionsInfo 对象返回。

具有拼写检查服务的应用必须声明 BIND_TEXT_SERVICE 权限,以满足服务的要求。该服务还必须声明一个 intent 过滤器,并将 <action android:name="android.service.textservice.SpellCheckerService" /> 用作 intent 的操作,并且应包含一个 <meta-data> 元素,用于声明拼写检查器的配置信息。

查看示例 拼写检查工具服务应用,以及 示例 拼写检查工具客户端应用,获取示例代码。

文字转语音引擎

Android 的文字转语音 (TTS) API 已得到显著扩展,可让应用 能够更轻松地实现自定义 TTS 引擎,而要使用 TTS 引擎的应用则具有 新增了几个用于选择引擎的 API

使用文字转语音引擎

在以前的 Android 版本中,您可以使用 TextToSpeech 类 使用系统提供的 TTS 引擎执行文字转语音 (TTS) 操作,或设置 自定义引擎(使用 setEngineByPackageName())。在 Android 4.0 中,setEngineByPackageName() 方法 现在,您可以通过接受 TTS 引擎软件包名称的新 TextToSpeech 构造函数指定要使用的引擎。

您还可以使用 getEngines() 查询可用的 TTS 引擎。此方法会返回 TextToSpeech.EngineInfo 对象列表,其中包括引擎的 图标、标签和软件包名称

构建文字转语音引擎

以前,自定义引擎需要使用未记录的原生头文件构建引擎。Android 4.0 中有一套完整的框架 API 用于构建 TTS 引擎。

基本设置需要实现 TextToSpeechService, 响应 INTENT_ACTION_TTS_SERVICE intent。通过 TTS 引擎的主要工作发生在服务的 onSynthesizeText() 回调期间 扩展 TextToSpeechService。系统传递第 2 种方法 对象:

  • SynthesisRequest:此参数包含各种数据,包括要合成的文本、语言区域、语速和语调。
  • SynthesisCallback:这是 TTS 引擎以流式音频形式提供生成的语音数据的接口。首先,引擎必须调用 start() 以指示引擎已准备好传送音频,然后调用 audioAvailable(),将音频数据作为字节缓冲区传递给它。当引擎通过 缓冲区,调用 done()

现在,该框架支持用于创建 TTS 引擎的真实 API,因此已移除对原生代码实现的支持。查找介绍兼容层的博文,您可以使用该层将旧版 TTS 引擎转换为新框架。

如需查看使用新 API 的 TTS 引擎示例,请参阅 Text To Speech Engine 示例应用。

网络使用

Android 4.0 可让用户准确了解其应用使用的网络流量。借助“设置”应用提供的控件,用户可以管理网络流量消耗的设定限制,甚至可以禁止各个应用使用后台流量。为了避免用户禁止您的应用从后台访问数据,您应制定策略来有效使用数据连接,并根据可用连接类型调整使用情况。

如果您的应用执行大量网络事务,则应提供用户设置,以允许用户控制应用的数据习惯,例如应用同步数据的频率、是否仅在 WLAN 连接下进行上传/下载、是否在漫游时使用数据等。为用户提供这些控件后,当数据使用量接近限制时,用户就不太可能禁止您的应用访问数据,因为他们可以精确地控制应用使用的数据量。如果您提供具有这些设置的偏好设置 activity,则应在其清单声明中添加 ACTION_MANAGE_NETWORK_USAGE 操作的 intent 过滤器。例如:

<activity android:name="DataPreferences" android:label="@string/title_preferences">
    <intent-filter>
       <action android:name="android.intent.action.MANAGE_NETWORK_USAGE" />
       <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

此 intent 过滤器会告知系统这是控制您的 应用的数据使用情况。因此,当用户从“设置”应用检查应用所使用的数据量时,可以使用“查看应用设置”按钮启动您的偏好设置 activity,以便用户优化应用使用的数据量。

另请注意,getBackgroundDataSetting() 现已废弃,并且始终会返回 true,请改用 getActiveNetworkInfo()。在尝试任何网络之前 您应始终调用 getActiveNetworkInfo() 以获取代表当前网络的 NetworkInfo,并查询 isConnected() 以检查设备是否具有 连接。然后,您可以检查其他连接属性,例如设备是漫游还是连接到 Wi-Fi。

企业

Android 4.0 通过以下功能扩展了企业应用的功能。

VPN 服务

借助新的 VpnService,应用可以构建自己的 VPN(虚拟 专用网络),以 Service 身份运行。VPN 服务为 具有自己的地址和路由规则的虚拟网络, 文件描述符。

如需创建 VPN 服务,请使用 VpnService.Builder,这样您可以指定 网络地址、DNS 服务器、网络路由等完成后,您可以通过调用 establish() 来建立接口,该接口会返回 ParcelFileDescriptor

由于 VPN 服务可以拦截数据包,因此存在安全隐患。因此,如果您实现了 VpnService,则您的服务必须请求 BIND_VPN_SERVICE,以确保只有系统可以与之绑定(只有系统会被授予此权限,应用无法请求此权限)。之后,如要使用该 VPN 服务, 用户必须在系统设置中手动启用它。

设备政策

管理设备限制的应用现在可以使用 setCameraDisabled()USES_POLICY_DISABLE_CAMERA 属性(通过政策配置文件中通过 <disable-camera /> 元素应用)来停用摄像头。

证书管理

新的 KeyChain 类提供了一些 API,可让您在系统密钥库中导入和访问证书。证书可简化两个客户端的安装 证书授权中心证书(用于验证用户的身份)和证书授权中心证书(用于 验证服务器身份)。Web 浏览器或电子邮件客户端等应用可以访问已安装的证书,以向服务器验证用户身份。请参阅KeyChain 文档。

设备传感器

Android 4.0 中添加了两种新的传感器类型:

如果设备同时具有 TYPE_AMBIENT_TEMPERATURETYPE_RELATIVE_HUMIDITY 传感器,您可以使用它们来计算露点 和绝对湿度

上一个温度传感器 TYPE_TEMPERATURE 已 已弃用。您应使用 TYPE_AMBIENT_TEMPERATURE 传感器 。

此外,Android 的三个合成传感器也得到了极大的改进,所以现在它们 延迟和更流畅的输出。这些传感器包括重力传感器 (TYPE_GRAVITY)、旋转矢量传感器 (TYPE_ROTATION_VECTOR) 和线性加速度传感器 (TYPE_LINEAR_ACCELERATION)。经过改进的传感器依赖于陀螺仪传感器来改进输出,因此这些传感器仅在具有陀螺仪的设备上显示。

操作栏

更新了 ActionBar,以支持多种新行为。最重要的是,系统会在小屏幕上运行时妥善管理操作栏的大小和配置,以便在所有屏幕尺寸上提供最佳用户体验。例如,当屏幕较窄时(例如手机处于竖屏模式时),操作栏的导航标签页会显示在“堆叠栏”中,该栏位于主操作栏正下方。您还可以选择启用“分屏式操作栏”,在屏幕较窄时,系统会将所有操作项放置在屏幕底部的单独栏中。

拆分操作栏

如果您的操作栏包含多个操作项,其中部分操作项在窄屏设备上无法显示在操作栏中,因此系统会将更多操作项放入溢出菜单中。不过,Android 4.0 允许您启用“分屏操作栏”,以便在屏幕底部的单独栏中显示更多操作项。如需启用分屏操作栏,请将 android:uiOptions"splitActionBarWhenNarrow" 添加到清单文件中的 <application> 标记或各个 <activity> 标记。启用后,系统会在 当屏幕较窄时,所有操作项都会显示在主页面(主页面不会显示任何操作项) 操作栏)。

如果您想使用 ActionBar.Tab API 提供的导航标签页,但不需要顶部的主操作栏(您只希望标签页显示在顶部),请按照上述说明启用分屏操作栏,并调用 setDisplayShowHomeEnabled(false) 以停用操作栏中的应用图标。由于主操作栏中没有内容 消失 - 只剩顶部的导航标签和顶部的操作项 屏幕底部。

操作栏样式

如果您想对操作栏应用自定义样式,可以使用新的样式属性 backgroundStackedbackgroundSplit 分别向堆叠式栏和分屏栏应用背景可绘制对象或颜色。您还可以使用 setStackedBackgroundDrawable()setSplitBackgroundDrawable() 在运行时设置这些样式。

操作提供程序

借助新的 ActionProvider 类,您可以为操作项创建专用处理程序。操作提供程序可以为其关联的每个操作项定义操作视图、默认操作行为和子菜单。当您想要创建包含 动态行为(例如可变操作视图、默认操作或子菜单),那么扩展 ActionProvider 是一个很好的解决方案,以便创建可重复使用的组件,而不是 处理 fragment 或 activity 中的各种待办项转换。

例如,ShareActionProviderActionProvider 的扩展,有助于“分享”操作。不使用 调用 ACTION_SEND intent 的传统操作项,您可以 使用此操作提供程序显示操作视图,其中包含处理 ACTION_SEND intent。当用户选择要用于相应操作的应用时,ShareActionProvider 会记住该选择,并在操作视图中提供该选择,以便用户更快地通过该应用进行分享。

如需为操作项声明操作提供程序,请在 activity 的选项菜单的 <item> 元素中添加 android:actionProviderClass 属性,并将操作提供程序的类名称作为值。例如:

<item android:id="@+id/menu_share"
      android:title="Share"
      android:showAsAction="ifRoom"
      android:actionProviderClass="android.widget.ShareActionProvider" />

在您的 activity 的“onCreateOptionsMenu()”中 回调方法,请从菜单项中检索操作提供程序的实例,并设置 intent:

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    menuInflater.inflate(R.menu.options, menu)
    val shareActionProvider = menu.findItem(R.id.menu_share)?.actionProvider as? ShareActionProvider
    // Set the share intent of the share action provider.
    shareActionProvider?.setShareIntent(createShareIntent())
    ...
    return super.onCreateOptionsMenu(menu)
}

Java

public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.options, menu);
    ShareActionProvider shareActionProvider =
          (ShareActionProvider) menu.findItem(R.id.menu_share).getActionProvider();
    // Set the share intent of the share action provider.
    shareActionProvider.setShareIntent(createShareIntent());
    ...
    return super.onCreateOptionsMenu(menu);
}

如需查看使用 ShareActionProvider 的示例,请参阅 ApiDemos 中的 ActionBarShareActionProviderActivity

可收起的 Action 视图

提供操作视图的操作项现在可以在其操作视图状态和 传统待办项状态以前仅支持 SearchView 隐藏部分,但现在您可以为任何操作项添加操作视图 在展开状态(操作视图可见)和收起状态(操作项为 可见)。

如需声明包含操作视图的操作项可收起,请在菜单的 XML 文件中为 <item> 元素的 android:showAsAction 属性添加 “collapseActionView" 标志。

要在操作视图在展开和收起状态之间切换时接收回调,请注册 通过调用 setOnActionExpandListener()MenuItem.OnActionExpandListener 的实例替换为相应的 MenuItem。通常,您应在 onCreateOptionsMenu() 回调期间执行此操作。

要控制可折叠操作视图,您可以调用 collapseActionView()expandActionView() 相应的 MenuItem

创建自定义操作视图时,您还可以实现新的 CollapsibleActionView 接口,以在视图展开和 已收起。

适用于操作栏的其他 API

  • setHomeButtonEnabled() 可用于指定 图标/徽标是作为用于导航主屏幕的按钮还是“向上”按钮(传递“true”以使其行为 按钮)。
  • setIcon()setLogo() 允许您在运行时定义操作栏图标或徽标。
  • Fragment.setMenuVisibility()可让您启用 或停用 fragment 声明的选项菜单项的可见性。如果将 fragment 已添加到 activity 中,但它不可见,因此菜单项应是 已隐藏。
  • FragmentManager.invalidateOptionsMenu() 可让您在 fragment 生命周期的各种状态下使 activity 选项菜单失效 其中,可能无法使用 Activity 中的等效方法。

界面和视图

Android 4.0 引入了各种新的视图和其他界面组件。

GridLayout

GridLayout 是一个新的视图组,用于将子视图放置在矩形 网格。与 TableLayout 不同,GridLayout 依赖于 层次结构,并且不使用表格行等中间视图来提供结构。 而是由子项指定它们应占据的行和列(单元格可以跨多行和/或多列),并且默认情况下会按顺序布置在网格的行和列中。GridLayout 方向决定了顺序子项是否 默认采用水平或垂直布局。您可以通过使用新 Space 视图的实例或在子项上设置相关边距参数来指定子项之间的间距。

请参阅 ApiDemos 使用 GridLayout 的示例。

TextureView

TextureView 是一个新视图,可用于显示内容流,如 指定为视频或 OpenGL 场景虽然与 SurfaceView 类似,但 TextureView 的独特之处在于,它的行为类似于常规视图,而不是创建单独的窗口,因此您可以将其视为任何其他 View 对象。例如,您可以应用转换、使用 ViewPropertyAnimator 为其添加动画效果,或使用 setAlpha() 调整其不透明度。

请注意,TextureView 仅在硬件加速窗口中有效。

如需了解详情,请参阅 TextureView 文档。

切换微件

新的 Switch widget 是一个具有两种状态的切换开关,用户可以拖动到其中一个状态 (或直接点按)可在两种状态间切换选项。

您可以使用 android:textOnandroid:textOff 属性来指定文本 。android:text 属性还 可让您在开关旁边放置标签。

如需查看使用开关的示例,请参阅 switches.xml 布局文件和相应的 Switches activity。

Android 3.0 引入了 PopupMenu,用于创建在您指定的锚点(通常是所选项所在的位置)弹出的简短上下文菜单。Android 4.0 通过以下几个实用功能扩展了 PopupMenu

偏好设置

新的 TwoStatePreference 抽象类可作为实现以下目标的基础 提供两种状态选项的偏好设置。新的 SwitchPreferenceTwoStatePreference 的扩展,可在Switch 偏好设置视图允许用户开启或关闭某项设置,而无需另外打开 偏好设置屏幕或对话框。例如,“设置”应用使用 SwitchPreference 来设置 Wi-Fi 和蓝牙。

系统主题

所有以 Android 4.0 为目标平台的应用(通过将 targetSdkVersionminSdkVersion 设置为 “14" 或更高级别)的默认主题现已变为“设备默认”主题:Theme.DeviceDefault。这可能是 深色 Holo 主题或由特定设备定义的其他深色主题。

Theme.Holo 主题系列保证不会发生变化 在运行相同 Android 版本的情况下从一台设备转移到另一台设备。如果您明确指定 将任意 Theme.Holo 主题应用于您的 activity,即可 请放心,对于同一个应用,这些主题在不同设备上不会 平台版本。

如果您希望应用与设备的整体主题融为一体(例如,当不同原始设备制造商 [OEM] 为系统提供不同的默认主题时),则应明确应用 Theme.DeviceDefault 系列中的主题。

选项菜单按钮

从 Android 4.0 开始,您会发现手机不再需要菜单硬件按钮。 不过,如果您的现有应用提供选项菜单并预计有“菜单”按钮,则无需担心此问题。为确保现有应用继续按预期运行,系统会提供 针对旧版 Android 设计的应用的屏幕菜单按钮。

为了提供最佳用户体验,新应用和更新后的应用应改用 ActionBar 来提供对菜单项的访问权限,并将 targetSdkVersion 设置为 "14",以便利用最新的框架默认行为。

用于系统界面可见性的控件

在 Android 推出早期,系统管理了一个称为状态的界面组件。 bar,它位于手机设备的顶部,用于提供运营商 信号、时间、通知等。Android 3.0 为平板电脑添加了系统栏 此类设备位于屏幕底部,用于提供系统导航控件(主屏幕、 “返回”等)以及过去由状态栏提供的元素的接口。在 Android 4.0 中,系统提供了一种新的系统界面,称为导航栏。您 您可能会认为导航栏是经过重新调整的系统栏版本, 手机—它提供导航控件 如果设备没有对应硬件来导航系统,但它省去了 系统栏的通知界面和设置控件。因此,提供导航功能的设备 同样在顶部带有状态栏

迄今为止,您可以使用 FLAG_FULLSCREEN 标志隐藏手机上的状态栏。在 Android 4.0 中,控制 系统栏的可见性已更新,以更好地反映系统栏的行为 和导航栏:

  • SYSTEM_UI_FLAG_LOW_PROFILE 标志会替换 STATUS_BAR_HIDDEN 标志。设置后,此标记会启用“低个人资料”模式,或 导航栏。导航按钮会变暗,系统栏中的其他元素也会隐藏。启用此功能有助于打造更具沉浸感的游戏,而不会因系统导航按钮而分心。
  • SYSTEM_UI_FLAG_VISIBLE 标志会替换 STATUS_BAR_VISIBLE 标志,以请求显示系统栏或导航栏。
  • SYSTEM_UI_FLAG_HIDE_NAVIGATION 是一个新标志,用于请求完全隐藏导航栏。请注意,这仅适用于导航栏 (该功能不会隐藏平板电脑上的系统栏)。导航 会在系统收到用户输入后立即返回视图。因此,这种模式 主要用于视频播放或其他需要整个屏幕但需要用户输入的内容 不需要。

您可以通过对 activity 中的任何视图调用 setSystemUiVisibility(),为系统栏和导航栏设置上述各个标志。通过 窗口管理器会将窗口中所有视图的所有标记合并(OR 运算),并 将它们应用到系统界面,只要窗口具有输入焦点即可。当窗口失去输入焦点(用户离开您的应用或显示对话框)时,您的标志将失效。同样,如果您从视图层次结构中移除这些视图,则其标志将不再适用。

如需将 activity 中的其他事件与系统界面的可见性更改同步(例如,在系统界面隐藏时隐藏操作栏或其他界面控件),您应注册 View.OnSystemUiVisibilityChangeListener,以便在系统栏或导航栏的可见性发生变化时收到通知。

如需查看不同系统界面选项的演示,请参阅 OverscanActivity 类。

输入框架

Android 4.0 增加了对光标悬停事件以及新的触控笔和鼠标按钮事件的支持。

悬停事件

View 类现在支持“hover”可实现更丰富的互动 通过使用指针设备(例如鼠标或驱动屏幕的其他设备) 光标)。

如需在视图上接收悬停事件,请实现 View.OnHoverListener 并将其注册到 setOnHoverListener()。当视图上发生悬停事件时,您的监听器会收到对 onHover() 的调用,并提供收到事件的 View 和描述发生的悬停事件类型的 MotionEvent。悬停事件可以是以下各项之一:

如果 View.OnHoverListener 处理悬停事件,则应从 onHover() 返回 true。如果您的 监听器返回 false,那么悬停事件会像往常一样分派到父视图。

如果您的应用使用按钮或其他 widget,并且这些 widget 会根据当前状态更改其外观,那么您现在可以在状态列表可绘制对象中使用 android:state_hovered 属性,以便在光标悬停在视图上时提供不同的背景可绘制对象。

有关新悬停事件的演示,请参阅 Hover 类(位于 ApiDemos 中提供。

触控笔和鼠标按钮事件

Android 现在提供用于从触控笔输入设备(例如数字转换器)接收输入的 API 平板电脑外围设备或支持触控笔的触摸屏。

触控笔输入的运作方式与触摸或鼠标输入类似。当触控笔与数字化器接触时,应用会收到触摸事件,就像使用手指触摸显示屏一样。当触控笔悬停在数字转换器上方时,应用会收到悬停操作 事件就像在没有按钮的情况下,在显示屏上移动鼠标指针时一样 按钮。

您的应用可以通过查询 “工具类型”使用 getToolType()MotionEvent 中的每个指针相关联。当前定义的工具类型包括:TOOL_TYPE_UNKNOWNTOOL_TYPE_FINGERTOOL_TYPE_MOUSETOOL_TYPE_STYLUS、 和 TOOL_TYPE_ERASER。通过查询工具类型,您的应用 可以选择采用与手指或鼠标输入不同的方式处理触控笔输入。

您的应用还可以使用 getButtonState() 查询 MotionEvent 的“按钮状态”,从而查询哪些鼠标或触控笔按钮被按下。当前定义的按钮状态为:BUTTON_PRIMARYBUTTON_SECONDARYBUTTON_TERTIARYBUTTON_BACKBUTTON_FORWARD。为方便起见,系统会自动将鼠标的“返回”和“前进”按钮映射到 KEYCODE_BACKKEYCODE_FORWARD 键。您的应用可以处理这些按键,以支持基于鼠标按钮的返回和前进导航。

除了精确测量接触点的位置和压力之外,某些触控笔输入设备还会报告触控笔尖与数字化器之间的距离、触控笔倾斜度和触控笔方向角度。您的应用可以使用 getAxisValue() 和轴代码 AXIS_DISTANCEAXIS_TILTAXIS_ORIENTATION 查询此类信息。

有关工具类型、按钮状态和新轴代码的演示,请参阅 TouchPaint 类。

属性

新的 Property 类可让您快速、高效、轻松地指定 属性。它还支持传递字段/方法引用的功能,并允许代码在不了解字段/方法详细信息的情况下设置/获取属性的值。

例如,如果要在对象 foo 上设置字段 bar 的值,您应 之前执行此操作:

Kotlin

foo.bar = value

Java

foo.bar = value;

如果您想为底层私有字段 bar 调用 setter,之前应该 执行此操作:

Kotlin

foo.setBar(value)

Java

foo.setBar(value);

不过,如果您想传递 foo 实例并让一些其他代码设置 bar 值,那么在 Android 4.0 之前,根本无法实现这一点。

使用 Property 类,您可以在类 Foo 上声明 Property 对象 BAR,以便在类 Foo 的实例 foo 上设置字段,如下所示:

Kotlin

BAR.set(foo, value)

Java

BAR.set(foo, value);

View 类现在利用 Property 类,可让您设置各种字段,例如 Android 3.0 中添加的转换属性 (ROTATIONROTATION_XTRANSLATION_X 等)。

ObjectAnimator 类也使用 Property 因此您可以使用 Property 创建 ObjectAnimator,与基于字符串相比,后者速度更快、效率更高,且更安全类型。 方法。

硬件加速

从 Android 4.0 开始,如果您的 应用设置了 targetSdkVersionminSdkVersion“14" 或更高版本。硬件加速通常会使动画和滚动更流畅,并整体提升性能以及对用户互动的响应速度。

如有必要,您可以使用 hardwareAccelerated 手动停用硬件加速。 属性,用于单个 <activity> 元素或 <application> 元素。您也可以通过调用 setLayerType(LAYER_TYPE_SOFTWARE) 为各个视图停用硬件加速。

如需详细了解硬件加速,包括不受支持的绘图列表 请参阅硬件 Acceleration 文档。

JNI 变更

在以前的 Android 版本中,JNI 局部引用不是间接句柄;使用的 Android 设备 直接指针。只要垃圾回收器不移动对象,这就不会成为问题, 因为它使用户可以编写有缺陷的代码。在 Android 4.0 中,系统现在使用间接引用来检测这些 bug。

“局部和全局引用”中介绍了 JNI 局部引用的来龙去脉JNI 提示。在 Android 4.0 中,CheckJNI 已得到增强,可检测这些错误。请关注 Android 开发者博客,查看即将发布的博文 有关 JNI 引用的常见错误以及如何修复这些错误。

JNI 实现中的这项变更仅会影响将 targetSdkVersionminSdkVersion 设为 “14" 或更高版本、以 Android 4.0 为目标平台的应用。如果您已将这些属性设为任何较低的值 则 JNI 局部引用的行为与以前版本中相同。

WebKit

  • WebKit 已更新到版本 534.30
  • WebView 和内置浏览器中对印度字体(天城罗、孟加拉语和泰米尔语,包括组合字形所需的复杂字符支持)的支持
  • WebView 支持埃塞俄比亚语、格鲁吉亚语和亚美尼亚语字体, 内置浏览器
  • 支持 WebDriver 可让您更轻松地测试使用 WebView 的应用

Android 浏览器

浏览器应用添加了以下功能来支持 Web 应用:

权限

以下是新权限:

设备功能

以下是新的设备功能:

有关 Android 4.0(API 级别)中所有 API 变更的详细视图 14),请参阅 API 差异报告

旧版 API

除了上述所有内容之外,Android 4.0 还自然支持之前版本中的所有 API。由于 Android 3.x 平台仅适用于大屏设备,因此如果您一直主要针对手机进行开发,可能不知道最近这些版本中向 Android 添加的所有 API。

下面介绍了您可能错过的一些最值得关注的 API,而现在这些 API 手机:

Android 3.0
  • Fragment:一种框架组件,用于分隔不同的 转换为独立的模块,这些模块可定义自己的界面和生命周期。请参阅 Fragment 开发者指南。
  • ActionBar:替代了顶部的传统标题栏 打开 activity 窗口。它在左下角包含应用徽标,并为菜单项提供了新的界面。请参阅操作栏开发者指南。
  • Loader:一种框架组件,可与界面组件结合使用,以便在不阻塞主线程的情况下动态加载数据。请参阅加载器开发者指南。
  • 系统剪贴板:应用可将数据(不仅仅是文字)复制和粘贴到 直接打开系统级剪贴板裁剪数据可以是纯文本、URI 或 intent。请参阅复制和粘贴开发者指南。
  • 拖放:一组内置于视图框架中的 API,便于拖放 操作。请参阅拖放方面的开发者指南。
  • 全新的灵活动画框架可让您为任意属性的任意属性添加动画效果。 对象(视图、可绘制对象、Fragment、对象或任何其他对象),并定义动画方面,例如 例如持续时间、插值、重复等。新框架让 Android 中的动画 从未如此简单请参阅 属性动画开发者 指南。
  • RenderScript 图形和计算引擎:RenderScript 可提供高性能 3D 使用 C(C99 标准)编写的原生级图形渲染和计算 API, 提供您期望的原生环境性能类型,同时保持可移植性 不同 CPU 和 GPU 上的资源。请参阅 RenderScript 开发者指南。
  • 硬件加速的 2D 图形:您现在可以为自己的 在清单元素的 <application> 中设置 {android:hardwareAccelerated="true"} 来实现应用 元素或单个 <activity> 元素。这样可使动画和滚动更流畅,并提高整体性能和对用户互动的响应能力。

    注意:如果您将应用的 minSdkVersiontargetSdkVersion 设置为 "14" 或更高版本,硬件加速默认处于启用状态。

  • 等等。请参阅 Android 3.0 平台 备注。
Android 3.1
  • USB API:用于将已连接的外围设备与 Android 应用集成的强大新 API。这些 API 基于 USB 堆栈和服务, 内置于平台中,包括对 USB 主机和设备交互的支持。请参阅 USB 主机和配件开发者指南。
  • MTP/PTP API:应用可以直接与已连接的相机和其他 PTP 设备交互,以便在设备连接和移除时接收通知、管理这些设备上的文件和存储空间,以及在这些设备之间传输文件和元数据。MTP API 实现 PTP MTP(媒体传输协议)规范的子集(图片传输协议)。请参阅 android.mtp 文档。
  • RTP API:Android 向其内置的 RTP(实时传输协议)堆栈公开了 API, 供应用用来管理按需或交互式数据流。具体而言,应用 提供 VoIP、一键通话、会议和音频串流功能的用户可以使用该 API 发起通话 以及通过任何可用网络传输或接收数据流。请参阅 android.net.rtp 文档。
  • 支持操纵杆和其他常规动作输入。
  • 请参阅 Android 3.1 平台 更多新 API 注释
Android 3.2
  • 新屏幕支持 API,可让您更好地控制应用 以各种不同的屏幕尺寸显示该 API 使用 按尺寸精确定位特定屏幕尺寸的能力, 密度无关像素单位(例如 600dp 或 720dp 宽度),而非按其广义的像素单位 屏幕尺寸(例如大屏幕或特大屏幕)。例如,这对于帮助您 区分 5 英寸和 7 英寸的传统上称为“存储分区” “large”屏幕。请参阅博文用于管理屏幕尺寸的新工具
  • <uses-feature> 的新常量添加到 声明横向或纵向屏幕方向要求。
  • 现在,设备“屏幕尺寸”配置会在屏幕方向发生变化时发生变化。如果您的应用以 API 级别 13 或更高级别为目标平台,您必须处理 "screenSize" 配置更改。"orientation"如需了解详情,请参阅 android:configChanges
  • 请参阅 Android 3.2 平台 有关其他新 API 的说明。

API 级别

Android 4.0 API 会被分配一个整数标识符(14),该标识符存储在系统本身中。此标识符称为“API 级别”,可让系统在安装应用之前正确确定应用是否与系统兼容。

如需在应用中使用 Android 4.0 中引入的 API,您需要针对支持 API 级别 14 或更高级别的 Android 平台编译应用。根据您的需求,您可能还需要向 <uses-sdk> 元素添加 android:minSdkVersion="14" 属性。

如需了解详情,请参阅什么是 API 级别?