| page.title=Android N for Developers |
| meta.tags="preview", "androidn" |
| page.tags="preview", "developer preview" |
| page.image=images/cards/card-n-apis_2x.png |
| @jd:body |
| |
| |
| |
| |
| <div id="tb-wrapper"> |
| <div id="tb"> |
| <h2>重要的开发者功能</h2> |
| <ol> |
| <ul style="list-style-type:none;"> |
| <li><a href="#multi-window_support">多窗口支持</a></li> |
| <li><a href="#notification_enhancements">通知</a></li> |
| <li><a href="#jit_aot">JIT/AOT 编译</a></li> |
| <li><a href="#quick_path_to_app_install">快速的应用安装路径</a></li> |
| <li><a href="#doze_on_the_go">随时随地低电耗模式</a></li> |
| <li><a href="#background_optimizations">后台优化</a></li> |
| <li><a href="#data_saver">Data Saver</a></li> |
| <li><a href="#vulkan">Vulkan API</a></li> |
| <li><a href="#tile_api">Quick Settings Tile API</a></li> |
| <li><a href="#number-blocking">号码屏蔽</a></li> |
| <li><a href="#call_screening">来电过滤</a></li> |
| <li><a href="#multi-locale_languages">区域设置和语言</a></li> |
| <li><a href="#emoji">新增的表情符号</a></li> |
| <li><a href="#icu4">Android 中的 ICU4J API</a></li> |
| <li><a href="#gles_32">OpenGL ES 3.2 API</a></li> |
| <li><a href="#android_tv_recording">Android TV 录制</a></li> |
| <li><a href="#android_for_work">Android for Work</a></li> |
| <li><a href="#accessibility_enhancements">无障碍功能</a></li> |
| <li><a href="#direct_boot">直接启动</a></li> |
| <li><a href="#key_attestation">密钥认证</a></li> |
| <li><a href="#network_security_config">网络安全性配置</a></li> |
| <li><a href="#default_trusted_ca">默认受信任的 CA</a></li> |
| <li><a href="#apk_signature_v2">APK Signature Scheme v2</a></li> |
| <li><a href="#scoped_directory_access">作用域目录访问</a></li> |
| <li><a href="#keyboard_shortcuts_helper">键盘快捷键辅助工具</a></li> |
| <li><a href="#sustained_performance_api">持续性能 API</a></li> |
| <li><a href="#vr">VR 支持</a></li> |
| <li><a href="#print_svc">打印服务增强</a></li> |
| <li><a href="#virtual_files">虚拟文件</a></li> |
| <li><a href="#framemetrics_api">FrameMetricsListener API</a></li> |
| </ol> |
| </div> |
| </div> |
| |
| |
| |
| <p>Android N 仍处于活动的开发状态,但现在您可以将其作为 N Developer Preview 的一部分进行试用。 |
| 以下部分重点介绍面向开发者的一些新功能。 |
| </p> |
| |
| <p> |
| 请务必查阅<a href="{@docRoot}preview/behavior-changes.html">行为变更</a>以了解平台变更可能影响您的应用的领域,看看开发者指南,了解有关关键功能的更多信息,并下载 <a href="{@docRoot}preview/setup-sdk.html#docs-dl">API 参考</a>以获取新 API 的详细信息。 |
| |
| |
| |
| </p> |
| |
| <h2 id="multi-window_support">多窗口支持</h2> |
| |
| |
| <p>在 Android N 中,我们为该平台引入了一个新的而且非常需要的多任务处理功能 — 多窗口支持。 |
| </p> |
| |
| <p>现在,用户可以一次在屏幕上打开两个应用。 </p> |
| <ul> |
| <li>在运行 Android N 的手机和平板电脑上,用户可以并排运行两个应用,或者处于分屏模式时一个应用位于另一个应用之上。 |
| |
| 用户可以通过拖动两个应用之间的分隔线来调整应用。 |
| </li> |
| |
| <li>在 Android TV 设备上,应用可以将自身置于<a href="{@docRoot}preview/features/picture-in-picture.html">画中画模式</a>,从而让它们可以在用户浏览或与其他应用交互时继续显示内容。 |
| |
| </li> |
| </ul> |
| |
| <div class="col-4of10"> |
| <img src="{@docRoot}images/android-7.0/mw-portrait.png" alt="" style="height:460px;padding-left:1em;" id="img-split-screen" /> |
| <p class="img-caption"> |
| <strong>图 1. </strong>在分屏模式下运行的应用。 |
| </p> |
| |
| </div> |
| |
| <p>多窗口支持为您提供新的吸引用户方式,特别是在平板电脑和其他更大屏幕的设备上。 |
| 您甚至可以在您的应用中启用拖放,从而使用户可以方便地将内容拖放到您的应用或从其中拖出内容—这是一个非常好的增强用户体验的方式。 |
| |
| </p> |
| |
| <p>向您的应用添加多窗口支持并配置多窗口显示的处理方式非常简单。 |
| 例如,您可以指定您的 Activity 允许的最小尺寸,从而防止用户将 Activity 调整到该尺寸以下。 |
| |
| 您还可以为应用禁用多窗口显示,这可确保系统将仅以全屏模式显示应用。 |
| </p> |
| |
| <p> |
| 如需了解详细信息,请参阅<a href="{@docRoot}preview/features/multi-window.html">多窗口支持</a>开发者文档。 |
| |
| </p> |
| |
| <h2 id="notification_enhancements">通知增强功能</h2> |
| |
| <p>在 Android N 中,我们重新设计了通知,使其更易于使用并且速度更快。 |
| 部分变更包括:</p> |
| |
| <ul> |
| <li> |
| <strong>模板更新</strong>:我们正在更新通知模板,新强调了英雄形象和化身。 |
| 开发者将能够充分利用新模板,只需进行少量的代码调整。 |
| |
| </li> |
| |
| <li> |
| <strong>消息样式自定义</strong>:您可以自定义更多与您的使用 <code>MessageStyle</code> 类的通知相关的用户界面标签。 |
| |
| 您可以配置消息、会话标题和内容视图。 |
| |
| </li> |
| |
| <li> |
| <strong>捆绑通知</strong>:系统可以将消息组合在一起(例如,按消息主题)并显示组。 |
| 用户可以适当地进行 Dismiss 或 Archive 等操作。 |
| 如果您已实现 Android Wear 的通知,那么您已经很熟悉此模型。 |
| |
| |
| </li> |
| |
| <li> |
| <strong>直接回复</strong>:对于实时通信应用,Android 系统支持内联回复,以便用户可以直接在通知界面中快速回复短信。 |
| |
| |
| </li> |
| |
| <li> |
| <strong>自定义视图</strong>:两个新的 API 让您在通知中使用自定义视图时可以充分利用系统装饰元素,如通知标题和操作。 |
| |
| |
| </li> |
| </ul> |
| |
| <div class="col-4of12"> |
| <img src="{@docRoot}images/android-7.0/notifications-1.png" alt="" style="padding:.5em;max-width:226px"> |
| </div> |
| |
| <div class="col-4of12"> |
| <img src="{@docRoot}images/android-7.0/notifications-3.png" alt="" style="padding:.5em;max-width:226px"> |
| </div> |
| |
| <div class="col-4of12"> |
| <img src="{@docRoot}images/android-7.0/notifications-2.png" alt="" style="padding:.5em;max-width:226px"> |
| </div> |
| |
| |
| <p class="img-caption"> |
| <strong>图 2. </strong>绑定的通知和直接回复。 |
| </p> |
| |
| <p>如需了解如何实现新功能的信息,请参阅<a href="{@docRoot}preview/features/notification-updates.html">通知</a>指南。 |
| |
| </p> |
| |
| |
| |
| <h2 id="jit_aot">个人资料指导的 JIT/AOT 编译</h2> |
| |
| <p>在 Android N 中,我们添加了 Just in Time (JIT) 编译器,对 ART 进行代码分析,让它可以在应用运行时持续提升 Android 应用的性能。 |
| |
| JIT 编译器对 Android 运行组件当前的 Ahead of Time (AOT) 编译器进行了补充,有助于提升运行时性能,节省存储空间,加快应用更新和系统更新速度。 |
| |
| </p> |
| |
| <p>个人资料指导的编译让 Android 运行组件能够根据应用的实际使用以及设备上的情况管理每个应用的 AOT/JIT 编译。 |
| 例如,Android 运行组件维护每个应用的热方法的个人资料,并且可以预编译和缓存这些方法以实现最佳性能。 |
| |
| 对于应用的其他部分,在实际使用之前不会进行编译。 |
| </p> |
| |
| <p>除提升应用的关键部分的性能外,个人资料指导的编译还有助于减少整个 RAM 占用,包括关联的二进制文件。 |
| |
| 此功能对于低内存设备非常尤其重要。</p> |
| |
| <p>Android 运行组件在管理个人资料指导的编译时,可最大程度降低对设备电池的影响。 |
| 仅当设备处于空闲状态和充电时才进行编译,从而可以通过提前执行该工作节约时间和省电。 |
| </p> |
| |
| <h2 id="quick_path_to_app_install">快速的应用安装路径</h2> |
| |
| <p>Android 运行组件的 JIT 编译器最实际的好处之一是应用安装和系统更新的速度。 |
| 即使在 Android 6.0 中需要几分钟进行优化和安装的大型应用,现在只需几秒钟就可以完成安装。 |
| |
| 系统更新也变得更快,因为省去了优化步骤。 </p> |
| |
| <h2 id="doze_on_the_go">随时随地低电耗模式...</h2> |
| |
| <p>Android 6.0 推出了低电耗模式,即设备处于空闲状态时,通过推迟应用的 CPU 和网络活动以实现省电目的的系统模式,例如,设备放在桌上或抽屉里时。 |
| |
| </p> |
| |
| <p>现在,在 Android N 中,低电耗模式又前进了一步,随时随地可以省电。只要屏幕关闭了一段时间,且设备未插入电源,低电耗模式就会对应用使用熟悉的 CPU 和网络限制。这意味着用户即使将设备放入口袋里也可以省电。 |
| |
| |
| |
| </p> |
| |
| |
| <img src="/preview/images/doze-diagram-1.png" alt="" id="figure1" /> |
| <p class="img-caption"> |
| <strong>图 3. </strong>低电耗模式现在应用限制以延长电池寿命,即使设备未处于静止状态。 |
| |
| </p> |
| |
| |
| <p>屏幕关闭片刻后,设备在使用电池时,低电耗模式将限制网络访问,同时延迟作业和同步。 |
| 在短暂的维护时间范围后,其允许应用访问网络,并执行延迟的作业/同步。 |
| |
| 打开屏幕或将设备插入电源会使设备退出低电耗模式。 |
| </p> |
| |
| <p>当设备再次处于静止状态时,屏幕关闭且使用电池一段时间,低电耗模式针对 {@link |
| android.os.PowerManager.WakeLock}、{@link android.app.AlarmManager} 警报和 GPS/Wi-Fi 扫描应用完整 CPU 和网络限制。 |
| |
| </p> |
| |
| <p>无论设备是否处于运动状态,将应用调整到低电耗模式的最佳做法均相同,因此,如果您已更新应用以妥善处理低电耗模式,则一切就绪。 |
| |
| 如果不是,请立即开始<a href="{@docRoot}training/monitoring-device-state/doze-standby.html#assessing_your_app">将应用调整到低电耗模式</a>。 |
| </p> |
| |
| <h2 id="background_optimizations">Project Svelte:后台优化</h2> |
| |
| <p>Project Svelte 在持续改善,以最大程度减少生态系统中一系列 Android 设备中系统和应用使用的 RAM。 |
| 在 Android N 中,Project Svelte 注重优化在后台中运行应用的方式。 |
| </p> |
| |
| <p>后台处理是大多数应用的一个重要部分。处理得当,可让您实现非常棒的用户体验 — 即时、快速和情境感知。如果处理不得当,后台处理会毫无必要地消耗 RAM(和电池),同时影响其他应用的系统性能。 |
| |
| |
| </p> |
| |
| <p>自 Android 5.0 发布以来,{@link android.app.job.JobScheduler} 已成为执行后台工作的首选方式,其工作方式有利于用户。 |
| |
| 应用可以在安排作业的同时允许系统基于内存、电源和连接情况进行优化。 |
| JobScheduler 可实现控制和简洁性,我们想要所有应用都使用它。 |
| </p> |
| |
| <p> |
| 另一个非常好的选择是 <a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager"> |
| <code>GCMNetworkManager</code></a>(Google Play 服务的一部分),其在旧版 Android 中提供类似的作业安排和兼容性。 |
| |
| |
| </p> |
| |
| <p>我们在继续扩展 <code>JobScheduler</code> 和 |
| <code>GCMNetworkManager</code>,以符合多个用例 — 例如,在 Android N 中,现在,您可以基于内容提供程序中的更改安排后台工作。 |
| |
| 同时,我们开始弃用一些较旧的模式,这些模式会降低系统性能,特别是低内存设备的系统性能。 |
| |
| </p> |
| |
| <p>在 Android N 中,我们删除了三个常用隐式广播 — |
| {@link android.net.ConnectivityManager#CONNECTIVITY_ACTION}、{@link |
| android.hardware.Camera#ACTION_NEW_PICTURE} 和 {@link |
| android.hardware.Camera#ACTION_NEW_VIDEO} — 因为这些广播可能会一次唤醒多个应用的后台进程,同时会耗尽内存和电池。 |
| 如果您的应用收到这些广播,请充分利用 N Developer Preview 以迁移到 <code>JobScheduler</code> 和相关的 API。 |
| |
| </p> |
| |
| <p> |
| 如需了解详情,请查看<a href="{@docRoot}preview/features/background-optimization.html">后台优化</a>文档。 |
| |
| </p> |
| |
| |
| <h2 id="data_saver">Data Saver</h2> |
| |
| <div class="col-5of12" style="margin-right:1.5em;"> |
| <img src="{@docRoot}images/android-7.0/datasaver.png" style="border:2px solid #ddd"> |
| |
| <p class="img-caption" style="padding-right:2em;"> |
| <strong>图 4. </strong> 设置中的 Data Saver |
| </p> |
| </div> |
| |
| <p>在移动设备的整个生命周期,蜂窝数据计划的成本通常会超出设备本身的成本。 |
| 对于许多用户而言,蜂窝数据是他们想要节省的昂贵资源。 |
| </p> |
| |
| <p>Android N 推出了 Data Saver 模式,这是一项新的系统服务,有助于减少应用使用的蜂窝数据,无论是在漫游,账单周期即将结束,还是使用少量的预付费数据包。 |
| |
| Data Saver 让用户可以控制应用使用蜂窝数据的方式,同时让开发者打开 Data Saver 时可以提供更多有效的服务。 |
| |
| </p> |
| |
| <p>用户在 <strong>Settings</strong> 中启用 Data Saver 且设备位于按流量计费的网络上时,系统屏蔽后台流量消耗,同时指示应用在前台尽可能使用较少的流量 — 例如,通过限制用于流媒体服务的比特率、降低图片质量、延迟最佳的预缓冲等方法来实现。 |
| |
| |
| |
| 用户可以将特定应用加入白名单以允许后台按流量的流量消耗,即使在打开 Data Saver 时也是如此。 |
| </p> |
| |
| <p>Android N 扩展了 {@link android.net.ConnectivityManager},以便为应用<a href="{@docRoot}preview/features/data-saver.html#status">检索用户的 Data Saver 首选项</a>并<a href="{@docRoot}preview/features/data-saver.html#monitor-changes">监控首选项变更</a>提供一种方式。 |
| |
| |
| 所有应用均应检查用户是否已启用 Data Saver 并努力限制前台和后台流量消耗。 |
| </p> |
| |
| |
| <h2 id="vulkan">Vulkan API</h2> |
| |
| <p> |
| Android N 将一项新的 3D 渲染 API <a href="http://www.khronos.org/vulkan" class="external-link">Vulkan™</a> 集成到平台中。就像 <a href="https://www.khronos.org/opengles/" class="external-link">OpenGL™ ES</a> 一样,Vulkan 是 3D 图形和渲染的一项开放标准,由 Khronos Group 维护。 |
| |
| |
| |
| </p> |
| |
| <p> |
| Vulkan 是完全从零开始设计,以最小化驱动器中的 CPU 开销,并能让您的应用更直接地控制 GPU 操作。 |
| Vulkan 还允许多个线程同时执行工作,如命令缓冲区构建,以获得更好的并行化。 |
| |
| |
| </p> |
| |
| <p> |
| Vulkan 开发工具和库都已卷入 Android NDK。它们包括: |
| |
| </p> |
| |
| <ul> |
| <li>头 |
| </li> |
| |
| <li>验证层(调试库) |
| </li> |
| |
| <li>SPIR-V 着色程序编译器 |
| </li> |
| |
| <li>SPIR-V 运行时着色器编译库 |
| </li> |
| </ul> |
| |
| <p> |
| Vulkan 仅适用于已启用 Vulkan 硬件的设备上的应用,如 Nexus 5X、Nexus 6P 和 Nexus Player。 |
| 我们正在与合作伙伴密切合作,以尽快使 Vulkan 能面向更多的设备。 |
| |
| </p> |
| |
| <p> |
| 如需要了解更多信息,请参阅 <a href="{@docRoot}ndk/guides/graphics/index.html">API 文档</a>。 |
| </p> |
| |
| <h2 id="tile_api">Quick Settings Tile API</h2> |
| |
| |
| <div style="float:right;max-width:320px"> |
| <img src="{@docRoot}images/android-7.0/quicksettings.png" style="padding-left:1.5em;"> |
| |
| <p class="img-caption" style="padding-left:2em;"> |
| <strong>图 5.</strong> 通知栏中的快速设置图块。 |
| </p> |
| |
| |
| </div><p>“快速设置”通常用于直接从通知栏显示关键设置和操作,非常简单。 |
| 在 Android N 中,我们已扩展“快速设置”的范围,使其更加有用更方便。 |
| </p> |
| |
| <p>我们为额外的“快速设置”图块添加了更多空间,用户可以通过向左或向右滑动跨分页的显示区域访问它们。 |
| 我们还让用户可以控制显示哪些“快速设置”图块以及显示的位置 — 用户可以通过拖放图块来添加或移动图块。 |
| |
| </p> |
| |
| <p>对于开发者,Android N 还添加了一个新的 API,从而让您可以定义自己的“快速设置”图块,使用户可以轻松访问您应用中的关键控件和操作。 |
| </p> |
| |
| <p> |
| 对于急需或频繁使用的控件和操作,保留“快速设置”图块,且不应将其用作启动应用的快捷方式。 |
| |
| |
| </p> |
| |
| <p> |
| 定义图块后,您可以将它们显示给用户,用户可通过拖放将图块添加到“快速设置”。 |
| |
| </p> |
| |
| <p> |
| 如需创建应用图块的更多信息,请参阅可下载的 <a href="{@docRoot}preview/setup-sdk.html#docs-dl">API 参考</a>中的文件 <code>android.service.quicksettings.Tile</code>。 |
| |
| </p> |
| |
| |
| |
| <h2 id="number-blocking">号码屏蔽</h2> |
| |
| <p>Android N 现在支持在平台中进行号码屏蔽,提供框架 API,让服务提供商可以维护屏蔽的号码列表。 |
| 默认短信应用、默认手机应用和提供商应用可以对屏蔽的号码列表进行读取和写入操作。 |
| |
| 其他应用则无法访问此列表。</p> |
| |
| <p>通过使号码屏蔽成为平台的标准功能,Android 为应用提供一致的方式来支持广泛的设备上的号码屏蔽。 |
| |
| 应用可以利用的其他优势包括:</p> |
| |
| <ul> |
| <li> 还会屏蔽已屏蔽的来电号码发出的短信 |
| <li> 通过 Backup & Restore(备份和还原)功能可以跨重置和设备保留屏蔽的号码 |
| |
| <li> 多个应用可以使用相同的屏蔽号码列表 |
| </ul> |
| |
| <p>此外,通过 Android 的运营商应用集成表示运营商可以读取设备上屏蔽的号码列表,并为用户执行服务端屏蔽,以阻止不需要的来电和短信通过任何介质(如 VOIP 端点或转接电话)到达用户。 |
| |
| |
| </p> |
| |
| <p> |
| 如需了解详细信息,请参阅可下载的 <a href="{@docRoot}preview/setup-sdk.html#docs-dl">API 参考</a>中的 <code>android.provider.BlockedNumberContract</code>。 |
| |
| |
| </p> |
| |
| <h2 id="call_screening">来电过滤</h2> |
| |
| <p> |
| Android N 允许默认的手机应用过滤来电。手机应用执行此操作的方式是实现新的 <code>CallScreeningService</code>,该方法允许手机应用基于来电的 {@link android.telecom.Call.Details Call.Details} 执行大量操作,例如: |
| |
| |
| |
| </p> |
| |
| <ul> |
| <li> 拒绝来电 |
| <li> 不允许来电到达通话记录 |
| <li> 不向用户显示来电通知 |
| </ul> |
| |
| <p> |
| 如需了解详细信息,请参阅可下载的 <a href="{@docRoot}preview/setup-sdk.html#docs-dl">API 参考</a>中的 <code>android.telecom.CallScreeningService</code>。 |
| |
| |
| </p> |
| |
| |
| <h2 id="multi-locale_languages">多区域设置支持、多语言</h2> |
| |
| |
| <p>Android N 现在允许用户在设置中选择<strong>多个区域设置</strong>,以更好地支持双语用例。 |
| 应用可以使用新的 API 获取用户选择的区域设置,然后为多区域设置用户提供更成熟的用户体验 — 如以多个语言显示搜索结果,并且不会以用户了解的语言翻译网页。 |
| |
| |
| |
| </p> |
| |
| <p>除多区域设置支持外,Android N 还扩展了用户可用的语言范围。 |
| 它针对常用语言提供超过 25 种的变体,如英语、西班牙语、法语和阿拉伯语。 |
| 它还针对 100 多种新语言添加了部分支持。 |
| </p> |
| |
| <p>应用可以通过调用 <code>LocaleList.GetDefault()</code> 获取用户设置的区域设置列表。 |
| 为支持扩展的区域设置数量,Android N 正在改变其解析资源的方式。 |
| 请务必使用新的资源解析逻辑测试和验证您的应用是否能如期运行。 |
| </p> |
| |
| <p>如需有关新资源解析行为和应遵循的最佳做法的更多信息,请参阅<a href="{@docRoot}preview/features/multilingual-support.html">多语言支持</a>。 |
| </p> |
| |
| |
| <h2 id="emoji">新增的表情符号</h2> |
| |
| <p> |
| Android N 引入更多表情符号和表情符号相关功能,包括肤色表情符号和支持变量选择符。 |
| |
| 如果您的应用支持表情符号,请遵循以下准则,以便能充分利用这些表情符号相关功能优势。 |
| |
| </p> |
| |
| <ul> |
| <li> |
| <strong>在插入之前,检查设备是否包含表情符号。</strong> |
| 若要检查系统字体中有哪些表情符号,使用 {@link android.graphics.Paint#hasGlyph(String)} 方法。 |
| |
| </li> |
| <li> |
| <strong>检查表情符号是否支持变量选择符。</strong> |
| 变量选择符使您能够呈现一些彩色或黑白的表情符号。 |
| |
| 在移动设备上,应用应呈现彩色的表情符号,而不是黑白的。但是,如果您的应用显示嵌入在文本中的表情符号,那应使用黑白变量。 |
| |
| 若要确定表情符号是否有变量,使用变量选择符。 |
| 如需有关支持变量的字符的完整清单,请参阅<a class="external-link" href="http://www.unicode.org/Public/9.0.0/ucd/StandardizedVariants-9.0.0d1.txt">变量的 Unicode 文档</a>中的 <em>表情符号变量序列</em>部分。 |
| |
| |
| |
| </li> |
| <li> |
| <strong>检查表情符号是否支持肤色。</strong>Android N 允许用户按照他们的喜好修改表情符号呈现的肤色。 |
| 键盘应用应为有多个肤色的表情符号提供可视化的指示,并应允许用户选择他们喜欢的肤色。 |
| |
| 若要确定哪些系统表情符号有肤色修改器,使用 {@link android.graphics.Paint#hasGlyph(String)} 方法。 |
| |
| 您可以通过读取 <a class="external-link" href="http://unicode.org/emoji/charts/full-emoji-list.html">Unicode 文档</a>来确定哪些表情符号使用肤色。 |
| |
| |
| </li> |
| </ul> |
| |
| |
| <h2 id="icu4">Android 中的 ICU4J API</h2> |
| |
| <p> |
| Android N 目前在 Android 框架(位于 <code>android.icu</code> 软件包下)中提供 <a href="http://site.icu-project.org/">ICU4J</a> API 的子集。 |
| 迁移很简单,主要是需要从 <code>com.java.icu</code> 命名空间更改为 <code>android.icu</code>。 |
| |
| 如果您已在您的应用中使用 ICU4J 捆绑包,切换到 Android 框架中提供的 <code>android.icu</code> API 可以大量节省 APK 大小。 |
| |
| |
| </p> |
| |
| <p> |
| 如果要了解有关 Android ICU4J API 的更多信息,请参阅 <a href="{@docRoot}preview/features/icu4j-framework.html">ICU4J 支持</a>。 |
| </p> |
| |
| |
| |
| <h2 id="gles_32">OpenGL™ ES 3.2 API</h2> |
| |
| <p>Android N 添加了框架接口和对 OpenGL ES 3.2 的平台支持,包括:</p> |
| |
| <ul> |
| <li> 来自 <a class="external-link" href="https://www.khronos.org/registry/gles/extensions/ANDROID/ANDROID_extension_pack_es31a.txt"> |
| Android 扩展包</a></a> (AEP) 的所有扩展(<code>EXT_texture_sRGB_decode</code> 除外)。 |
| <li> 针对 HDR 的浮点帧缓冲和延迟着色。 |
| <li> BaseVertex 绘图调用可实现更好的批处理和流媒体服务。 |
| <li> 强大的缓冲区访问控制可减少 WebGL 开销。 |
| </ul> |
| |
| <p>Android N 上适用于 OpenGL ES 3.2 的框架 API 与 <code>GLES32</code> 类一起提供。 |
| 使用 OpenGL ES 3.2 时,请务必通过 <code><uses-feature></code> 标记和 <code>android:glEsVersion</code> 属性在您的清单中声明要求。 |
| |
| </p> |
| |
| <p>如需了解有关使用 OpenGL ES 的信息,包括如何在运行时检查设备支持的 OpenGL ES 版本,请参阅 <a href="{@docRoot}guide/topics/graphics/opengl.html">OpenGL ES API 指南</a>。 |
| </p> |
| |
| |
| <h2 id="android_tv_recording">Android TV 录制</h2> |
| |
| <p>Android N 通过新的录制 API 添加了从 Android TV 输入服务录制和播放内容的功能。 |
| 构建在现有时移 API 之上,TV 输入服务可以控制能够录制的渠道数据、保存录制的会话的方式,同时可通过录制的内容管理用户交互。 |
| |
| </p> |
| |
| <p>如需了解详细信息,请参阅 <a href="{@docRoot}preview/features/tv-recording-api.html">Android TV 录制 API</a>。</p> |
| |
| |
| <h2 id="android_for_work">Android for Work</h2> |
| |
| <p>Android for Work 针对运行 Android N 的设备添加了许多新功能和 API。部分重要内容如下— 有关变更的完整列表,请参阅 <a href="{@docRoot}preview/features/afw.html">Android for Work 更新</a>。 |
| |
| </p> |
| |
| <h3 id="work_profile_security_challenge">工作资料安全性挑战 </h3> |
| |
| <p> |
| 面向 N SDK 的个人资料所有者可以为在工作资料中运行的应用指定单独的安全性挑战。 |
| |
| 当用户尝试打开任何工作应用时将显示工作挑战。 |
| 成功完成安全性挑战可解锁工作资料并将其解密(如果需要)。 |
| 对于个人资料所有者,<code>ACTION_SET_NEW_PASSWORD</code> 提示用户设置工作挑战,<code>ACTION_SET_NEW_PARENT_PROFILE_PASSWORD</code> 提示用户设置设备锁。 |
| |
| |
| |
| </p> |
| |
| <p> |
| 个人资料所有者可以使用 <code>setPasswordQuality()</code>、<code>setPasswordMinimumLength()</code> 和相关方法针对工作挑战设置不同的密码策略(例如,PIN 必须多长,或是否可以使用指纹解锁个人资料)。 |
| |
| |
| 个人资料所有者还可以使用新的 <code>getParentProfileInstance()</code> 方法返回的 <code>DevicePolicyManager</code> 实例设置设备锁定。 |
| |
| |
| 此外,个人资料所有者可以使用新的 <code>setOrganizationColor()</code> 和 <code>setOrganizationName()</code> 方法针对工作挑战自定义凭据屏幕。 |
| |
| |
| </p> |
| <h3 id="turn_off_work">关闭工作 </h3> |
| |
| <p>在有工作资料的设备上,用户可以切换工作模式。工作模式关闭时,管理的用户临时关闭,其禁用托管工作资料应用、后台同步和通知。 |
| |
| 这包括个人资料所有者应用。 |
| 关闭工作模式时,系统显示永久状态图标,以提醒用户他们无法启动工作应用。 |
| 启动器指示该工作应用和小组件无法访问。 |
| </p> |
| |
| <h3 id="always_on_vpn">Always on VPN </h3> |
| |
| <p>设备所有者和个人资料所有者可以确保工作应用始终通过指定的 VPN 连接。 |
| 系统在设备启动后自动启动该 VPN。 |
| </p> |
| |
| <p> |
| 新的 <code>DevicePolicyManager</code> 方法为 <code>setAlwaysOnVpnPackage()</code> 和 <code>getAlwaysOnVpnPackage()</code>。 |
| |
| |
| </p> |
| |
| <p>由于 VPN 服务无需应用交互即可由系统直接绑定,因此,VPN 客户端必须针对 Always on VPN 处理新的入口点。 |
| 和以前一样,由与操作匹配的 Intent 过滤器将服务指示给系统。<code>android.net.VpnService</code>。 |
| |
| </p> |
| |
| <p> |
| 用户还可以使用 <strong>Settings>More>Vpn</strong> 在主要用户中手动设置实现 <code>VPNService</code> 方法的 Always on VPN 客户端。 |
| |
| |
| </p> |
| |
| <h3 id="custom_provisioning">自定义配置</h3> |
| |
| <p> |
| 应用可以用企业颜色和徽标来自定义个人资料所有者和设备所有者配置流程。<code>DevicePolicyManager.EXTRA_PROVISIONING_MAIN_COLOR</code> 自定义流程颜色。<code>DevicePolicyManager.EXTRA_PROVISIONING_LOGO_URI</code> 用企业徽标自定义流程。 |
| |
| |
| |
| |
| </p> |
| |
| <h2 id="accessibility_enhancements">无障碍增强功能</h2> |
| |
| <p>Android N 现在针对新的设备设置直接在欢迎屏幕上提供“Vision Settings”。 |
| 这使用户可以更容易发现和配置他们设备上的无障碍功能,包括放大手势、字体大小、显示屏尺寸和 TalkBack。 |
| |
| </p> |
| |
| <p>随着这些无障碍功能更为突出,在启用这些功能后,您的用户更可能试用您的应用。 |
| 请务必提前启用这些设置测试您的应用。 |
| 您可以通过 Settings > Accessibility 启用它们。 |
| </p> |
| |
| <p>还是在 Android N 中,无障碍服务现在可以帮助具有动作障碍的用户触摸屏幕。 |
| 全新的 API 允许使用人脸追踪、眼球追踪、点扫描等功能构建服务,以满足这些用户的需求。 |
| |
| </p> |
| |
| <p>如需了解详细信息,请参阅可下载的 <a href="{@docRoot}preview/setup-sdk.html#docs-dl">API 参考</a> 中的 <code>android.accessibilityservice.GestureDescription |
| </code>。</p> |
| |
| |
| <h2 id="direct_boot">直接启动</h2> |
| |
| <p>直接启动可以缩短设备启动时间,让注册的应用具有有限的功能,即使在意外重启后。例如,如果当用户睡觉时加密的设备重启,那么注册的警报、消息和来电现在可以和往常一样继续通知用户。 |
| |
| |
| |
| 这也意味着重启后无障碍服务会立即可用。 |
| </p> |
| |
| <p>在 Android N 中,直接启动充分利用基于文件的加密,以针对系统和应用数据启用细化的加密策略。为系统和应用数据。系统针对选定的系统数据和显式注册的应用数据使用设备加密的存储。 |
| |
| |
| 默认情况下,凭据加密的存储可用于所有其他系统数据、用户数据、应用及应用数据。 |
| </p> |
| |
| <p>启动时,系统在受限的模式中启动,仅访问设备加密的数据,不会对应用或数据进行常规访问。如果您有想要在此模式下运行的组件,您可以通过在清单文件中设置标记注册它们。 |
| |
| |
| 重启后,系统通过广播 <code>LOCKED_BOOT_COMPLETED</code> Intent 激活注册的组件。 |
| |
| 系统确保注册的设备加密的应用数据在解锁前可用。 |
| 所有其他数据在用户确认锁定屏幕凭据进行解密前均不可用。 |
| </p> |
| |
| 如需了解详细信息,请参阅<a href="{@docRoot}preview/features/direct-boot.html">直接启动</a>。</p> |
| </p> |
| |
| |
| <h2 id="key_attestation">密钥认证</h2> |
| |
| <p>使用硬件支持的密钥库,可更安全地在 Android 设备上创建、存储和使用加密密钥。 |
| 它们可保护密钥免受 Linux 内核、潜在的 Android 漏洞的攻击,也可防止从已取得根权限的设备提取密钥。 |
| |
| </p> |
| |
| <p>为了让硬件支持的密钥库使用起来更简单和更安全,Android N 引入了密钥认证。 |
| 应用和关闭的设备可使用密钥认证以坚决地确定 RSA 或 EC 密钥对是否受硬件支持、密钥对的属性如何,以及其使用和有效性有何限制。 |
| |
| |
| </p> |
| |
| <p>应用和关闭的设备服务可以通过 X.509 认证证书(必须由有效的认证密钥签署)请求有关密钥对的信息。 |
| |
| 认证密钥是一个 ECDSA 签署密钥,其在出厂时被注入设备的硬件支持的密钥库。因此,有效的认证密钥签署的认证证书可确认硬件支持的密钥库是否存在,以及该密钥库中密钥对的详细信息。 |
| |
| |
| |
| </p> |
| |
| <p>为确保设备使用安全的官方 Android 出厂映像,密钥认证要求设备 <a class="external-link" href="https://source.android.com/security/verifiedboot/verified-boot.html#bootloader_requirements">bootloader</a> 向<a class="external-link" href="https://source.android.com/security/trusty/index.html">可信执行环境 (TEE)</a> 提供以下信息: |
| |
| |
| </p> |
| |
| <ul> |
| <li>设备上安装的操作系统版本和补丁级别</li> |
| <li><a href="https://source.android.com/security/verifiedboot/index.html" class="external-link">验证的启动</a>公钥和锁定状态。</li> |
| </ul> |
| |
| <p>如需了解有关硬件支持的密钥库功能的详细信息,请参阅<a href="https://source.android.com/security/keystore/" class="external-link">硬件支持的密钥库</a>指南。 |
| </p> |
| |
| <p>除密钥认证外,Android N 还推出了指纹绑定密钥,在指纹注册时不会撤销。 |
| </p> |
| |
| <h2 id="network_security_config">网络安全性配置</h2> |
| |
| <p>在 Android N 中,通过使用说明性“网络安全性配置”(而不是使用传统的易出错的编程 API(例如,X509TrustManager)),应用可以安全地自定义其安全(HTTPS、TLS)连接的行为,无需任何代码修改。 |
| |
| |
| <em></em></p> |
| |
| <p>支持的功能:</p> |
| <ul> |
| <li><b>自定义信任锚。</b>让应用可以针对安全连接自定义哪些证书颁发机构 (CA) 值得信赖。 |
| 例如,信任特定的自签署证书或限制应用信任的公共 CA 集。 |
| |
| </li> |
| <li><b>仅调试重写。</b>让应用开发者可以安全调试其应用的安全连接,而不会增加安装基础的风险。 |
| |
| |
| </li> |
| <li><b>明文流量选择退出。</b>让应用可以防止自身意外使用明文流量。 |
| </li> |
| <li><b>证书固定。</b>这是一项高级功能,让应用可以针对安全连接限制哪些服务器密钥受信任。 |
| </li> |
| </ul> |
| |
| <p>如需了解详细信息,请参阅<a href="{@docRoot}preview/features/security-config.html">网络安全性配置</a>。 |
| </p> |
| |
| <h2 id="default_trusted_ca">默认受信任的证书颁发机构</h2> |
| |
| <p>默认情况下,面向 Android N 的应用仅信任系统提供的证书,且不再信任用户添加的证书颁发机构 (CA)。 |
| 如果面向 Android N 的应用希望信任用户添加的 CA,则应使用<a href="{@docRoot}preview/features/security-config.html">网络安全性配置</a>以指定信任用户 CA 的方式。 |
| |
| |
| </p> |
| |
| <h2 id="apk_signature_v2">APK signature scheme v2</h2> |
| |
| <p> |
| Android N 引入一项新的应用签名方案 APK Signature Scheme v2,它能提供更快的应用安装时间和更多针对未授权 APK 文件更改的保护。 |
| |
| 在默认情况下,Android Studio 2.2 和 Android Gradle 2.2 插件会使用 APK Signature Scheme v2 和传统签名方案来签署您的应用。 |
| |
| |
| </p> |
| |
| <p> |
| 虽然我们建议您对您的应用采用 APK Signature Scheme v2,但这项新方案并非强制性的。 |
| 如果您的应用在使用 APK Signature Scheme v2 时不能正确构建,您可以停用这项新方案。 |
| 禁用过程会导致 Android Studio 2.2 和 Android Gradle 2.2 插件仅使用传统签名方案来签署您的应用。 |
| |
| 若要仅用传统方案签署,打开多层 <code>build.gradle</code> 文件,然后将行 <code>v2SigningEnabled false</code> 添加到您的版本签名配置中: |
| |
| |
| |
| </p> |
| |
| <pre> |
| android { |
| ... |
| defaultConfig { ... } |
| signingConfigs { |
| release { |
| storeFile file("myreleasekey.keystore") |
| storePassword "password" |
| keyAlias "MyReleaseKey" |
| keyPassword "password" |
| <strong>v2SigningEnabled false</strong> |
| } |
| } |
| } |
| </pre> |
| |
| <p class="caution"><strong>注意:</strong>如果您使用 APK Signature Scheme v2 签署您的应用,并对应用进行了进一步更改,则应用的签名将无效。 |
| |
| 出于这个原因,请在使用 APK Signature Scheme v2 之前、而非之后使用 <code>zipalign</code> 等工具。 |
| |
| </p> |
| |
| <p> |
| 如需更多信息,请阅读介绍如何在 Android Studio 中<a href="{@docRoot}studio/publish/app-signing.html#release-mode">签署一项应用</a>以及如何使用 Android Gradle 插件来为签署应用<a href="{@docRoot}studio/build/build-variants.html#signing">配置构建文件</a>。 |
| |
| |
| |
| </p> |
| |
| <h2 id="scoped_directory_access">作用域目录访问</h2> |
| |
| <p>在 Android N 中,应用可以使用新的 API 请求访问特定的<a href="{@docRoot}guide/topics/data/data-storage.html#filesExternal">外部存储</a>目录,包括可移动媒体上的目录,如 SD 卡。 |
| |
| 新 API 大大简化了应用访问标准外部存储目录的方式,如 <code>Pictures</code> 目录。 |
| 应用(如照片应用)可以使用这些 API(而不是使用 <code>READ_EXTERNAL_STORAGE</code>),其授予所有存储目录的访问权限或存储访问框架,从而让用户可以导航到目录。 |
| |
| |
| |
| </p> |
| |
| <p>此外,新的 API 简化了用户向应用授予外部存储访问权限的步骤。 |
| 当您使用新的 API 时,系统使用一个简单的权限 UI,其清楚地详细介绍应用正在请求访问的目录。 |
| |
| </p> |
| |
| <p>如需了解详细信息,请参阅<a href="{@docRoot}preview/features/scoped-folder-access.html">作用域目录访问</a>开发者文档。 |
| |
| </p> |
| |
| <h2 id="keyboard_shortcuts_helper">键盘快捷键辅助工具</h2> |
| |
| <p> |
| 在 Android N 中,用户可以按“Alt + /”触发“键盘快捷键”屏幕,它会显示的系统和对焦的应用中可用的所有快捷键。 |
| |
| <em></em>这些是从应用菜单(如可用)中自动检索到的,但开发者可以提供自己的屏幕微调快捷键。 |
| |
| 您可以通过重写新 <code>Activity.onProvideKeyboardShortcuts()</code> 的方法来进行这项操作,如可下载的 <a href="{@docRoot}preview/setup-sdk.html#docs-dl">API 参考</a> 中所述。 |
| |
| |
| </p> |
| |
| <p> |
| 若要在您的应用程序的任何地方触发键盘快捷键辅助工具,为相关活动调用 {@code Activity.requestKeyboardShortcutsHelper()}。 |
| |
| </p> |
| |
| <h2 id="sustained_performance_api">持续性能 API</h2> |
| |
| <p> |
| 长期运行的应用的性能可能会显著波动,因为系统会阻止系统芯片在设备组件达到温度限制时启动。 |
| |
| 这种波动是建立高性能长期运行应用的应用开发者的移动目标。 |
| |
| </p> |
| |
| <p> |
| 为解决这些限制,Android N 包括了“持续性能模式”支持,帮助原始设备制造商 (OEM) 提供关于长期运行应用的设备性能能力的提示。 |
| |
| <em></em>应用开发者可以使用这些提示来根据可预测的一致设备性能水平调整长期应用。 |
| |
| |
| </p> |
| |
| <p> |
| 应用开发者只能在 Nexus 6P 设备的 N Developer Preview 上尝试这项新的 API。 |
| 若要使用此功能,为您希望以持续性能模式运行的窗口设置持续性能窗口标记。 |
| |
| 使用 {@code Window.setSustainedPerformanceMode()} 方法设置此举报。 |
| 当窗口不再对焦时,系统会自动停用此模式。 |
| |
| </p> |
| |
| <h2 id="vr">VR 支持</h2> |
| |
| <p> |
| Android N 添加了新的 VR 模式的平台支持和优化,以使开发者能为用户打造高质量移动 VR 体验。 |
| 新版针对开发者提供了大量性能增强特性,包括单一缓冲区渲染以及允许 VR 应用访问某个专属的 CPU 核心。在您的应用中,您可以享受到专为 VR 设计的平滑头部跟踪和立体声通知功能。 |
| |
| |
| 最重要的是,Android N 的图形延时非常低。 |
| 如需有关构建面向的 Android N 的 VR 应用的完整信息,请参阅 <a href="https://developers.google.com/vr/android/">面向 Android 的 Google VR SDK</a>。 |
| |
| </p> |
| |
| |
| <h2 id="print_svc">打印服务增强</h2> |
| |
| <p> |
| 在 Android N 中,打印服务开发者现在可以公开关于个别打印机和打印作业的其他信息。 |
| |
| </p> |
| |
| <p> |
| 在列出各打印机时,打印服务现在可以通过两种方式来设置按打印机的图标: |
| |
| </p> |
| |
| <ul> |
| <li>您可以通过调用 <code>PrinterInfo.Builder.setResourceIconId()</code> 设置源于资源 ID 的图标 |
| |
| </li> |
| |
| <li>您可以通过调用 <code>PrinterInfo.Builder.setHasCustomPrinterIcon()</code>,并针对使用 <code>android.printservice.PrinterDiscoverySession.onRequestCustomPrinterIcon()</code> 请求图标的情况设置回调来显示源自网络的图标 |
| |
| |
| |
| </li> |
| </ul> |
| |
| <p> |
| 此外,您还可以通过调用 <code>PrinterInfo.Builder.setInfoIntent()</code> 提供按打印机活动,以显示其他信息。 |
| |
| </p> |
| |
| <p> |
| 您可以通过分别调用 <code>android.printservice.PrintJob.setProgress()</code> 和 <code>android.printservice.PrintJob.setStatus()</code> 在打印任务通知中指示打印任务的进度和状态。 |
| |
| |
| |
| </p> |
| |
| <p> |
| 如需有关这些方法的详细信息,请参阅可下载的 <a href="{@docRoot}preview/setup-sdk.html#docs-dl">API 参考</a>。 |
| </p> |
| |
| <h2 id="framemetrics_api">FrameMetricsListener API</h2> |
| |
| <p> |
| FrameMetricsListener API 允许应用监测它的 UI 渲染性能。 |
| API 通过公开流式传输 Pub/Sub API 来提供此能力,以传递应用当前窗口的帧计时信息。 |
| 返回的数据相当于 <code><a href="{@docRoot}tools/help/shell.html#shellcommands">adb shell</a> |
| dumpsys gfxinfo framestats</code> 显示的数据,但不限定于在过去的 120 帧内。 |
| |
| </p> |
| |
| <p> |
| 您可以使用 FrameMetricsListener 来衡量生产中的交互级 UI 性能,无需 USB 连接。 |
| API 允许在比 {@code adb shell dumpsys gfxinfo} 更高的粒度上收集数据。 |
| |
| 因为系统可以从应用中的特定交互中收集数据,因此更高的粒度变得可行;系统不需要采集关于完整应用性能的全局概要或清除任何全局状态。 |
| |
| |
| 您可以使用这种能力来针对应用的真实使用案例收集性能数据和捕捉 UI 性能回归。 |
| |
| |
| </p> |
| |
| <p> |
| 若要监测一个窗口,实现 <code>FrameMetricsListener.onMetricsAvailable()</code> 回叫方法,并在窗口上注册。 |
| 如需了解详细信息,请参阅可下载的 <a href="{@docRoot}preview/setup-sdk.html#docs-dl">API 参考</a> 中的 {@code FrameMetricsListener} 类文档。 |
| |
| |
| </p> |
| |
| <p> |
| API 提供了一个包含计时数据的 {@code FrameMetrics} 对象,其渲染子系统会在一帧长度内报告各种里程碑。支持的指标有:{@code UNKNOWN_DELAY_DURATION}、{@code INPUT_HANDLING_DURATION}、{@code ANIMATION_DURATION}、{@code LAYOUT_MEASURE_DURATION}、{@code DRAW_DURATION}、{@code SYNC_DURATION}、{@code COMMAND_ISSUE_DURATION}、{@code SWAP_BUFFERS_DURATION}、{@code TOTAL_DURATION} 和 {@code FIRST_DRAW_FRAME}。 |
| |
| |
| |
| |
| |
| |
| </p> |
| |
| |
| <h2 id="virtual_files">虚拟文件</h2> |
| |
| <p> |
| 在较早的 Android 版本中,您的应用可以使用存储访问框架来允许用户从他们的云存储帐户中选择文件,如 Google 云端硬盘。 |
| |
| 但是,不能表示没有直接字节码表示的文件;每个文件都必须提供一个输入流。 |
| |
| |
| </p> |
| |
| <p> |
| Android N 在存储访问框架中增加了“虚拟文件”的概念。 |
| <em></em>虚拟文件功能可以让您的 {@link android.provider.DocumentsProvider} 返回可与 {@link android.content.Intent#ACTION_VIEW}Intent 使用的文件 URI,即使它们没有直接字节码表示。 |
| |
| |
| Android N 还允许您为用户文件(虚拟或其他类)提供备用格式。 |
| |
| </p> |
| |
| <p> |
| 为获得您的应用中的虚拟文件的 URI,首先您应创建一个 {@link android.content.Intent} 以打开文件选择器 UI。 |
| 由于应用不能使用 {@link android.content.ContentResolver#openInputStream(Uri) openInputStream()} 方法来直接打开一个虚拟文件,因此如果您包括了 {@link android.content.Intent#CATEGORY_OPENABLE} 类别,您的应用不会收到任何虚拟文件。 |
| |
| |
| |
| |
| </p> |
| |
| <p> |
| 在用户选择之后,系统调用 {@link android.app.Activity#onActivityResult onActivityResult()} 方法。 |
| |
| 您的应用可以检索虚拟文件的URI,并得到一个输入流,这表现在以下片段中的代码。 |
| |
| </p> |
| |
| <pre> |
| // Other Activity code ... |
| |
| final static private int REQUEST_CODE = 64; |
| |
| // We listen to the OnActivityResult event to respond to the user's selection. |
| @Override |
| public void onActivityResult(int requestCode, int resultCode, |
| Intent resultData) { |
| try { |
| if (requestCode == REQUEST_CODE && |
| resultCode == Activity.RESULT_OK) { |
| |
| Uri uri = null; |
| |
| if (resultData != null) { |
| uri = resultData.getData(); |
| |
| ContentResolver resolver = getContentResolver(); |
| |
| // Before attempting to coerce a file into a MIME type, |
| // check to see what alternative MIME types are available to |
| // coerce this file into. |
| String[] streamTypes = |
| resolver.getStreamTypes(uri, "*/*"); |
| |
| AssetFileDescriptor descriptor = |
| resolver.openTypedAssetFileDescriptor( |
| uri, |
| streamTypes[0], |
| null); |
| |
| // Retrieve a stream to the virtual file. |
| InputStream inputStream = descriptor.createInputStream(); |
| } |
| } |
| } catch (Exception ex) { |
| Log.e("EXCEPTION", "ERROR: ", ex); |
| } |
| } |
| </pre> |
| |
| <p> |
| 如需有关访问用户文件的更多信息,请参阅 <a href="{@docRoot}guide/topics/providers/document-provider.html">存储访问框架指南</a>。 |
| |
| |
| </p> |