Android 3.0 API

API 级别11

对于开发者而言,Android 3.0 平台 (HONEYCOMB) 可作为 Android SDK 的可下载组件使用。可下载平台包括一个 Android 库、系统映像,以及一组模拟器皮肤等。可下载的平台不包含任何外部库。

对于开发者来说,Android 3.0 平台可作为 Android SDK 的可下载组件提供。可下载平台包含 Android 库、系统映像,以及一组模拟器皮肤等。如需开始针对 Android 3.0 进行开发或测试,请使用 Android SDK 管理器将该平台下载到您的 SDK 中。

API 概览

以下部分从技术上概述了 Android 3.0 中面向开发者的新功能,包括自上一个版本以来框架 API 中的新功能和变化。

Fragment

fragment 是一种新的框架组件,可让您将 activity 的不同元素拆分为独立的模块,这些模块可定义自己的界面和生命周期。如需创建 fragment,您必须扩展 Fragment 类并实现多个生命周期回调方法,类似于 Activity。然后,您可以在单个 activity 中组合多个 fragment,以构建一个多窗格界面,其中每个窗格都管理自己的生命周期和用户输入。

您还可以在不提供界面的情况下使用 fragment,而是将其用作 activity 的工作器,例如,管理仅在 activity 运行时发生的下载进度。

此外:

  • fragment 是独立的,您可以在多个 activity 中重复使用它们
  • 您可以在 activity 内添加、移除、替换 fragment,并为其添加动画效果
  • 您可以将 fragment 添加到由 activity 管理的返回堆栈,在 fragment 发生更改时保留其状态,并允许用户在不同的状态之间向后导航
  • 通过提供备用布局,您可以根据屏幕尺寸和方向混合和匹配 fragment
  • fragment 可以直接访问其容器 activity,并且可以向 activity 的操作栏贡献项(稍后会讨论)

如需管理 activity 中的 fragment,您必须使用 FragmentManager,它提供了多个用于与 fragment 交互的 API,例如在 activity 中查找 fragment 以及从返回堆栈中弹出 fragment 以恢复先前的状态。

如需执行事务(例如添加或移除 fragment),您必须创建 FragmentTransaction。然后,您可以调用 add()remove()replace() 等方法。应用您要对事务执行的所有更改后,您必须调用 commit(),系统会将 fragment 事务应用于 activity。

如需详细了解如何使用 fragment,请参阅 Fragment 文档。 API 演示版应用中还提供了一些示例。

操作栏

操作栏用于替代 activity 窗口顶部的传统标题栏。它左上角包括应用徽标,并为选项菜单中的菜单项提供了新界面。此外,您还可以通过操作栏执行以下操作:

  • 直接在操作栏中添加菜单项,即作为“操作项”。

    在菜单项的 XML 声明中,添加值为 "ifRoom"android:showAsAction 属性。当有足够的空间时,菜单项会直接显示在操作栏中。否则,菜单项会被置于溢出菜单中,通过操作栏右侧的菜单图标显示。

  • 将操作项替换为 widget(例如搜索框),从而创建“操作视图”。

    在菜单项的 XML 声明中,添加带有布局资源的 android:actionViewLayout 属性或带有 widget 类名称的 android:actionViewClass 属性。(您还必须声明 android:showAsAction 属性,以便该项显示在操作栏中。)如果操作栏中的空间不足,且该项显示在溢出菜单中,则其行为类似于常规菜单项,不会显示 widget。

  • 向应用徽标添加操作,并将其替换为自定义徽标

    系统会自动为应用徽标分配 android.R.id.home ID,当用户轻触该 ID 时,系统会将该 ID 传递给 activity 的 onOptionsItemSelected() 回调。只需在回调方法中响应此 ID 即可执行转到应用的“主屏幕”activity 等操作。

    如需将图标替换为徽标,请使用 android:logo 属性在清单文件中指定应用徽标,然后在 activity 中调用 setDisplayUseLogoEnabled(true)

  • 添加面包屑导航,以在 fragment 的返回堆栈中向后导航
  • 添加标签页或下拉列表以浏览 fragment
  • 使用主题和背景自定义操作栏

操作栏是所有使用新全息主题的应用的标准操作,当您将 android:minSdkVersionandroid:targetSdkVersion 设置为 "11" 时,该栏也是标准操作。

