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 库和系统映像,以及一组模拟器皮肤和 。要开始针对 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 的 数据,并执行必要的操作,以邀请该联系人加入该网络或将此人添加到 用户关系。

大照片

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

如果您只是想向用户的日历添加事件,则可以使用包含 Events.CONTENT_URI 所定义数据的 ACTION_INSERT intent 来启动 日历应用中用于创建新活动的活动记录。使用 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),该级别具有相同的 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 时声明的广播接收器将收到 ACTION_MEDIA_BUTTON 事件。您收到的 intent 包含所按下媒体键的 KeyEvent,您可以使用 getParcelableExtra(Intent.EXTRA_KEY_EVENT) 从 intent 中检索该键。

如需显示遥控器上有关媒体播放的信息,请调用 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() 开始检测人脸。

系统在相机场景中检测到一个或多个人脸时,会调用 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)。要在 相机应用,传递 FOCUS_MODE_CONTINUOUS_PICTUREsetFocusMode()。准备好拍摄时 一张照片,调用 autoFocus()。您的 Camera.AutoFocusCallback 会立即收到回调,指示是否 才能够做到如需在收到回调后恢复 CAF,您必须调用 cancelAutoFocus()

注意:拍摄时也支持连续自动对焦 使用的是FOCUS_MODE_CONTINUOUS_VIDEO 在 API 级别 9 中引入。

其他相机功能

相机广播 intent

  • Camera.ACTION_NEW_PICTURE: 这表示用户拍摄了新照片。内置的相机应用会调用 广播,并且第三方相机应用也应广播此 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 类型。针对您想要进行的活动 您可以为应用关注的网址或 MIME 类型声明 intent 过滤器。有关 有关代码调度的信息,请参阅 NFC 开发者指南。

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

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

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

您可以在 NFC 基础知识开发者指南中详细了解 Android Beam 和其他 NFC 功能。一些示例代码 请参阅 Android Beam 演示

Wi-Fi P2P

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

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

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

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

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

在某些 WLAN 点对点事件期间,Android 系统还会广播几种不同的操作:

如需了解详情,请参阅 WifiP2pManager 文档。此外, 查看 WLAN 点对点演示 示例应用。

蓝牙健康设备

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

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

获取 Health Profile 代理(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,但也应调用 super 实现以 提供默认信息,如标准内容说明、项索引等。 但是,您不应在此回调中添加额外的文本内容 - 发生这种情况 继续。

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

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

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

除上述新方法(在扩展 View 类时很有用)之外,您还可以通过扩展 AccessibilityDelegate 并使用以下代码在视图上设置它,在任何 View 上拦截这些事件回调。 setAccessibilityDelegate()。 这样一来,视图中的每个无障碍方法都会将调用推迟到 受托人例如,当视图收到对 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 权限。 此服务还必须声明一个以 <action android:name="android.service.textservice.SpellCheckerService" /> 作为 intent 操作的 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()

现在,该框架支持真正的 API 来创建 TTS 引擎,同时也支持原生代码 已移除。查找有关兼容性层的博文 供您将旧 TTS 引擎转换为新框架。

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

网络使用

Android 4.0 让用户可以精确了解其应用使用了多少网络流量。 “设置”应用提供了一些控件,让用户能够管理已设置的网络数据使用上限和 甚至禁止个别应用使用后台数据。为了避免用户停用 您需要制定策略来使用这些数据, 并根据可用连接类型调整您的使用情况。

如果您的应用执行大量网络事务,则应提供用户设置, 让用户能够控制应用的数据习惯,例如应用同步数据的频率、是否 以及仅在连接到 Wi-Fi 时执行上传/下载操作、是否在漫游时使用数据等等。 那么当遇到这种情况时,用户不太可能会停用您的应用对数据的访问 它们会接近其极限,因为他们可以精确地控制应用使用的数据量。 如果您提供具有这些设置的偏好设置 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 类提供了可让您导入和访问 存储在系统密钥库中的证书证书可简化两个客户端的安装 证书授权中心证书(用于验证用户的身份)和证书授权中心证书(用于 验证服务器身份)。网络浏览器或电子邮件客户端等应用程序可以访问已安装的 用于向服务器验证用户身份请参阅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 可让您启用“拆分操作栏”这样屏幕上就会出现更多操作 一个单独的栏。若要启用拆分操作栏,请将带有 "splitActionBarWhenNarrow"android:uiOptions 添加到 <application> 标记或 单独的 <activity> 标记 。启用后,系统会在 当屏幕较窄时,所有操作项都会显示在主页面(主页面不会显示任何操作项) 操作栏)。

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

操作栏样式

如果要对操作栏应用自定义样式,您可以使用新的样式属性 backgroundStackedbackgroundSplit 来应用背景 可绘制对象或颜色分别添加到堆叠条形和分屏条形中。你还可以在以下位置设置这些样式: 带有 setStackedBackgroundDrawable()setSplitBackgroundDrawable() 的运行时。

操作提供方

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

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

如需为操作项声明操作提供器,请添加 android:actionProviderClass 属性(位于 activity 的选项菜单的 <item> 元素中),其值为操作的类名称 provider 作为值。例如:

<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

可收起的操作视图

提供操作视图的操作项现在可以在其操作视图状态和 传统待办项状态以前仅支持 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 布局文件 以及相应的开关 活动记录。

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,那么悬停事件会像往常一样分派到父视图。

如果您的应用使用根据 您现在可以使用状态列表可绘制对象中的 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 类,您可以声明 Property 针对 Foo 类创建对象 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 中,系统现在使用 来检测这些错误

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

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

WebKit

  • WebKit 已更新至 534.30 版
  • 支持印度语字体(梵文、孟加拉语和泰米尔语),包括支持复杂字符 在 WebView 和内置浏览器中组合字形时需要使用
  • WebView 支持埃塞俄比亚语、格鲁吉亚语和亚美尼亚语字体, 内置浏览器
  • WebDriver 的支持使得 您可以更轻松地测试使用 WebView 的应用

Android 浏览器

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

权限

以下是新权限:

设备功能

以下是新的设备功能:

有关 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:功能强大的全新 API,用于将连接的外围设备与 Android 应用。这些 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:minSdkVersion="14" 属性添加到 <uses-sdk> 元素。

有关详情,请参阅什么是 API 水平?