Android 4.1 API

API 级别:16

Android 4.1 (JELLY_BEAN) 是平台的进步,能够提供 性能和增强的用户体验。为用户和应用增添新功能 开发者。本文档介绍了 Google Cloud 中 为应用开发者提供实用的新 API

作为应用开发者,您可以从 SDK Manager 作为系统映像, 在 Android 模拟器和 SDK 平台(您可以基于其构建应用)中运行。您应该 尽快下载系统映像和平台,以便构建和测试 应用。

为了更好地针对搭载 Android 4.1 的设备优化您的应用, 您应将 targetSdkVersion 设置为 "16",将其安装在 Android 4.1 系统映像上; 然后发布包含此更改的更新

您 可以使用 Android 4.1 中的 API,同时通过添加 条件,在执行之前检查系统 API 级别 您的minSdkVersion不支持的 API。 要详细了解 保持向后兼容性,请阅读创建向后兼容的 界面

如需详细了解 API 级别的工作原理,请参阅什么是 API 水平?

应用组件

隔离的服务

通过在android:isolatedProcess="true" <service> 标记下运行,您的 Service 将在该标记下运行 独立用户 ID 进程,该进程自身没有权限。

内存管理

新的 ComponentCallbacks2 常量(例如 TRIM_MEMORY_RUNNING_LOWTRIM_MEMORY_RUNNING_CRITICAL)提供前台 会处理更多 在系统调用 onLowMemory() 之前的内存状态。

新的 getMyMemoryState(ActivityManager.RunningAppProcessInfo) 方法允许您 检索一般内存状态。

content provider

新方法 acquireUnstableContentProviderClient() 允许您访问可能“不稳定”的 ContentProviderClient确保应用在发生以下情况时不会崩溃: content provider 的方式。当您在独立的 应用。

动态壁纸

新增用于直接启动动态壁纸预览 activity 的 intent 协议,以便您提供帮助 用户可以轻松选择您的动态壁纸,而不强制他们退出 并在主屏幕壁纸选择器中导航。

如需启动动态壁纸选择器,请使用以下代码使用 Intent 调用 startActivity()ACTION_CHANGE_LIVE_WALLPAPER 和 extra ,用于在 EXTRA_LIVE_WALLPAPER_COMPONENT 中以字符串形式指定动态壁纸 ComponentName

应用堆栈导航

Android 4.1 大大简化了向上导航实现适当的设计模式。 您只需将 android:parentActivityName 添加到以下位置中的每个 <activity> 元素: 您的清单文件当用户使用这些信息时,系统会 按下操作栏中的“向上”按钮(同时结束当前活动)。如果您 为每个 activity 声明 android:parentActivityName,无需使用 onOptionsItemSelected() 方法处理点击 事件 - 系统现在会处理该事件,并恢复或 创建相应的 activity。