如需详细了解操作栏,请参阅操作栏文档。 API 演示版应用中还提供了一些示例。

系统剪贴板

应用现在可以将数据(不仅仅是文字)复制并粘贴到系统级剪贴板或从此类剪贴板粘贴。裁剪数据可以是纯文本、URI 或 intent。

通过为系统提供对您希望用户复制的数据的访问权限,用户可以从应用中复制复杂内容(如图片或数据结构),并将其粘贴到支持相应类型内容的其他应用中。

如需开始使用剪贴板,请调用 getSystemService(CLIPBOARD_SERVICE) 获取全局 ClipboardManager 对象。

如需将某个项复制到剪贴板,您需要创建一个新的 ClipData 对象,该对象包含一个或多个 ClipData.Item 对象,每个对象描述一个实体。如需创建仅包含一个 ClipData.ItemClipData 对象,您可以使用 newPlainText()newUri()newIntent() 等辅助方法之一,这些方法都会返回预加载了您提供的 ClipData.ItemClipData 对象。

如需将 ClipData 添加到剪贴板,请将其传递给 ClipboardManager 实例的 setPrimaryClip()

然后,您可以通过对 ClipboardManager 调用 getPrimaryClip() 从剪贴板中读取文件(以便进行粘贴)。处理您收到的 ClipData 可能很复杂,并且您需要确保在尝试粘贴剪贴板中的数据类型之前,您确实可以处理其中的数据类型。

剪贴板一次只保留一段剪辑的数据(ClipData 对象),但一个 ClipData 可以包含多个 ClipData.Item

如需了解详情,请阅读复制和粘贴文档。您还可以在 API 演示示例中查看复制和粘贴的简单实现,以及在记事本示例中查看更完整的实现。

拖放

新 API 简化了应用界面中的拖放操作。拖动操作是将 ClipData 对象中携带的某种数据从一个位置传输到另一个位置。拖动操作的起点和终点是 View,因此直接处理拖放操作的 API 位于 View 类中。

拖放操作的生命周期由多个拖动操作定义,每个拖动操作由 DragEvent 对象定义,例如 ACTION_DRAG_STARTEDACTION_DRAG_ENTEREDACTION_DROP。希望参与拖动操作的每个视图都可以监听这些操作。

如需开始拖动 activity 中的内容,请对 View 调用 startDrag(),以提供表示要拖动的数据的 ClipData 对象、一个方便用户在拖动时看到的“阴影”的 View.DragShadowBuilder,以及一个可与可能接收该对象的视图分享拖动对象相关信息的 Object

如需接受 View 中的拖动对象(接收“拖放内容”),请调用 setOnDragListener()OnDragListener 注册视图。当视图上发生拖动事件时,系统会为 OnDragListener 调用 onDrag(),它会接收说明所发生拖动操作类型的 DragEvent(例如 ACTION_DRAG_STARTEDACTION_DRAG_ENTEREDACTION_DROP)。在拖动期间,系统会反复为拖动下面的视图调用 onDrag(),以传输拖动事件流。接收视图可以通过对 DragEvent 调用 getAction() 来查询传递给 onDragEvent() 的事件类型。

注意:尽管拖动事件可能会携带 ClipData 对象,但这与系统剪贴板无关。拖放操作绝不应将拖动的数据放入系统剪贴板。

如需了解详情,请参阅拖放文档。您还可以在 API Demos 应用和 Honeycomb Gallery 应用中查看拖放实现。

应用微件

Android 3.0 支持多种新的 widget 类,可在用户主屏幕上使用更具互动性的应用 widget,包括 GridViewListViewStackViewViewFlipperAdapterViewFlipper

更重要的是,您可以使用新的 RemoteViewsService 通过由远程数据(如来自 content provider)支持的 widget(如 GridViewListViewStackView)来创建具有集合的应用 widget。

AppWidgetProviderInfo 类(在 XML 中使用 <appwidget-provider> 元素定义)还支持两个新字段:autoAdvanceViewIdpreviewImage。借助 autoAdvanceViewId 字段,您可以指定应由应用 widget 的托管方自动跳转的应用 widget 子视图的视图 ID。previewImage 字段指定预览应用 widget 的外观,以及从 widget 选择器向用户显示的内容。如果未提供此字段,应用 widget 的图标将用于预览。

为了帮助为应用 widget 创建预览图片(以便在 previewImage 字段中指定),Android 模拟器包含一个名为“Widget Preview”的应用。如需创建预览图片,请启动此应用,为您的应用选择应用 widget,并设置您期望的预览图片显示方式,然后将其保存并放置在应用的可绘制资源中。

您可以在 StackView 应用微件天气列表微件应用中查看新应用微件功能的实现。

状态栏通知

我们扩展了 Notification API,以支持更多内容的状态栏通知;另外,通过新的 Notification.Builder 类,您还可以轻松创建 Notification 对象。

新功能包括:

  • 使用 setLargeIcon() 支持在通知中使用大图标。这通常是为了社交应用显示通知来源的人的联系人照片,或让媒体应用显示影集缩略图。
  • 支持使用 setTicker() 在状态栏置顶栏中显示自定义布局。
  • 支持自定义通知布局以包含带有 PendingIntent 的按钮,以实现更具互动性的通知 widget。例如,通知可以在不启动 activity 的情况下控制音乐播放。

内容加载器

新的框架 API 支持使用 Loader 类异步加载数据。您可以将它与界面组件(如视图和 fragment)结合使用,以从工作器线程动态加载数据。CursorLoader 子类经过专门设计,可帮助您针对由 ContentProvider 提供支持的数据执行此操作。

您只需实现 LoaderCallbacks 接口,以便在收到新加载器或数据更改时接收回调,然后调用 initLoader() 为您的 activity 或 fragment 初始化该加载器。

如需了解详情,请阅读加载器文档。您还可以在 LoaderCursor LoaderThrottle 示例中查看使用加载器的示例代码。

蓝牙 A2DP 和耳机 API

Android 现在包含一些 API,供应用验证已连接的蓝牙 A2DP 和耳机配置文件设备的状态。例如,应用可以识别何时连接蓝牙耳机来听音乐,并在适当的情况下通知用户。应用还可以接收供应商特定 AT 命令的广播,并向用户通知已连接设备的状态,例如所连接设备的电池电量不足时。

您可以使用 A2DPHEADSET 配置文件常量和 BluetoothProfile.ServiceListener 调用 getProfileProxy(),以在蓝牙客户端连接或断开连接时接收回调,从而初始化相应的 BluetoothProfile

动画框架

借助全新的灵活动画框架,您可以为任何对象(View、Drawable、Fragment、Object 或任何其他对象)的任意属性添加动画效果。它允许您定义动画的多个方面,例如:

  • 时长
  • 重复次数和行为
  • 插值类型
  • Animator 可设置为同时播放动画、按顺序播放或在指定的延迟后播放动画
  • 帧刷新延迟

默认情况下,您可以为对象的 int、浮点数和十六进制颜色值定义这些动画切面和其他设置。也就是说,当某个对象具有其中一种类型的属性字段时,您可以随着时间的推移更改其值来影响动画。若要为任何其他类型的值添加动画效果,您可以通过实现 TypeEvaluator 接口来告知系统如何计算给定类型的值。

您可以使用以下两个 Animator 为属性的值添加动画效果:ValueAnimatorObjectAnimatorValueAnimator 会计算动画值,但不知道因此而添加了动画效果的特定对象或属性。它只是执行计算,您必须监听更新并使用自己的逻辑处理数据。ObjectAnimatorValueAnimator 的子类,可用于设置对象和属性以添加动画效果,并处理所有动画工作。也就是说,为 ObjectAnimator 指定要添加动画效果的对象、随时间变化的对象属性,以及随时间推移应用于该属性的一组值,然后启动动画。

此外,LayoutTransition 类还会为您对 activity 布局所做的更改启用自动过渡动画。如需为部分布局启用过渡,请创建一个 LayoutTransition 对象,并通过调用 setLayoutTransition() 在任意 ViewGroup 上设置该对象。这样,每当向该组中添加内容或从中移除内容时,默认动画都会运行。如需指定自定义动画,请对 LayoutTransition 调用 setAnimator() 并提供自定义 Animator,例如上面讨论的 ValueAnimatorObjectAnimator

如需了解详情,请参阅属性动画文档。您还可以在 API 演示应用中查看多个使用动画 API 的示例。