这在用户进入应用的某个 activity 的场景中尤为强大 “深入了解”intent(例如来自通知或来自 (如在应用之间导航设计指南中所述)。时间 当用户以这种方式进入您的 activity 时,您的应用可能自然不会有返回堆栈, 这些 activity 在用户向上导航时可以恢复。不过,如果您为 activity 提供 android:parentActivityName 属性,系统会识别出 您的应用是否已包含父 activity 的返回堆栈;如果不包含,则会构建 包含所有父 activity 的合成返回堆栈。

注意:当用户进入应用中的深层 activity 时,并且 为应用创建新任务时,系统实际上会插入父 activity 的堆栈 传递到任务中。因此,按返回按钮也会在父级堆栈中返回导航 活动。

当系统为您的应用创建合成返回堆栈时,会构建一个基本的 Intent 来为每个父 activity 创建一个新实例。因此,用户无需 父 activity 的已保存状态,其方式与用户自然导航的方式相同 至 。如果任何父 activity 正常显示依赖于 用户的上下文时,该上下文信息就会缺失,您应在调用 用户 会在堆栈中返回例如,如果用户正在查看某个影集 在音乐应用中,向上导航可能会进入一个 activity,其中列出了选定曲目中的所有专辑 音乐流派。在这种情况下,如果必须创建堆栈,则必须通知父级 activity 当前专辑属于哪种流派,以便父方可以将相应的列表显示为 如果用户确实来自该活动为了向合成父级传递此类信息 activity,则必须替换 onPrepareNavigateUpTaskStack() 方法。这个 可为您提供系统创建的 TaskStackBuilder 对象,以便 合成父 activity。TaskStackBuilder 包含系统用于创建每个父 activity 的 Intent 对象。在 onPrepareNavigateUpTaskStack() 的实现,则可以修改相应的 Intent 以 添加父 activity 可用来确定适当的上下文并显示的额外数据 适当的界面

当系统创建 TaskStackBuilder 时,会添加 Intent 对象,这些对象用于创建其逻辑 activity 中的父 activity 从 activity 树顶部开始。因此,最后添加到内部数组的 Intent 是当前 activity 的直接父项。如果 如果您要修改 activity 父级的 Intent,请先确定 具有 getIntentCount() 的数组的长度,并传递该长度 值设为 editIntentAt()

如果您的应用结构较为复杂,您还可以使用一些其他 API 可让您处理向上导航和 全面自定义合成返回堆栈。其中一些 API 可为您提供额外的 对照组包括:

onNavigateUp()
替换此项以在用户按向上按钮时执行自定义操作。
navigateUpTo(Intent)
调用此方法可结束当前 activity,并转到 提供的是 Intent。如果该 activity 存在于返回堆栈中,但 不是最近的父项,那么当前 activity 与 intent 指定的 activity 也会结束。
getParentActivityIntent()
调用此参数可获取将启动逻辑进程的 Intent 当前 activity 的父 activity。
shouldUpRecreateTask(Intent)
调用此方法可查询是否必须创建合成返回堆栈才能进行导航 。如果必须创建合成堆栈,则返回 true;如果适当的堆栈,则返回 false 已存在。
finishAffinity()
调用此参数可结束当前 activity 以及所有具有相同父 activity 的父 activity 任务亲和性。 如果您替换默认行为(例如 onNavigateUp() 时,应在以下情况下调用此方法: 在向上导航时创建合成返回堆栈。
onCreateNavigateUpTaskStack
如果您需要完全控制合成任务堆栈的创建方式,请替换此设置。如果您只想向返回堆栈的 intent 添加一些额外的数据,则应改为替换 onPrepareNavigateUpTaskStack()

不过,大多数应用不需要使用这些 API 或实现 onPrepareNavigateUpTaskStack(),但只需通过 向每个 <activity> 元素添加 android:parentActivityName

多媒体

媒体编解码器

MediaCodec 类提供对低级别媒体编解码器的访问权限,以便进行编码 和解码媒体。您可以通过调用 createEncoderByType() 对媒体进行编码,或调用 createDecoderByType() 解码媒体,从而实例化 MediaCodec。以上每一个 方法接受您要编码或解码的媒体类型的 MIME 类型,例如 "video/3gpp""audio/vorbis"

创建 MediaCodec 的实例后,您可以调用 configure() 来指定媒体格式或 内容是否经过加密。

无论您是对媒体进行编码还是解码,完成媒体设置后,其余过程 创建 MediaCodec。首先调用 getInputBuffers() 以获取输入 ByteBuffer 的数组 对象和 getOutputBuffers() 以获取输出 ByteBuffer 对象的数组。

准备好编码或解码后,请调用 dequeueInputBuffer() 以获取 ByteBuffer(从输入缓冲区数组)的索引位置,您应该使用该索引位置馈送源数据 媒体。在ByteBuffer中填写源媒体后,撤消所有权 缓冲区空间(通过调用 queueInputBuffer())。

同样,对于输出缓冲区,调用 dequeueOutputBuffer() 以获取 ByteBuffer 的索引位置 您将在其中收到结果。读取 ByteBuffer 的输出后, 通过调用 releaseOutputBuffer() 释放所有权。

您可以结合调用 queueSecureInputBuffer()MediaCrypto API,而不是普通的 queueInputBuffer()

如需详细了解如何使用编解码器,请参阅 MediaCodec 文档。

插入提示时录制音频

新方法 startRecording() 允许 您根据 MediaSyncEvent 定义的提示开始录音。 MediaSyncEvent 指定音频会话 (例如由 MediaPlayer 定义的事件),完成后, 录音机开始录音。例如,您可以使用此功能 播放指示录音时段开始的音频提示音 因此您不必手动同步音调和开头

定时文本轨道

MediaPlayer 现在会处理带内文本轨道和带外文本轨道。 带内文本轨道是 MP4 或 3GPP 媒体源中的文本轨道。带外文本 可以通过 addTimedTextSource() 方法将轨道添加为外部文本源。在所有外部文字后面 跟踪来源已添加,应调用 getTrackInfo() 以获取 数据源中所有可用轨道的刷新列表。

如需设置与 MediaPlayer 搭配使用的轨道,您必须 使用索引调用 selectTrack() 指定要使用的曲目。

如需在文本轨道可以播放时收到通知,请实现 MediaPlayer.OnTimedTextListener 接口,并传递 将其设为 setOnTimedTextListener()

音效

AudioEffect 类现在支持额外的音频 预处理类型:

  • 支持AcousticEchoCanceler的回声消除器 (AEC) 从捕获的音频信号中移除远程方接收到的信号。
  • 使用 AutomaticGainControl 的自动增益控制 (AGC) 自动对捕获的信号的输出进行归一化处理。
  • 噪声抑制器 (NS),搭配 NoiseSuppressor 从捕获的信号中移除背景噪声。

您可以使用以下任一 AudioEffect 对使用 AudioRecord 拍摄的音频应用这些预处理器效果: 子类。

注意:我们无法保证所有设备都支持 影响,因此您始终应首先通过对相应模板调用 isAvailable() 来检查可用性 音频效果类。

无间断播放

您现在可以在两个单独的 MediaPlayer 对象。在前 MediaPlayer 项完成之前,随时都可以 调用 setNextMediaPlayer() 和 Android 系统会在第一个玩家停止时尝试开始第二个玩家。

媒体路由器。新 API MediaRouter、MediaRouteActionProvider 和 MediaRouteButton 提供 用于选择媒体播放位置的标准机制和界面。

相机

自动对焦移动

使用新接口 Camera.AutoFocusMoveCallback,您可以监听 用于更改自动对焦移动。您可以向 setAutoFocusMoveCallback() 注册接口。然后,当相机 处于连续自动对焦模式(FOCUS_MODE_CONTINUOUS_VIDEOFOCUS_MODE_CONTINUOUS_PICTURE),您便会接到电话 发送至onAutoFocusMoving(), ,告知您自动对焦是开始移动还是停止移动。

相机提示音

MediaActionSound 类提供了一组简单的 API 来生成 相机发出的标准声音或其他媒体操作发出的声音。您应使用这些 API 来 确定合适的声音。

如需播放声音,只需实例化 MediaActionSound 对象,然后调用 load() 来预加载所需的声音,然后在 在合适的时间致电 play()

连接

Android Beam

Android BeamTM 现在支持通过蓝牙传输大型有效负载。定义数据时 改用新的 setBeamPushUris() 方法或新的回调接口 NfcAdapter.CreateBeamUrisCallback,Android 无需将数据传输到蓝牙或其他 实现更快的传输速度这对于大型载荷(如图片和 音频文件,并且无需设备间可见的配对。您无需执行任何额外操作 以便利用蓝牙传输的优势。

setBeamPushUris() 方法接受一个 Uri 对象,用于指定要从应用中传输的数据。 或者,您也可以实现 NfcAdapter.CreateBeamUrisCallback 接口,您可以通过调用 setBeamPushUrisCallback() 为 activity 指定该接口。

使用 回调接口,系统会在出现以下情况时调用该接口的 createBeamUris() 方法: 用户使用 Android Beam 执行分享,以便您在分享时定义要分享的 URI。 要共享的 URI 可能因 activity,而调用 setBeamPushUris() 则是 在要共享的 URI 不变的情况下非常有用,您可以安全地提前定义它们。

网络服务发现

Android 4.1 增加了对基于多播 DNS 的服务发现的支持,让您能够 通过 WLAN 查找并连接到对等设备提供的服务,例如移动设备、 打印机、照相机、媒体播放器和其他已在本地网络上注册的打印机。

新软件包 android.net.nsd 包含一些新 API, 在本地网络上广播您的服务,发现网络中的本地设备,以及 连接到设备。

如需注册服务,您必须先创建一个 NsdServiceInfo 对象并定义服务的各种属性,如 setServiceName(), setServiceType()setPort()

然后,您需要实现 NsdManager.RegistrationListener 并将其传递给 registerService()。 与您的NsdServiceInfo相关联。

如需发现网络上的服务,请实现 NsdManager.DiscoveryListener 并将其传递给 discoverServices()

您的 NsdManager.DiscoveryListener 收到有关服务的回调时 您需要通过调用 resolveService(),向其传递一个 NsdManager.ResolveListener 的实现,它会接收 一个 NsdServiceInfo 对象,该对象包含有关 服务,从而允许您发起连接。

WLAN 点对点服务发现

Wi-Fi P2P API 在 Android 4.1 中得到增强,以支持 WifiP2pManager。这让您可以发现并过滤附近的地点 通过 Wi-Fi P2P 连接到同一家设备,而网络服务 利用发现功能,您可以发现现有已连接网络(例如本地 Wi-Fi)中的服务 广告网络)。

通过 Wi-Fi 将您的应用作为一项服务广播,以便其他设备可以发现 您的应用并连接到该应用,然后使用以下代码调用 addLocalService()WifiP2pServiceInfo 对象,用于描述您的应用服务。

要通过 Wi-Fi 发现附近的设备,您需要先决定是否要 使用 Bonjour 或 Upnp 进行交流。如需使用 Bonjour,请先使用以下代码设置一些回调监听器 setDnsSdResponseListeners(),接受 WifiP2pManager.DnsSdServiceResponseListenerWifiP2pManager.DnsSdTxtRecordListener。要使用 Upnp,请调用 setUpnpServiceResponseListener(),它接受 WifiP2pManager.UpnpServiceResponseListener

你还需要先调用 addServiceRequest(),然后才能开始在本地设备上发现服务。当您传递给此方法的 WifiP2pManager.ActionListener 收到 回调成功后,即可通过调用 discoverServices() 开始在本地设备上发现服务。

发现本地服务时,您会收到对 WifiP2pManager.DnsSdServiceResponseListenerWifiP2pManager.UpnpServiceResponseListener 的回调,具体取决于您是否 注册使用 Bonjour 或 Upnp。无论是哪种情况,收到的回调都包含 表示对等设备的 WifiP2pDevice 对象。

网络用量

通过新方法 isActiveNetworkMetered(),您可以 检查设备当前是否连接到按流量计费的网络。通过选中此状态 在执行密集型网络事务之前,您可以帮助管理流量消耗, 决定是立即执行交易还是稍后执行交易(例如, 设备会连接到 Wi-Fi)。

无障碍

无障碍服务 API

在 Android 4.1 中,无障碍服务 API 的覆盖范围已得到显著提升。现在 让您可以构建监控和响应更多输入事件(例如复杂手势)的服务, 使用onGesture()和其他 通过向 AccessibilityEventAccessibilityNodeInfoAccessibilityRecord 类添加内容来传递输入事件。

无障碍服务还可以代表用户执行操作,包括点击、 使用 performActionsetMovementGranularities 滚动和单步浏览文本。performGlobalAction() 方法 还允许服务执行返回、主屏幕和打开“最近用过”等操作 应用和通知。

可自定义的应用导航

构建 Android 应用时,您现在可以通过查找可聚焦对象来自定义导航架构 元素和输入 widget,并使用 findFocus()focusSearch(),并设置焦点 使用 setAccessibilityFocused()

更多无障碍微件

通过新的 android.view.accessibility.AccessibilityNodeProvider 类,您可以 向无障碍服务呈现复杂的自定义视图, 访问方式更便捷android.view.accessibility.AccessibilityNodeProvider允许用户 具有高级内容(例如日历网格)的微件,可为 完全独立于微件布局结构的无障碍服务。这种语义 结构允许无障碍服务为 视力受损人士。

复制和粘贴

使用 intent 复制和粘贴

您现在可以使用 setClipData() 方法将 ClipData 对象与 Intent 相关联。 在使用 intent 将多个 content: URI 转移到另一个 URI 时,这尤其有用 例如在共享多个文档时。提供的 content: URI 这样也会遵循 intent 的标志提供读取或写入权限,让您可以授予 在 intent 中访问多个 URI。启动 ACTION_SENDACTION_SEND_MULTIPLE intent 时,intent 中提供的 URI 现在是 它会自动传播到 ClipData,以便接收器可以 被授予的访问权限。

支持 HTML 和字符串样式

ClipData 类现在支持带样式的文本(作为 HTML 或 Android 风格 字符串)。您可以使用 newHtmlText()ClipData 添加 HTML 样式的文本。

Renderscript

Renderscript 计算功能得到了增强,具体如下:

  • 支持在一个脚本中使用多个内核。
  • 在新脚本 API 中,支持使用已过滤的采样器从分配中读取数据 rsSample
  • #pragma 中支持不同级别的 FP 精度。
  • 支持使用计算脚本从 RS 对象查询其他信息。
  • 实现了多项性能提升。

您还可以使用新的 pragma 来定义 计算 Renderscript。这样,您就可以启用诸如快速矢量数学运算等 NEON 运算 CPU 路径上的资源,这是使用完整的 IEEE 754-2008 标准无法实现的。

注意:实验性的 Renderscript 图形引擎现已 已弃用。

动画

activity 启动动画

现在,您可以启动Activity使用缩放动画或 自定义动画效果如需指定所需的动画,请使用 ActivityOptions API 构建 Bundle, 然后传递给 启动 activity 的方法,例如 startActivity()

ActivityOptions 类针对每种类型包含不同的方法 您可能希望在 Activity 打开时显示的动画类型:

makeScaleUpAnimation()
创建一个动画,从指定的开始位置开始放大 activity 窗口 和指定的起始尺寸。例如,Google 地图中的主屏幕 Android 4.1 会在打开应用时使用此 ID。
makeThumbnailScaleUpAnimation()
创建一个动画,从指定的元素开始,将 activity 窗口放大。 位置和提供的缩略图。例如,“最近用过的应用”窗口 Android 4.1 会在返回应用时使用它。
makeCustomAnimation()
创建用您自己的资源定义的动画:定义以下对象的动画: 另一个 activity 打开的 activity 和已停止的 activity 对应的另一个 activity。

时间动画师

新的 TimeAnimator 提供了一个简单的回调 具有 TimeAnimator.TimeListener 的机制,它会通知 在动画的每一帧上都显示此 Animator 没有任何时长、插值或对象值设置。监听器的回调会接收每个帧的信息,包括 自上一个动画帧以来已播放的总时间及已播放时长。

界面

通知

在 Android 4.1 中,您可以创建具有更大内容区域、大图片预览、 多个操作按钮和可配置的优先级。

通知样式

新方法 setStyle() 允许您指定 为通知提供三种新样式之一,每种样式都提供更大的内容区域。接收者 指定大型内容区域的样式,并传递以下对象之一:setStyle()

Notification.BigPictureStyle
适用于包含大图片附件的通知。
Notification.BigTextStyle
适用于包含大量文字(例如一封电子邮件)的通知。
Notification.InboxStyle
适用于包含字符串列表(例如多封电子邮件中的摘要)的通知。
通知操作

现在最多可支持两个操作按钮显示在 通知消息(通知使用的是标准样式还是较大样式)。

如需添加操作按钮,请调用 addAction()。此方法采用三个参数:图标的可绘制资源、 按钮的文本,以及一个用于定义操作的 PendingIntent 性能。

优先级

您现在可以提示系统通知对 设置通知在列表中的顺序 使用 setPriority() 来设置优先级。您 可以传递由 PRIORITY_* 常量定义的五个不同优先级之一 (位于 Notification 类中)。默认值为 PRIORITY_DEFAULT,分为高两级和低两级。

高优先级通知是指用户通常希望快速响应的内容, 例如新的即时消息、短信或即将发生的活动提醒。低优先级 通知是指过期的日历活动或应用促销等。

系统界面控件

Android 4.0 (Ice Cream Sandwich) 添加了新标志,用于控制系统界面的可见性 元素,例如,调暗系统栏的外观或使其完全消失在手机上。 Android 4.1 添加了更多标记,可让您进一步控制系统的外观 通过调用 setSystemUiVisibility() 来显示界面元素以及与其相对于它们的 activity 布局 并传递以下标志:

SYSTEM_UI_FLAG_FULLSCREEN
隐藏非关键系统界面(例如状态栏)。 如果您的 Activity 在叠加模式下使用操作栏(通过 启用 android:windowActionBarOverlay),则此标志也会隐藏操作栏,并 因此,在隐藏和显示这两者时,使用协调动画。
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
将 activity 布局设为使用与打开浏览器时相同的屏幕区域 即使系统界面元素也启用了 SYSTEM_UI_FLAG_FULLSCREEN 仍然可见。尽管布局的某些部分会被 系统界面,如果您的应用经常使用 SYSTEM_UI_FLAG_FULLSCREEN,因为它可以避免布局从 每次系统界面隐藏或显示时调整到新的布局边界。
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
将 activity 布局设为使用与打开浏览器时相同的屏幕区域 已启用 SYSTEM_UI_FLAG_HIDE_NAVIGATION(在 Android 4.0 中添加) 即使系统界面元素仍然可见。虽然布局的某些部分 叠加在 导航栏,如果您的应用经常隐藏和显示导航栏 SYSTEM_UI_FLAG_HIDE_NAVIGATION,因为它可以避免布局在 每次导航栏隐藏或显示时调整为新的布局边界。
SYSTEM_UI_FLAG_LAYOUT_STABLE
如果您使用 SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 和/或 SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION,则可能需要添加此标记,以确保在调用 fitSystemWindows() 所定义的边界始终以可用的屏幕空间为准。 也就是说,设置此标志后,fitSystemWindows() 的行为将如同系统界面元素的可见性未更改一样 即使您隐藏了所有系统界面也无妨。

有关其他相关系统界面标志的更多讨论,请参阅 Android 4.0 中添加的功能。

远程视图

GridLayoutViewStub 现在是远程视图,因此您可以在您的 应用微件和通知自定义布局。

字体系列

Android 4.1 新增了几个 Roboto 字体样式变体,总共有 10 个变体, 它们都可供应用使用现在,您的应用将获得全套的浅色和 浓缩变体。

可用的全部 Roboto 字体变体如下:

  • 常规
  • 斜体
  • 粗体
  • 粗斜体
  • 浅斜体
  • 精简常规
  • 斜体
  • 浓缩粗体
  • 粗斜体精简

您可以通过新的fontFamily应用上述任一设置 属性与 textStyle 属性结合使用。

fontFamily 支持的值包括:

  • "sans-serif"(适用于常规 Roboto)
  • "sans-serif-light" 表示 Roboto Light
  • "sans-serif-condensed"(用于 Roboto Condensed)

然后,您可以对 textStyle 值应用粗体和/或斜体 "bold""italic"。您可以按照以下方式应用这两项:android:textStyle="bold|italic"

您也可以使用 Typeface.create()。 例如 Typeface.create("sans-serif-light", Typeface.NORMAL)

输入框架

多输入设备

借助新的 InputManager 类,您可以查询 当前已连接的一组输入设备,并且在有新设备时 。如果您在构建游戏时 并且您希望检测连接的控制器数量, 以及当控制器数量发生变化时。

您可以通过调用 getInputDeviceIds()。此操作会返回 一个整数数组,其中每个整数代表不同输入设备的 ID。然后,您可以调用 getInputDevice()(可获取) 与指定输入设备 ID 对应的 InputDevice

如果您想在新的输入设备连接、更改或断开连接时收到通知, 实现 InputManager.InputDeviceListener 接口,以及 向 registerInputDeviceListener() 注册该密钥。

输入控制器振动

如果连接的输入设备有自己的振动功能,您现在可以控制 使用现有的 Vibrator API 时,这些设备会振动 方法是对 InputDevice 调用 getVibrator()

权限

以下是新权限:

READ_EXTERNAL_STORAGE
提供对外部存储空间的受保护读取权限。在 Android 4.1 中 默认情况下,所有应用都 访问权限。未来版本中将对此进行更改,要求应用明确请求 读取权限。如果您的应用已请求写入权限,它将 也会自动获得读取权限提供一个新的开发者选项,可开启读取权限 以便开发者根据 Android 在 。
android.Manifest.permission.READ_USER_DICTIONARY
允许应用读取用户字典。只有 IME 或字典编辑器(例如“设置”应用)。
READ_CALL_LOG
允许应用读取系统的通话记录,其中包含有关 来电和去电。
WRITE_CALL_LOG
允许应用修改系统存储在手机上的通话记录
android.Manifest.permission.WRITE_USER_DICTIONARY
允许应用向用户的字词字典写入数据。

设备功能

Android 4.1 为 在电视屏幕上显示界面:FEATURE_TELEVISION。若要声明您的应用需要 电视接口,请使用 <uses-feature> 元素在您的清单文件中声明此功能:

<manifest ... >
    <uses-feature android:name="android.hardware.type.television"
                  android:required="true" />
    ...
</manifest>

此功能定义了“电视”典型的客厅电视体验: 展示在大屏幕上,用户坐在远处,主角 输入方式就像方向键一样,一般不通过触摸或 鼠标/指针设备。