扩展界面框架

  • ListView 和 GridView 的多选选择

    setChoiceMode() 的新 CHOICE_MODE_MULTIPLE_MODAL 模式允许用户从 ListViewGridView 中选择多个项。当与操作栏结合使用时,用户可以选择多项内容,然后从操作栏(已转换为多选操作模式)中的选项列表中选择要执行的操作。

    如需启用单选题,请调用 setChoiceMode(CHOICE_MODE_MULTIPLE_MODAL) 并向 setMultiChoiceModeListener() 注册一个 MultiChoiceModeListener

    当用户长按某项时,操作栏会切换到多选操作模式。当有项被选中时,系统会通过调用 onItemCheckedStateChanged() 来通知 MultiChoiceModeListener

    如需查看单选题的示例,请参阅 API Demos 示例应用中的 List15.java 类。

  • 用于转换视图的新 API

    借助新的 API,您可以轻松地将 2D 和 3D 转换应用于 activity 布局中的视图。您可以使用一组对象属性(用于定义视图的布局位置、方向、透明度等)实现新的转换。

    用于设置视图属性的新方法包括:setAlpha()setBottom()setLeft()setRight()setBottom()setPivotX()setPivotY()setRotationX()setRotationY()setScaleX()setScaleY()setAlpha() 等。

    某些方法还有对应的 XML 属性,您可以在布局文件中指定该属性以应用默认转换。可用属性包括:translationXtranslationYrotationrotationXrotationYscaleXscaleYtransformPivotXtransformPivotYalpha

    通过将其中一些新的视图属性与新的动画框架(如上文所述)结合使用,您可以轻松地将一些精美的动画应用于您的视图。例如,如需在 y 轴上旋转视图,请为 ObjectAnimator 提供 View、“rotationY”属性以及起始值和结束值:

    Kotlin

    ObjectAnimator.ofFloat(myView, "rotationY", 0f, 360f).apply {
        duration = 2000
        start()
    }
    

    Java

    ObjectAnimator animator = ObjectAnimator.ofFloat(myView, "rotationY", 0, 360);
    animator.setDuration(2000);
    animator.start();
    
  • 新的全息主题

    标准系统 widget 和整体外观已经过重新设计,并采用了新的“全息”界面主题。系统使用标准的样式和主题系统来应用新主题。

    默认情况下,任何以 Android 3.0 平台为目标平台的应用(通过将 android:minSdkVersionandroid:targetSdkVersion 值设置为 "11")都会继承全息主题。不过,如果您的应用也应用自己的主题,那么您的主题将替换全息主题,除非您更新样式以继承全息主题。

    如需将全息主题应用于各个 activity,或在您自己的主题定义中继承它们,请使用若干新的 Theme.Holo 主题之一。如果您的应用与 Android 3.0 之前的版本兼容并应用自定义主题,则应根据平台版本选择主题

  • 新的微件
    • AdapterViewAnimator

      在其视图之间切换时执行动画的 AdapterView 的基类。

    • AdapterViewFlipper

      简单的 ViewAnimator,在添加到它的两个或多个视图之间添加动画效果。一次只能显示一个孩子。如果收到请求,它可以按固定间隔自动在每个子项之间进行切换。

    • CalendarView

      允许用户通过轻触日期从日历中选择日期,并且可以将日历滚动或滑动到所需的日期。您可以在微件中配置可用的日期范围。

    • ListPopupWindow

      将自身锚定到宿主视图,并显示选项列表,例如在 EditText 视图中输入内容时获取建议列表。

    • NumberPicker

      允许用户从预定义的范围中选择一个数字。该 widget 呈现一个输入字段以及用于选择数字的向上和向下按钮。触摸输入字段可让用户滚动浏览值或再次触摸以直接修改当前值。此外,它还可以将位置映射到字符串,以便显示相应的字符串而不是索引位置。

    • PopupMenu

      在锚定到视图的模态弹出式窗口中显示 Menu。如果存在空间,则弹出式窗口将显示在锚点视图下方;如果没有空间,则弹出窗口会显示在锚点视图上方。如果 IME(软键盘)可见,则在用户轻触菜单之前,弹出式窗口不会与其 IME 重叠。

    • SearchView

      提供一个搜索框,您可以对其进行配置,以将搜索查询传递给指定 activity 并显示搜索建议(与传统搜索对话框相同)。此 widget 特别适用于在操作栏中提供搜索 widget。如需了解详情,请参阅创建搜索界面

    • StackView

      一种视图,在 3D 堆栈中显示其子项,并允许用户像 rolodex 一样滑动浏览视图。

图形

  • 硬件加速 2D 图形

    现在,您可以通过在清单元素的 <application> 元素中或为各个 <activity> 元素中设置 android:hardwareAccelerated="true",为您的应用启用 OpenGL 渲染程序。

    此标志可以让应用更快地绘制。这会带来更流畅的动画和更顺畅的滚动体验,进而提升整体性能和用户互动响应。

  • 查看对硬件和软件层的支持

    默认情况下,View 未指定图层。您可以使用 setLayerType()layerType 属性指定由硬件层或软件层(由值 LAYER_TYPE_HARDWARELAYER_TYPE_SOFTWARE 指定)支持视图。

    硬件层由硬件专用纹理(通常是 OpenGL 硬件上的帧缓冲区对象或 FBO)提供支持,并会导致视图使用 Android 的硬件渲染管道进行渲染,但前提是必须为视图层次结构开启硬件加速。关闭硬件加速后,硬件层的行为将与软件层完全相同。

    软件层由位图提供支持,并且会导致使用 Android 的软件渲染管道渲染视图,即使启用了硬件加速也是如此。如果受影响的视图树经常更新,则应避免使用软件层。每次更新都需要重新渲染软件层,速度可能很慢。

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

  • RenderScript 3D 图形引擎

    Renderscript 是一个运行时 3D 框架,提供用于构建 3D 场景的 API 以及一种独立于平台的特殊着色器语言,以实现最佳性能。借助 Renderscript,您可以加快图形操作和数据处理。Renderscript 是为应用、壁纸、轮播界面等打造高性能 3D 效果的理想方式。

    如需了解详情,请参阅使用 Renderscript 进行 3D 渲染和计算文档。

媒体

  • “延时摄影”视频

    Camcorder API 现在支持录制延时摄影视频。setCaptureRate() 用于设置应捕获帧的速率。

  • 为图片流提供的纹理支持

    新的 SurfaceTexture 可让您将图像流作为 OpenGL ES 纹理捕获。通过为 Camera 实例调用 setPreviewTexture(),您可以指定从相机绘制视频播放或预览帧的 SurfaceTexture

  • HTTP 直播

    应用现在可以将 M3U 播放列表网址传递给媒体框架,以开始 HTTP 直播会话。媒体框架支持大多数 HTTP Live Streaming 规范,包括自适应比特率。如需了解详情,请参阅支持的媒体格式文档。

  • EXIF 数据

    ExifInterface 包含照片光圈、ISO 和曝光时间的新字段。

  • 摄像机配置文件

    借助新的 hasProfile() 方法和多个视频画质配置文件(如 QUALITY_1080PQUALITY_720PQUALITY_CIF 等),您可以确定便携式摄像机画质选项。

  • 数字媒体文件传输

    该平台内置了对 USB 媒体/图片传输协议 (MTP/PTP) 的支持,可让用户轻松地在设备之间以及将任何类型的媒体文件传输到主机上。开发者可以在此支持的基础上构建出应用,让用户可以创建或管理可能需要跨设备传输或共享的富媒体文件。

  • 数字版权管理 (DRM)

    用于检查和行使数字权利的新可扩展数字版权管理 (DRM) 框架。它在以下两个架构层中实现:

    • DRM Framework API:向应用公开,并通过适用于标准应用的 Dalvik VM 运行。
    • 原生代码 DRM 管理器:实现框架 API,并为 DRM 插件提供接口,以便处理各种 DRM 方案的版权管理和解密操作。

    对于应用开发者来说,该框架提供了一个抽象的统一 API,可简化对受保护内容的管理。该 API 隐藏了 DRM 操作的复杂性,并为受保护和不受保护的内容以及各种 DRM 方案提供了一致的操作模式。

    对于设备制造商、内容所有者和互联网数字媒体提供商,DRM 框架的插件 API 提供了一种方法,可将对所选 DRM 方案的支持添加到 Android 系统,从而安全地强制执行内容保护。

    预览版不提供任何用于检查和强制执行数字权利的原生 DRM 插件。不过,设备制造商可能会在其设备上随附 DRM 插件。

    您可以在 android.drm 软件包中找到所有 DRM API。

键盘支持

  • 支持 Ctrl、Meta、Caps Lock、Num Lock 和 Scroll Lock 辅助键。如需了解详情,请参阅 META_CTRL_ON 和相关字段。
  • 支持完整的桌面式键盘,包括支持 Esc、Home、End、Delete 等键。如需确定按键事件是否来自全键盘,您可以查询 getKeyboardType() 并检查是否存在 KeyCharacterMap.FULL
  • TextView 现在支持基于键盘的剪切、复制、粘贴和全选(使用组合键 Ctrl+X、Ctrl+C、Control+V 和 Control+A)。它还支持 PageUp/PageDown、Home/End 以及基于键盘的文本选择。
  • KeyEvent 添加了几种新方法,以便更轻松地以正确、一致的方式检查按键修饰符状态。请参阅 hasModifiers(int)hasNoModifiers()metaStateHasModifiers()metaStateHasNoModifiers()
  • 应用可以通过创建 ActivityDialogView 的子类并实现 onKeyShortcut() 来实现自定义键盘快捷键。每当某个键与 Ctrl 键组合在一起时,框架都会调用此方法。创建选项菜单时,您可以通过为每个 <item> 元素(或使用 setShortcut())设置 android:alphabeticShortcutandroid:numericShortcut 属性来注册键盘快捷键。
  • Android 3.0 包含一款新的“虚拟键盘”设备,其 ID 为 KeyCharacterMap.VIRTUAL_KEYBOARD。虚拟键盘具有桌面设备样式的 US 按键映射,可用于合成用于测试输入的按键事件。

拆分触摸事件

以前,一次只能有一个视图接受触摸事件。Android 3.0 支持跨视图甚至窗口拆分触摸事件,因此不同视图可以接受并发触摸事件。

如果应用以 Android 3.0 为目标平台,则默认情况下会启用拆分触摸事件。也就是说,当应用将 android:minSdkVersionandroid:targetSdkVersion 属性的值设置为 "11" 时。

不过,您可以通过以下属性在特定视图组内的视图和窗口之间停用拆分触摸事件。

  • 借助视图组的 android:splitMotionEvents 属性,您可以停用在布局的子视图之间发生的拆分触摸事件。例如:
    <LinearLayout android:splitMotionEvents="false" ... >
        ...
    </LinearLayout>
    

    这样,线性布局中的子视图就无法拆分触摸事件,即一次只能有一个视图接收触摸事件。

  • 借助 android:windowEnableSplitTouch 样式属性,您可以通过将其应用于 activity 或整个应用的主题来停用跨窗口的分屏触摸事件。例如:
    <style name="NoSplitMotionEvents" parent="android:Theme.Holo">
        <item name="android:windowEnableSplitTouch">false</item>
        ...
    </style>
    

    将此主题应用于 <activity><application> 时,系统仅接受当前 activity 窗口中的轻触事件。例如,通过停用跨窗口分屏触摸事件,系统栏无法与 activity 同时接收触摸事件。这并不影响 activity 内的视图是否可以拆分触摸事件;默认情况下,activity 仍然可以跨视图拆分触摸事件。

    如需详细了解如何创建主题,请参阅应用样式和主题

WebKit

  • 新增了 WebViewFragment 类,用于创建由 WebView 组成的 fragment。
  • 新增了 WebSettings 方法:
  • 新增了 WebView 方法:
    • onPause() 回调,用于在 WebView 变为隐藏状态时暂停与 WebView 相关联的任何处理。当 WebView 未位于前台时,这有助于减少不必要的 CPU 或网络流量。
    • onResume() 回调,用于继续与 WebView 相关联的处理(在 onPause() 期间暂停)。
    • saveWebArchive() 可用于将当前视图在设备上另存为网页归档。
    • showFindDialog() 用于在当前视图中启动文本搜索。

浏览器

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

  • 媒体捕获

    HTML 媒体捕获规范中所定义,浏览器允许 Web 应用访问设备的音频、图片和视频拍摄功能。例如,以下 HTML 为用户提供了用于捕获要上传的照片的输入:

    <input type="file" accept="image/*;capture=camera" />
    

    或者,通过排除 capture=camera 参数,用户可以选择使用相机拍摄新图片,或从设备中选择一张图片(例如从图库应用中)。

  • 设备方向

    根据设备屏幕方向事件规范的定义,浏览器允许 Web 应用监听提供与设备物理屏幕方向和运动相关的信息的 DOM 事件。

    设备方向由 x 轴、y 轴和 z 轴表示(以度为单位),而运动则通过加速度和旋转速率数据表示。网页可以通过调用事件类型为 "deviceorientation"window.addEventListener 来注册屏幕方向事件,也可以通过注册 "devicemotion" 事件类型来注册动作事件。

  • CSS 3D 转换

    CSS 3D 转换模块规范中所定义,浏览器允许在三维空间内对由 CSS 渲染的元素进行转换。

JSON 实用程序

新类 JsonReaderJsonWriter 可帮助您读取和写入 JSON 流。新 API 是对 org.json 类(用于操作内存中的文档)的补充。

您可以调用 JsonReader 的构造函数方法并传递用于提供 JSON 字符串的 InputStreamReader,从而创建该实例。然后,通过调用 beginObject() 开始读取对象,使用 nextName() 读取键名,使用与类型相关的方法(例如 nextString()nextInt())读取该值,并在 hasNext() 为 true 时继续执行此操作。

您可以通过调用其构造函数并传递相应的 OutputStreamWriter 来创建 JsonWriter 的实例。然后,使用与读取器类似的方式写入 JSON 数据,即使用 name() 添加属性名称,使用适当的 value() 方法添加相应的值。

默认情况下,这些类是严格的。每个类中的 setLenient() 方法都会对它们进行配置,使其在接受方面更加自由。这种宽松解析模式还与 org.json 的默认解析器兼容。

新功能常量

<uses-feature> Manfest 元素应用于向外部实体(例如 Google Play)告知应用所依赖的一组硬件和软件功能。在此版本中,Android 添加了以下新常量,应用可使用此元素声明这些常量:

  • "android.hardware.faketouch"

    声明后,这表示应用与提供模拟触摸屏(或更好的触摸屏)的设备兼容。配有模拟触摸屏的设备会为用户提供可以模拟部分触摸屏功能的用户输入系统。例如,驱动屏幕光标的鼠标或遥控器就属于此类输入系统。此类输入系统支持基本触摸事件,如点击、点击和拖动。不过,在模拟触摸设备上,更复杂的输入类型(例如手势、快速滑动等)可能更加困难或不可能(多点触控手势绝对不可能)。

    如果您的应用不需要复杂的手势,并且您也不想从具有模拟触摸屏的设备中滤除自己的应用,则应使用 <uses-feature> 元素声明 "android.hardware.faketouch"。这样一来,您的应用就可以供尽可能多的设备类型使用,包括只提供模拟触摸屏输入的设备类型。

    所有包含触摸屏的设备也都支持 "android.hardware.faketouch",因为触摸屏功能是模拟触摸功能的超集。因此,除非您确实需要触摸屏,否则应添加 <uses-feature> 元素用于模拟触摸。

新权限

新平台技术

  • 存储空间
    • 支持 ext4 文件系统,以便启用板载 eMMC 存储设备。
    • 用于支持 MTP 设备的 FUSE 文件系统。
    • 支持 USB 主机模式,从而支持键盘和 USB 集线器。
    • 支持 MTP/PTP
  • Linux 内核
    • 已升级到 2.6.36
  • Dalvik 虚拟机
    • 用于支持和优化 SMP 的新代码
    • 对 JIT 基础架构进行了多项改进
    • 垃圾回收器改进:
      • 针对 SMP 进行调谐
      • 支持更大的堆大小
      • 统一处理位图和字节缓冲区
  • Dalvik 核心库
    • 速度更快的全新 NIO(现代 I/O 库)实现
    • 改进了异常消息
    • 全程更正正确性和性能

API 差异报告

如需详细了解 Android 3.0(API 级别 11)中的所有 API 变更,请参阅 API 差异报告

API 级别

Android 3.0 平台提供了更新版本的框架 API。Android 3.0 API 被分配一个整数标识符 11,该标识符存储在系统本身中。此标识符称为“API 级别”,可让系统在安装应用之前正确确定应用是否与系统兼容。

若要在您的应用中使用 Android 3.0 中引入的 API,您需要根据 Android 3.0 SDK 平台中提供的 Android 库编译应用。您可能还需要向应用清单中的 <uses-sdk> 元素中添加一个 android:minSdkVersion="11" 属性,具体取决于您的需求。如果您的应用设计为仅在 Android 2.3 及更高版本上运行,则声明该属性会阻止应用安装在较低版本的平台上。

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