summaryrefslogtreecommitdiffstats
path: root/docs/html-intl/intl/zh-cn
diff options
context:
space:
mode:
authorDavid Friedman <dmail@google.com>2015-06-29 16:03:08 -0700
committerDavid Friedman <dmail@google.com>2015-06-29 16:03:08 -0700
commit4fd1a573eb0724251b5c0986c7f0ae7b36d52369 (patch)
tree3b02b8800d002fd5e19fe7b170988ec61cbb5fad /docs/html-intl/intl/zh-cn
parent3686e0430f8366e2f4de867eeabfd1b7fe4aefc0 (diff)
downloadframeworks_base-4fd1a573eb0724251b5c0986c7f0ae7b36d52369.zip
frameworks_base-4fd1a573eb0724251b5c0986c7f0ae7b36d52369.tar.gz
frameworks_base-4fd1a573eb0724251b5c0986c7f0ae7b36d52369.tar.bz2
Docs: Localized M-Preview pages
Bug: 21789313 Change-Id: Ifb4a45a65acd7b786e05bdf7b7dd86698093fbdf
Diffstat (limited to 'docs/html-intl/intl/zh-cn')
-rw-r--r--docs/html-intl/intl/zh-cn/preview/api-overview.jd521
-rw-r--r--docs/html-intl/intl/zh-cn/preview/behavior-changes.jd402
-rw-r--r--docs/html-intl/intl/zh-cn/preview/features/runtime-permissions.jd794
-rw-r--r--docs/html-intl/intl/zh-cn/preview/overview.jd362
4 files changed, 2079 insertions, 0 deletions
diff --git a/docs/html-intl/intl/zh-cn/preview/api-overview.jd b/docs/html-intl/intl/zh-cn/preview/api-overview.jd
new file mode 100644
index 0000000..c64a38e
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/preview/api-overview.jd
@@ -0,0 +1,521 @@
+page.title=API 概览
+page.keywords=预览版,sdk,兼容性
+page.tags=previewresources, androidm
+sdk.platform.apiLevel=22-mnc
+page.image=images/cards/card-api-overview_16-9_2x.png
+@jd:body
+
+
+<div id="qv-wrapper">
+<div id="qv">
+
+<h2>本文内容
+<a href="#" onclick="hideNestedItems('#toc44',this);return false;" class="header-toggle">
+ <span class="more">显示详细信息</span>
+ <span class="less" style="display:none">显示精简信息</span></a></h2>
+
+<ol id="toc44" class="hide-nested">
+ <li><a href="#app-linking">应用链接</a></li>
+ <li><a href="#backup">自动备份应用</a></li>
+ <li><a href="#authentication">身份验证</a>
+ <ol>
+ <li><a href="#fingerprint-authentication">指纹身份验证</a></li>
+ <li><a href="#confirm-credential">确认凭据</a></li>
+ </ol>
+ </li>
+ <li><a href="#direct-share">直接共享</a></li>
+ <li><a href="#voice-interactions">语音交互</a></li>
+ <li><a href="#assist">助手 API</a></li>
+ <li><a href="#notifications">通知</a></li>
+ <li><a href="#bluetooth-stylus">蓝牙触控笔支持</a></li>
+ <li><a href="#ble-scanning">改进的蓝牙低功耗扫描</a></li>
+ <li><a href="#hotspot">Hotspot 2.0 第 1 版支持</a></li>
+ <li><a href="#4K-display">4K 显示模式</a></li>
+ <li><a href="#behavior-themeable-colorstatelists">主题化 ColorStateList</a></li>
+ <li><a href="#audio">音频功能</a></li>
+ <li><a href="#video">视频功能</a></li>
+ <li><a href="#camera">相机功能</a>
+ <ol>
+ <li><a href="#flashlight">闪光灯 API</a></li>
+ <li><a href="#reprocessing">相机再处理</a></li>
+ </ol>
+ </li>
+ <li><a href="#afw">Android for Work 功能</a></li>
+</ol>
+
+<h2>API 差异</h2>
+<ol>
+<li><a href="{@docRoot}preview/download.html">API 级别 22 至 M 预览版&raquo;</a> </li>
+</ol>
+
+</div>
+</div>
+
+<p>M 开发者预览版可让您预览即将推出的 Android 平台版本为用户和应用开发者提供的新功能。
+
+本文旨在介绍其中最值得关注的 API。</p>
+
+<p>M 开发者预览版的适用对象是<strong>喜欢尝鲜的开发者</strong>和<strong>测试人员</strong>。
+如果您有兴趣影响 Android 框架的发展方向,<a href="{@docRoot}preview/setup-sdk.html">欢迎试用 M 开发者预览版</a>并向我们提供反馈!
+
+
+</p>
+
+<p class="caution"><strong>注意</strong>:请不要在 Google Play 商店中发布基于 M 开发者预览版的应用。
+</p>
+
+<p class="note"><strong>注:</strong>本文经常提及的一些类和方法在 <a href="{@docRoot}">developer.android.com</a> 上尚未提供相关参考资料。
+这些 API 元素在本文中设置为 {@code code style} 格式(不带超链接)。
+如需查看这些元素的初步 API 文档,请下载<a href="{@docRoot}preview/download.html#docs">预览版参考资料</a>。
+</p>
+
+<h3>重要的行为变更</h3>
+
+<p>如果您之前发布过 Android 应用,请注意您的应用可能受到平台变化的影响。
+</p>
+
+<p>如需了解完整信息,请参阅<a href="behavior-changes.html">行为变更</a>。</p>
+
+<h2 id="app-linking">应用链接</h2>
+<p>此预览版通过提供功能更强大的应用链接,增强了 Android 的意向系统。您可以利用此功能将应用与您拥有的某个 Web 域关联。
+平台可以根据此关联确定在处理特定 Web 链接时默认使用的应用,跳过提示用户选择应用的步骤。如需了解如何实现此功能,请参阅<a href="{@docRoot}preview/features/app-linking.html">应用链接</a>。
+
+
+
+
+<h2 id="backup">自动备份应用</h2>
+<p>现在,系统可以自动为应用执行完整数据备份和恢复。对于以 M 预览版为目标平台的应用,系统会默认启用此行为,您无需额外添加任何代码。
+如果用户删除其 Google 帐户,其备份数据也会被删除。
+如需了解该功能的工作方式以及配置文件系统备份内容的方法,请参阅<a href="{@docRoot}preview/backup/index.html">自动备份应用</a>。
+
+</p>
+
+<h2 id="authentication">身份验证</h2>
+<p>本预览版提供一些新的 API,在受支持的设备上,用户只需扫描其指纹即可完成身份验证,还可检查系统最后一次使用设备解锁机制(如锁屏密码)对用户进行身份验证是发生在多久之前。
+
+这些 API 可与 <a href="{@docRoot}training/articles/keystore.html">Android 密钥库系统</a>结合使用。
+</p>
+
+<h3 id="fingerprint-authentication">指纹身份验证</h3>
+
+<p>如需通过指纹扫描验证用户身份,请获取新增
+{@code android.hardware.fingerprint.FingerprintManager} 类的实例,并调用
+{@code FingerprintManager.authenticate()} 方法。您的应用必须运行在带有指纹传感器的兼容设备上。
+您必须在应用中实现指纹身份验证流的用户界面,并在 UI 中使用标准 Android 指纹图标。<a href="https://github.com/googlesamples/android-FingerprintDialog" class="external-link">示例应用</a>中包含有 Android 指纹图标 ({@code c_fp_40px.png})。请注意,如果您要开发多个使用指纹身份验证的应用,每个应用必须独立验证用户的指纹。
+
+
+
+
+</p>
+
+<p>如需在您的应用中使用此功能,请先在清单文件中添加 {@code USE_FINGERPRINT} 权限。
+</p>
+
+<pre>
+&lt;uses-permission
+ android:name="android.permission.USE_FINGERPRINT" /&gt;
+</pre>
+
+<img src="{@docRoot}preview/images/fingerprint-screen.png" srcset="{@docRoot}preview/images/fingerprint-screen.png 1x, {@docRoot}preview/images/fingerprint-screen_2x.png 2x" style="float:right; margin:0 0 10px 20px" width="282" height="476" />
+
+<p>如需查看指纹身份验证的应用实现,请参阅<a href="https://github.com/googlesamples/android-FingerprintDialog" class="external-link">指纹对话框示例</a>。
+
+</p>
+
+<p>如果您要测试此功能,请执行以下步骤:</p>
+<ol>
+<li>如果您尚未安装 Android SDK 工具 24.3 修订版,请执行此操作。</li>
+<li>转到<strong>设置 &gt; 安全 &gt; 指纹</strong>,然后按照登记说明在模拟器中登记新指纹。
+</li>
+<li>使用模拟器通过以下命令模拟指纹触摸事件。
+使用同一命令模拟锁屏上或应用中的指纹触摸事件。
+
+<pre class="no-prettyprint">
+adb -e emu finger touch &lt;finger_id&gt;
+</pre>
+<p>在 Windows 上,您可能需要运行带有
+{@code finger touch &lt;finger_id&gt;} 参数的 {@code telnet 127.0.0.1 &lt;emulator-id&gt;} 命令。
+</p>
+</li>
+</ol>
+
+<h3 id="confirm-credential">确认凭据</h3>
+<p>您的应用可以根据用户在多久之前最后一次解锁设备来验证其身份。此功能让用户不必费心记忆应用特定密码,您也无需实现自己的身份验证用户界面。
+
+您的应用应当利用此功能并结合实现公钥或私钥,以进行用户身份验证。
+</p>
+
+<p>如需设置成功验证用户身份后可再次使用同一密钥的超时持续时间,请在设置 {@link javax.crypto.KeyGenerator} 或
+{@link java.security.KeyPairGenerator} 时调用新增的
+{@code android.security.keystore.KeyGenParameterSpec.setUserAuthenticationValidityDurationSeconds()}
+ 方法。
+此功能目前适用于对称加密操作。
+</p>
+
+<p>避免过多显示重新验证对话框 -- 您的应用应尝试先使用加密对象,如果超时到期,请使用
+{@link android.app.KeyguardManager#createConfirmDeviceCredentialIntent(java.lang.CharSequence, java.lang.CharSequence) createConfirmDeviceCredentialIntent()} 方法在您的应用内重新验证用户身份。
+
+
+</p>
+
+<p>如需查看此功能的应用实现,请参阅<a href="https://github.com/googlesamples/android-ConfirmCredential" class="external-link">确认凭据示例</a>。
+
+</p>
+
+<h2 id="direct-share">直接共享</h2>
+
+<img src="{@docRoot}preview/images/direct-share-screen.png" srcset="{@docRoot}preview/images/direct-share-screen.png 1x, {@docRoot}preview/images/direct-share-screen_2x.png 2x" style="float:right; margin:0 0 20px 30px" width="312" height="329" />
+
+<p>本预览版为您提供的 API 可让用户直观、快捷地进行共享。现在,您可以定义可在您的应用内启动特定活动的<em>直接共享目标</em>。这些直接共享目标通过“共享”<em></em>菜单公开给用户。
+
+此功能让用户可以向其他应用内的目标(如联系人)共享内容。
+例如,直接共享目标可以启动另一社交网络应用中的某个活动,让用户可以直接向该应用中的某位朋友或某个社区共享内容。
+
+</p>
+
+<p>如需启用直接共享目标,您必须定义一个类,用于扩展
+{@code android.service.} <br>
+{@code chooser.ChooserTargetService} 类。在清单文件中声明您的
+{@code ChooserTargetService}。在该声明内,指定
+{@code BIND_CHOOSER_TARGET_SERVICE} 权限和一个带有
+{@code SERVICE_INTERFACE} 操作的意向过滤器。</p>
+<p>以下示例展示了如何在清单文件中声明 {@code ChooserTargetService}。
+</p>
+<pre>
+&lt;service android:name=".ChooserTargetService"
+ android:label="&#64;string/service_name"
+ android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE"&gt;
+ &lt;intent-filter&gt;
+ &lt;action android:name="android.service.chooser.ChooserTargetService" /&gt;
+ &lt;/intent-filter&gt;
+&lt;/service&gt;
+</pre>
+
+<p>对于您想要向 {@code ChooserTargetService} 公开的每个活动,请在您的应用清单文件中为其添加一个名为
+{@code "android.service.chooser.chooser_target_service"} 的
+{@code &lt;meta-data&gt;} 元素。
+</p>
+
+<pre>
+&lt;activity android:name=".MyShareActivity”
+ android:label="&#64;string/share_activity_label"&gt;
+ &lt;intent-filter>
+ &lt;action android:name="android.intent.action.SEND" /&gt;
+ &lt;/intent-filter>
+&lt;meta-data
+ android:name="android.service.chooser.chooser_target_service"
+ android:value=".ChooserTargetService" /&gt;
+&lt;/activity>
+</pre>
+
+<h2 id="voice-interactions">语音交互</h2>
+<p>
+本预览版提供了一个新的语音交互 API,与
+<a href="https://developers.google.com/voice-actions/" class="external-link">语音操作</a>一起使用时,可让您为应用内建对话式语音体验。
+调用
+{@code android.app.Activity.isVoiceInteraction()} 方法可确定您的活动是否为响应语音操作而启动。
+如果是这样,则您的应用可以使用
+{@code android.app.VoiceInteractor} 类请求用户进行语音确认、从选项列表中进行选择以及执行其他操作。
+如需了解有关实现语音操作的更多信息,请参阅
+<a href="https://developers.google.com/voice-actions/interaction/" class="external-link">语音操作开发者网站</a>。
+</p>
+
+<h2 id="assist">助手 API</h2>
+<p>
+本预览版提供了一种让用户通过助手程序与应用进行互动的新方式。如需使用此功能,用户必须启用助手以使用当前上下文。
+启用后,用户可通过长按<strong>主页</strong>按钮在任何应用内召唤助手。
+</p>
+<p>您的应用可通过设置
+{@link android.view.WindowManager.LayoutParams#FLAG_SECURE} 标志选择不与助手共享当前上下文。除了平台传递给助手的一组标准信息外,您的应用还可利用新增的 {@code android.app.Activity.AssistContent} 类共享其他信息。
+
+</p>
+
+<p>如需为助手提供您的应用内的其他上下文,请执行以下步骤:</p>
+
+<ol>
+<li>实现 {@link android.app.Application.OnProvideAssistDataListener} 接口。</li>
+<li>利用
+{@link android.app.Application#registerOnProvideAssistDataListener(android.app.Application.OnProvideAssistDataListener) registerOnProvideAssistDataListener()} 注册此侦听器。</li>
+<li>如需提供特定于活动的上下文信息,请替代
+{@link android.app.Activity#onProvideAssistData(android.os.Bundle) onProvideAssistData()}
+ 回调和新增的 {@code Activity.onProvideAssistContent()} 回调(可选操作)。
+</ol>
+
+<h2 id="notifications">通知</h2>
+<p>本预览版针对通知功能引入了下列 API 变更:</p>
+<ul>
+ <li>新增了 {@code NotificationListenerService.INTERRUPTION_FILTER_ALARMS} 过滤级别,它对应于新增的“仅闹铃”<em></em>免打扰模式。
+</li>
+ <li>新增了 {@code Notification.CATEGORY_REMINDER} 类别值,用于区分用户安排的提醒与其他事件 ({@link android.app.Notification#CATEGORY_EVENT}) 和闹铃 ({@link android.app.Notification#CATEGORY_ALARM})。
+
+
+</li>
+ <li>新增了 {@code android.graphics.drawable.Icon} 类,可通过 {@code Notification.Builder.setSmallIcon(Icon)} 方法和
+{@code Notification.Builder.setLargeIcon(Icon)} 方法附加到通知上。
+</li>
+ <li>新增了 {@code NotificationManager.getActiveNotifications()} 方法,让您的应用能够了解哪些通知目前处于活动状态。
+如需查看使用此功能的应用实现,请参阅<a href="https://github.com/googlesamples/android-ActiveNotifications" class="external-link">活动通知示例</a>。
+</li>
+</ul>
+
+<h2 id="bluetooth-stylus">蓝牙触控笔支持</h2>
+<p>本预览版改善了对用户使用蓝牙触控笔进行输入的支持。用户可将兼容的蓝牙触控笔与其手机或平板电脑配对并建立连接。
+连接后,来自触摸屏的位置信息将与来自触控笔的压力和按键信息融合,从而实现比单纯使用触摸屏更丰富的表达。
+
+您的应用可以通过在活动中注册新增的
+{@code View.onStylusButtonPressListener} 回调和 {@code GestureDetector.OnStylusButtonPressListener}
+ 回调侦听触控笔按键动作并执行辅助操作。
+</p>
+
+<p>可使用 {@link android.view.MotionEvent} 方法和常量来检测触控笔按键交互:
+</p>
+<ul>
+<li>如果用户使用带按键的触控笔触按应用屏幕,
+{@link android.view.MotionEvent#getToolType(int) getTooltype()} 方法会返回
+{@link android.view.MotionEvent#TOOL_TYPE_STYLUS}。</li>
+<li>对于以 M 预览版为目标平台的应用,当用户按触控笔的主按键时,
+{@link android.view.MotionEvent#getButtonState() getButtonState()}
+ 方法会返回 {@code MotionEvent.STYLUS_BUTTON_PRIMARY}。
+如果触控笔有辅助按键,当用户按下它时,同一方法会返回
+{@code MotionEvent.STYLUS_BUTTON_SECONDARY}。如果用户同时按下两个按键,该方法会同时返回通过 OR 运算符连接起来的两个值 ({@code STYLUS_BUTTON_PRIMARY|STYLUS_BUTTON_SECONDARY})。
+
+</li>
+<li>
+对于以较低平台版本为目标的应用,
+{@link android.view.MotionEvent#getButtonState() getButtonState()} 方法返回
+{@link android.view.MotionEvent#BUTTON_SECONDARY}(按下触控笔主按键时)、
+{@link android.view.MotionEvent#BUTTON_TERTIARY}(按下触控笔辅助按键时)之一或同时返回这两者。
+</li>
+</ul>
+
+<h2 id="ble-scanning">改进的蓝牙低功耗扫描</h2>
+<p>
+如果您的应用执行蓝牙低功耗扫描,可以使用新增的
+{@code android.bluetooth.le.ScanSettings.Builder.setCallbackType()} 方法指定您只希望在下列条件下通知回调:首次找到与设置的
+{@link android.bluetooth.le.ScanFilter} 匹配的播发数据包并且该数据包已有一段时间没有出现。
+
+这种扫描方法与旧平台版本中提供的方法相比更加节能。
+
+</p>
+
+<h2 id="hotspot">Hotspot 2.0 第 1 版支持</h2>
+<p>
+本预览版在 Nexus 6 和 Nexus 9 设备上添加了对 Hotspot 2.0 第 1 版规范的支持。如需在您的应用中设置 Hotspot 2.0 凭据,请使用新增的
+{@link android.net.wifi.WifiEnterpriseConfig} 类方法,如 {@code setPlmn()} 方法和
+{@code setRealm()} 方法。
+在 {@link android.net.wifi.WifiConfiguration} 对象中,您可以设置
+{@link android.net.wifi.WifiConfiguration#FQDN} 字段和 {@code providerFriendlyName} 字段。
+新增的 {@code ScanResult.PasspointNetwork} 属性可指示检测到的网络是否为 Hotspot 2.0 接入点。
+
+</p>
+
+<h2 id="4K-display">4K 显示模式</h2>
+<p>现在,平台允许应用在兼容硬件上请求将显示分辨率升级到 4K 渲染。
+如需查询当前物理分辨率,请使用新增的
+{@code android.view.Display.Mode} API。请注意,如果 UI 是以较低逻辑分辨率绘制并通过放大达到更高的物理分辨率,则
+{@code Display.Mode.getPhysicalWidth()} 方法返回的物理分辨率可能不同于 {@link android.view.Display#getSize(android.graphics.Point) getSize()} 所报告的逻辑分辨率。
+
+</p>
+
+<p>您可以通过设置应用窗口的 {@code WindowManager.LayoutParams.preferredDisplayModeId} 属性请求系统更改应用运行时的物理分辨率。
+如果您想切换到 4K 显示分辨率,此功能会很有帮助。
+在 4K 显示模式下,UI 仍然以原始分辨率(如 1080p)渲染,通过放大达到 4K,但
+{@link android.view.SurfaceView} 对象可能会以原生分辨率显示内容。
+</p>
+
+<h2 id="behavior-themeable-colorstatelists">主题化 ColorStateList</h2>
+<p>对于运行 M 预览版的设备,现在支持在
+{@link android.content.res.ColorStateList} 中使用主题属性。
+{@link android.content.res.Resources#getColorStateList(int) getColorStateList()} 方法和
+{@link android.content.res.Resources#getColor(int) getColor()} 方法已弃用。如果您要调用这些 API,请改为调用新增的 {@code Context.getColorStateList()} 方法或
+{@code Context.getColor()} 方法。
+还可在 v4 appcompat 库中通过 {@link android.support.v4.content.ContextCompat} 使用这些方法。
+</p>
+
+<h2 id="audio">音频功能</h2>
+
+<p>本预览版增强了 Android 上的音频处理功能,包括: </p>
+<ul>
+ <li>通过新增的 {@code android.media.midi} API 提供了对 <a href="http://en.wikipedia.org/wiki/MIDI" class="external-link">MIDI</a>
+ 协议的支持。使用这些 API 可发送和接收 MIDI 事件。
+</li>
+ <li>新增了 {@code android.media.AudioRecord.Builder} 类和 {@code android.media.AudioTrack.Builder}
+ 类,分别用于创建数字音频采集和回放对象,还可用于配置音频源和接收器属性来替代系统默认值。
+</li>
+ <li>用于关联音频和输入设备的 API 钩子。如果您的应用允许用户通过与 Android TV 相连的游戏控制器或遥控器启动语音搜索,此功能尤为有用。系统会在用户启动搜索时调用新增的 {@code android.app.Activity.onSearchRequested()} 回调。
+
+
+如需确定用户的输入设备是否内置麦克风,请从该回调检索 {@link android.view.InputDevice} 对象,然后调用新增的
+{@code InputDevice.hasMic()} 方法。
+</li>
+ <li>新增了 {@code android.media.AudioDevicesManager} 类,让您可以检索连接的所有源设备和接收器音频设备列表。
+如果您想让应用在音频设备连接或断开时收到通知,还可以指定一个
+{@code android.media.OnAudioDeviceConnectionListener} 对象。
+</li>
+</ul>
+
+<h2 id="video">视频功能</h2>
+<p>本预览版为视频处理 API 添加了新功能,包括:</p>
+<ul>
+<li>新增了 {@code android.media.MediaSync} 类,可帮助应用同步渲染音频流和视频流。
+音频缓冲区以非锁定方式提交,并通过回调返回。
+此外,它还支持动态回放速率。
+</li>
+<li>新增了 {@code MediaDrm.EVENT_SESSION_RECLAIMED} 事件,它表示应用打开的会话已被资源管理器收回。
+如果您的应用使用 DRM 会话,则应处理此事件,并确保不使用收回的会话。
+
+</li>
+<li>新增了 {@code MediaCodec.CodecException.ERROR_RECLAIMED} 错误代码,它表示资源管理器收回了编解码器使用的媒体资源。
+出现此异常时,必须释放编解码器,因为它已转入终止状态。
+
+</li>
+<li>新增了 {@code MediaCodecInfo.CodecCapabilities.getMaxSupportedInstances()} 接口,用于获取有关支持的编解码器实例最大并发数量的提示。
+
+</li>
+<li>新增了 {@code MediaPlayer.setPlaybackParams()} 方法,用于设置快动作回放或慢动作回放的媒体回放速率。
+此外,它还会随视频一起自动拉长或加速音频回放。
+</li>
+</ul>
+
+<h2 id="camera">相机功能</h2>
+<p>本预览版提供了下列用于访问相机闪光灯和相机图像再处理的新 API:
+</p>
+
+<h3 id="flashlight">闪光灯 API</h3>
+<p>如果相机设备带有闪光灯,您可以通过调用 {@code CameraManager.setTorchMode()}
+ 方法,在不打开相机设备的情况下打开或关闭闪光灯的火炬模式。应用对闪光灯或相机设备不享有独占所有权。
+每当相机设备不可用,或者开启火炬的其他相机资源不可用时,火炬模式即会被关闭并变为不可用状态。
+
+其他应用也可调用 {@code setTorchMode()} 来关闭火炬模式。
+当最后一个开启火炬模式的应用关闭时,火炬模式就会被关闭。
+</p>
+
+<p>您可以注册一个回调,通过调用
+{@code CameraManager.registerTorchCallback()} 方法接收有关火炬模式状态的通知。第一次注册回调时,系统会立即调用它,并返回所有当前已知配备闪光灯的相机设备的火炬模式状态。
+
+如果成功开启或关闭火炬模式,系统会调用
+{@code CameraManager.TorchCallback.onTorchModeChanged()} 方法。</p>
+
+<h3 id="reprocessing">再处理 API</h3>
+<p>{@link android.hardware.camera2 Camera2} API 进行了扩展,以支持 YUV 和专用不透明格式图像再处理。
+您的应用通过 {@code CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES} 确定再处理功能是否可用。
+如果设备支持再处理,您可以通过调用
+{@code CameraDevice.createReprocessableCaptureSession()} 创建一个可再处理的相机捕获会话并创建输入缓冲区再处理请求。
+
+</p>
+
+<p>使用 {@code ImageWriter} 类可将输入缓冲区流与相机再处理输入相连。
+如需获得空白缓冲区,请遵循以下编程模型:</p>
+
+<ol>
+<li>调用 {@code ImageWriter.dequeueInputImage()} 方法。</li>
+<li>在输入缓冲区中填充数据。</li>
+<li>通过调用 {@code ImageWriter.queueInputImage()} 方法将缓冲区发送至相机。</li>
+</ol>
+
+<p>如果您将 {@code ImageWriter} 对象与
+{@code android.graphics.ImageFormat.PRIVATE} 图像一起使用,您的应用并不能直接访问图像数据。
+请改为调用 {@code ImageWriter.queueInputImage()} 方法,将 {@code ImageFormat.PRIVATE} 图像直接传递给
+{@code ImageWriter},而无需进行任何缓冲区复制。
+</p>
+
+<p>{@code ImageReader} 类现在支持 {@code android.graphics.ImageFormat.PRIVATE} 格式图像流。
+凭借此支持特性,您的应用可使
+{@code ImageReader} 输出图像保持为循环图像队列,还可选择一个或多个图像并将其发送给
+{@code ImageWriter} 进行相机再处理。</p>
+
+<h2 id="afw">Android for Work 功能</h2>
+<p>本预览版提供了下列用于 Android for Work 的新 API:</p>
+<ul>
+ <li><strong>用于企业所有、单一用途设备的增强型控件</strong>:现在,设备所有者可以通过控制以下设置来改善企业所有、单一用途 (COSU) 设备的管理:
+
+
+ <ul>
+ <li>通过
+{@code DevicePolicyManager.setKeyguardEnabledState()} 方法禁用或重新启用键盘锁。</li>
+ <li>通过
+{@code DevicePolicyManager.setStatusBarEnabledState()} 方法禁用或重新启用状态栏(包括快速设置、通知以及启动 Google Now 的向上划动手势)。
+</li>
+ <li>通过 {@link android.os.UserManager} 常量
+{@code DISALLOW_SAFE_BOOT} 禁用或重新启用安全启动</li>
+ <li>通过
+{@link android.provider.Settings.Global} 常量 {@code STAY_ON_WHILE_PLUGGED_IN} 防止屏幕在插入电源的情况下关闭。</li>
+ </ul>
+ </li>
+ <li><strong>设备所有者静默式安装和卸载应用</strong>:现在,设备所有者可使用 {@link android.content.pm.PackageInstaller}
+ API 在不依赖 Google Play for Work 的情况下静默式安装和卸载应用。
+现在,您可以通过设备所有者配置设备,从而无需用户干预即可获取并安装应用。
+此功能可用于在不激活 Google 帐户的情况下实现信息亭或其他此类设备的一键式配置。
+</li>
+<li><strong>静默式企业证书访问</strong>:现在,当应用调用
+{@link android.security.KeyChain#choosePrivateKeyAlias(android.app.Activity,android.security.KeyChainAliasCallback,java.lang.String[],java.security.Principal[],java.lang.String,int,java.lang.String) choosePrivateKeyAlias()} 时,配置文件所有者或设备所有者可以在系统提示用户选择证书前调用 {@code DeviceAdminReceiver.onChoosePrivateKeyAlias()} 方法,静默式向发出请求的应用提供别名。
+
+
+此功能让您可以在无需用户干预的情况下授予托管应用访问证书的权限。
+</li>
+<li><strong>自动接受系统更新</strong>。现在,设备所有者可以通过
+{@code DevicePolicyManager.setSystemUpdatePolicy()} 设置一个系统更新政策来自动接受系统更新(例如对于信息亭设备),或者推迟更新并在至多 30 天的时间内防止用户获取更新。
+
+此外,管理员还可设置每日必须获取更新的时间窗口,例如在信息亭设备无人使用的时段。
+有可用的系统更新时,系统会检查工作政策控制器应用是否设置了系统更新政策,并相应地执行操作。
+
+
+</li>
+<li>
+<strong>授权证书安装</strong>:配置文件所有者或设备所有者现在可以授权第三方应用调用以下 {@link android.app.admin.DevicePolicyManager} 证书管理 API:
+
+
+<ul>
+ <li>{@link android.app.admin.DevicePolicyManager#getInstalledCaCerts(android.content.ComponentName)
+getInstalledCaCerts()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#hasCaCertInstalled(android.content.ComponentName,byte[])
+hasCaCertInstalled()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#installCaCert(android.content.ComponentName,byte[])
+installCaCert()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#uninstallCaCert(android.content.ComponentName,byte[])
+uninstallCaCert()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#uninstallAllUserCaCerts(android.content.ComponentName)
+uninstallAllUserCaCerts()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#installKeyPair(android.content.ComponentName,java.security.PrivateKey,java.security.cert.Certificate,java.lang.String)
+installKeyPair()}</li>
+</ul>
+</li>
+<li><strong>企业恢复出厂设置保护</strong>:现在,配置设备所有者时,您可以通过设置
+{@code DeviceManagerPolicy.EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS} 捆绑包配置参数来解锁恢复出厂设置保护 (FRP)。
+在重置设备以解锁 FRP 和配置设备之后,NFC 编程器应用可提供这些参数,而无需事先配置 Google 帐户。
+
+如果您不修改这些参数,FRP 仍然发挥作用,必须使用之前激活的 Google 凭据方可激活设备。
+
+
+<p>此外,通过对 Google Play 服务设置应用限制,设备所有者可以指定用于 FRP 解锁的备用 Google 帐户,以替代在设备上激活的 Google 帐户。
+</p>
+</li>
+<img src="{@docRoot}preview/images/work-profile-screen.png" srcset="{@docRoot}preview/images/work-profile-screen.png 1x, {@docRoot}preview/images/work-profile-screen_2x.png 2x" style="float:right; margin:0 0 10px 20px" width="282" height="476" />
+<li><strong>数据使用情况跟踪</strong>。现在,配置文件所有者或设备所有者可以利用新增的
+{@code android.app.usage.NetworkStatsManager} 方法查询<strong>设置 &gt; 数据使用情况</strong>中显示的数据使用情况统计信息。
+配置文件所有者会被自动授予查询其管理的配置文件相关数据的权限,而设备所有者则被授予对其管理的主要用户使用情况数据的访问权。
+
+</li>
+<li><strong>运行时权限管理</strong>:
+<p>配置文件所有者或设备所有者可以利用
+{@code DevicePolicyManager.setPermissionPolicy()} 设置适用于所有应用全部运行时请求的权限政策,以提示用户照常授予权限,或自动以静默方式授予或拒绝权限。
+
+如果设置后一种政策,则用户将无法修改配置文件所有者或设备所有者在应用权限屏幕的<strong>设置</strong>内所做的选择。
+
+</p></li>
+<li><strong>“设置”中的 VPN</strong>:现在,<strong>设置 &gt; 更多 &gt; VPN</strong> 中会显示 VPN 应用。此外,现在,关于 VPN 使用情况的通知取决于该 VPN 的配置方式。
+
+
+对于配置文件所有者,通知取决于该 VPN 是针对托管配置文件、个人配置文件还是同时针对这两者进行配置。
+对于设备所有者,通知取决于 VPN 是否针对整个设备进行配置。
+</li>
+<li><strong>工作状态通知</strong>:现在,每当来自托管配置文件的应用具有前台活动时,状态栏就会出现一个公文包图标。
+此外,如果设备直接解锁到托管配置文件中某个应用的活动,则会显示一个 Toast,通知用户他们位于托管配置文件内。
+
+
+</li>
+</ul>
+
+<p class="note">
+ 如需详细了解 M 开发者预览版中的所有 API 变更,请参阅 <a href="{@docRoot}preview/download.html">API 差异报告</a>。
+</p>
diff --git a/docs/html-intl/intl/zh-cn/preview/behavior-changes.jd b/docs/html-intl/intl/zh-cn/preview/behavior-changes.jd
new file mode 100644
index 0000000..39494b9
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/preview/behavior-changes.jd
@@ -0,0 +1,402 @@
+page.title=行为变更
+page.keywords=预览版,sdk,兼容性
+sdk.platform.apiLevel=MNC
+@jd:body
+
+<div id="qv-wrapper">
+<div id="qv">
+
+<h2>本文内容</h2>
+
+<ol id="toc44" class="hide-nested">
+ <li><a href="#behavior-runtime-permissions">运行时权限</a></li>
+ <li><a href="#behavior-power">节能优化</a>
+ <ol>
+ <li><a href="#behavior-doze">打盹</a></li>
+ <li><a href="#behavior-app-standby">应用待机</a></li>
+ </ol>
+ </li>
+ <li><a href="#behavior-adoptable-storage">可采用的存储设备</a></li>
+ <li><a href="#behavior-apache-http-client">取消支持 Apache HTTP 客户端</a></li>
+ <li><a href="#behavior-audiomanager-Changes">音频管理器变更</a></li>
+ <li><a href="#behavior-test-selection">文本选择</a></li>
+ <li><a href="#behavior-keystore">Android 密钥库变更</a></li>
+ <li><a href="#behavior-network">Wi-Fi 和网络连接变更</a></li>
+ <li><a href="#behavior-camera">相机服务变更</a></li>
+ <li><a href="#behavior-art-runtime">ART 运行时</a></li>
+ <li><a href="#behavior-apk-validation">APK 验证</a></li>
+ <li><a href="#behavior-afw">Android for Work 变更</a></li>
+</ol>
+
+<h2>API 差异</h2>
+<ol>
+<li><a href="{@docRoot}preview/download.html">API 级别 22 至 M 预览版&raquo;</a> </li>
+</ol>
+
+
+<h2>另请参阅</h2>
+<ol>
+<li><a href="{@docRoot}preview/api-overview.html">M 开发者预览版 API 概览</a> </li>
+</ol>
+
+</div>
+</div>
+
+<p>M 开发者预览版除了提供诸多新特性和功能外,还对系统和 API 行为做出了各种变更。
+本文重点介绍您应该了解并在开发应用时加以考虑的一些重要变更。
+</p>
+
+<p>如果您之前发布过 Android 应用,请注意您的应用可能受到这些平台变更的影响。
+</p>
+
+<h2 id="behavior-runtime-permissions">运行时权限</h1>
+<p>本预览版引入了一种新的权限模型,如今,用户可直接在运行时管理应用权限。
+这种模型让用户能够更好地了解和控制权限,同时为应用开发者精简了安装和自动更新过程。用户可为所安装的各个应用分别授予或撤销权限。
+
+ </p>
+
+<p>对于面向 M 预览版开发的应用,请务必在运行时检查和请求权限。
+如需确定您的应用是否已被授予权限,请调用新增的 {@code Context.checkSelfPermission()} 方法。
+如需请求权限,请调用新增的
+{@code Activity.requestPermission()} 方法。即使您的应用不是针对 M 开发的,您也应该在新权限模型下测试您的应用。
+</p>
+
+<p>如需了解有关在您的应用中支持新权限模型的详细信息,请参阅开发者预览版的<a href="{@docRoot}preview/features/runtime-permissions.html">权限</a>页面。
+
+如需了解如何评估新模型对应用的影响,请参阅<a href="{@docRoot}preview/testing/guide.html#runtime-permissions">测试指南</a>。
+</p>
+
+<h2 id="behavior-power">节能优化</h2>
+<p>本预览版引入了针对空闲设备和应用的最新节能优化技术。</p>
+
+<h3 id="behavior-doze">打盹</h3>
+<p>如果设备未插入电源,并在屏幕关闭后的一段时间内保持不活动状态,则会进入<em>打盹</em>模式,在该模式下设备会尝试让系统保持休眠状态。
+在该模式下,设备会定期短时间恢复正常工作,以便进行应用同步,还可让系统执行任何挂起的操作。
+
+</p>
+
+<p>在打盹模式下,您的应用会受到以下限制:</p>
+<ul>
+<li>网络访问被禁用,除非您的应用获得高优先级 Google Cloud Messaging 操作消息 (tickle)。
+</li>
+<li><a href="{@docRoot}reference/android/os/PowerManager.WakeLock.html">唤醒锁</a>会被忽略。</li>
+<li>通过 {@link android.app.AlarmManager} 类设置的闹铃会被禁用,但通过 {@link android.app.AlarmManager#setAlarmClock setAlarmClock()} 方法和 {@code AlarmManager.setAndAllowWhileIdle()} 方法设置的闹铃除外。
+
+</li>
+<li>不执行 WiFi 扫描</li>
+<li>不允许运行同步适配器和 {@link android.app.job.JobScheduler} 的同步和作业。
+</li>
+</ul>
+</p>
+<p>当设备退出打盹模式时,它会执行任何挂起的作业和同步。</p>
+<p>您可以通过将运行 M 预览版的设备与您的开发计算机相连,并调用以下命令来测试此功能:
+
+</p>
+<pre class="no-prettyprint">
+$ adb shell dumpsys battery unplug
+$ adb shell dumpsys deviceidle step
+$ adb shell dumpsys deviceidle -h
+</pre>
+<p class="note"><strong>注</strong>:即将推出的
+<a href="https://developers.google.com/cloud-messaging/" class="external-link">
+ Google Cloud Messaging</a> 版本允许您指定高优先级消息。
+如果您的应用收到高优先级 GCM 消息,即使设备处于打盹模式,系统也会向其授予短时间的网络访问权限。
+
+</p>
+
+<p>如需了解在您的应用中测试打盹模式的技巧,请参阅
+<a href="{@docRoot}preview/testing/guide.html#doze-standby">测试指南</a>。
+ </p>
+
+<h3 id="behavior-app-standby">应用待机</h3>
+<p>使用本预览版时,系统会在应用未被主动使用时确定其处于空闲状态。
+除非系统检测到以下信号之一,否则将在一段时间后将您的应用视为处于空闲状态:
+</p>
+
+<ul>
+<li>用户显式启动应用。</li>
+<li>应用当前有一个进程位于前台(表现为活动或前台服务形式,或被另一活动或前台服务占用)。
+</li>
+<li>应用生成用户可在锁屏或通知托盘中看到的通知。
+</li>
+<li>用户通过<strong>设置</strong>显式请求不对应用进行优化。
+</li>
+</ul>
+
+<p>如果设备未插入电源,系统会将被视为处于空闲状态的应用的网络访问禁用,并暂停其同步和作业。
+当设备插入电源时,系统将允许这些应用访问网络并执行任何挂起的作业和同步。
+如果设备长时间处于空闲状态,系统将按每天大约一次的频率允许空闲状态的应用访问网络。
+</p>
+
+<p>您可以通过将运行 M 预览版的设备与您的开发计算机相连,并调用以下命令来测试此功能:
+
+</p>
+<pre class="no-prettyprint">
+$ adb shell dumpsys battery unplug
+$ adb shell am set-idle &lt;packageName&gt; true
+$ adb shell am set-idle &lt;packageName&gt; false
+$ adb shell am get-idle &lt;packageName&gt;
+</pre>
+
+<p class="note"><strong>注</strong>:即将推出的
+<a href="https://developers.google.com/cloud-messaging/" class="external-link">
+ Google Cloud Messaging</a> (GCM) 版本允许您指定高优先级消息。
+如果您的应用收到高优先级 GCM 消息,即使其处于空闲状态,也会被授予短时间的网络访问权限。
+
+</p>
+
+<p>如需了解在您的应用中测试应用待机的技巧,请参阅
+<a href="{@docRoot}preview/testing/guide.html#doze-standby">测试指南</a>。
+ </p>
+
+<h2 id="behavior-adoptable-storage">可采用的存储设备</h2>
+<p>
+使用本预览版时,用户可以<em>采用</em> SD 卡等外部存储设备。采用外部存储设备可加密和格式化设备,使其具有类似内部存储设备的行为。
+用户可以利用此特性在存储设备之间移动应用及其私有数据。
+移动应用时,系统会遵守清单文件中的
+<a href="{@docRoot}guide/topics/manifest/manifest-element.html#install">{@code android:installLocation}</a>
+ 首选项。
+</p>
+
+<p>请注意,在内部存储设备与外部存储设备之间移动应用时,如果您的应用访问以下 API 或字段,它们返回的文件路径将会动态变化。郑重建议:在生成文件路径时,请始终动态调用这些 API。请勿使用硬编码文件路径或之前生成的永久性完全限定文件路径。
+
+
+</p>
+
+<ul>
+<li>{@link android.content.Context} 方法:
+ <ul>
+ <li>{@link android.content.Context#getFilesDir() getFilesDir()}</li>
+ <li>{@link android.content.Context#getCacheDir() getCacheDir()}</li>
+ <li>{@link android.content.Context#getCodeCacheDir() getCodeCacheDir()}</li>
+ <li>{@link android.content.Context#getDatabasePath(java.lang.String) getDatabasePath()}</li>
+ <li>{@link android.content.Context#getDir(java.lang.String,int) getDir()}</li>
+ <li>{@link android.content.Context#getNoBackupFilesDir() getNoBackupFilesDir()}</li>
+ <li>{@link android.content.Context#getFileStreamPath(java.lang.String) getFileStreamPath()}</li>
+ <li>{@link android.content.Context#getPackageCodePath() getPackageCodePath()}</li>
+ <li>{@link android.content.Context#getPackageResourcePath() getPackageResourcePath()}</li>
+ </ul>
+</li>
+<li>{@link android.content.pm.ApplicationInfo} 字段:
+ <ul>
+ <li>{@link android.content.pm.ApplicationInfo#dataDir dataDir}</li>
+ <li>{@link android.content.pm.ApplicationInfo#sourceDir sourceDir}</li>
+ <li>{@link android.content.pm.ApplicationInfo#nativeLibraryDir nativeLibraryDir}</li>
+ <li>{@link android.content.pm.ApplicationInfo#publicSourceDir publicSourceDir}</li>
+ <li>{@link android.content.pm.ApplicationInfo#splitSourceDirs splitSourceDirs}</li>
+ <li>{@link android.content.pm.ApplicationInfo#splitPublicSourceDirs splitPublicSourceDirs}</li>
+ </ul>
+</li>
+</ul>
+
+<p>如需在开发者预览版中调试此功能,您可以将一个 USB 驱动器通过一根 USB On-The-Go (OTG) 电缆连接到 Android 设备并运行以下命令启用对该 USB 驱动器的采用:
+</p>
+
+<pre class="no-prettyprint">
+$ adb shell sm set-force-adoptable true
+</pre>
+
+<h2 id="behavior-apache-http-client">取消支持 Apache HTTP 客户端</h2>
+<p>本预览版取消了对 Apache HTTP 客户端的支持。如果您的应用使用该客户端,并以 Android 2.3(API 级别 9)或更高版本为目标平台,请改用 {@link java.net.HttpURLConnection} 类。
+
+此 API 效率更高,因为它可以通过透明压缩和响应缓存减少网络使用,并可最大限度降低耗电量。
+如需继续使用 Apache HTTP API,您必须先在 {@code build.gradle} 文件中声明以下编译时依赖项:
+
+</p>
+<pre>
+android {
+ useLibrary 'org.apache.http.legacy'
+}
+</pre>
+<p>Android 正在从使用 OpenSSL 库转向使用
+<a href="https://boringssl.googlesource.com/boringssl/" class="external-link">BoringSSL</a>
+ 库。如果您要在应用中使用 Android NDK,请勿链接到并非 NDK API 组成部分的加密库,如 {@code libcrypto.so} 和 {@code libssl.so}。
+这些库并非公共 API,可能会在不同版本和设备上毫无征兆地发生变化或出现故障。此外,您还可能让自己暴露在安全漏洞的风险之下。
+
+请改为修改原生代码,以通过 JNI 调用 Java 加密 API,或静态链接到您选择的加密库。
+
+</p>
+
+<h2 id="behavior-audiomanager-Changes">音频管理器变更</h2>
+<p>不再支持通过 {@link android.media.AudioManager}
+ 类直接设置音量或将特定音频流静音。{@link android.media.AudioManager#setStreamSolo(int,boolean)
+setStreamSolo()} 方法已弃用,您应该改为调用
+{@code AudioManager.requestAudioFocus()} 方法。类似地,
+{@link android.media.AudioManager#setStreamMute(int,boolean) setStreamMute()} 方法也已弃用,请改为调用 {@code AudioManager.adjustStreamVolume()} 方法并传入方向值 {@code ADJUST_MUTE} 或 {@code ADJUST_UNMUTE}。
+
+</p>
+
+<h2 id="behavior-test-selection">文本选择</h2>
+
+<img src="{@docRoot}preview/images/text-selection.gif" style="float:right; margin:0 0 20px 30px" width="360" height="640" />
+
+<p>现在,当用户在您的应用中选择文本时,您可以在一个<a href="http://www.google.com/design/spec/patterns/selection.html#selection-text-selection" class="external-link">浮动工具栏</a>中显示“剪切”<em></em>、“复制”<em></em>和“粘贴”<em></em>等文本选择操作。
+
+其在用户交互实现上与<a href="{@docRoot}guide/topics/ui/menus.html#CABforViews">为单个视图启用上下文操作模式</a>中所述的上下文操作栏类似。
+
+
+</p>
+
+<p>如需实现可用于文本选择的浮动工具栏,请在您的现有应用中做出以下更改:
+</p>
+<ol>
+<li>在 {@link android.view.View} 对象或 {@link android.app.Activity} 对象中,将
+{@link android.view.ActionMode} 调用从
+{@code startActionMode(Callback)} 更改为 {@code startActionMode(Callback, ActionMode.TYPE_FLOATING)}。</li>
+<li>改为使用 {@code ActionMode.Callback} 的现有实现扩展
+{@code ActionMode.Callback2}。</li>
+<li>替代 {@code Callback2.onGetContentRect()} 方法,用于提供 {@link android.graphics.Rect} 内容对象(如文本选择矩形)在视图中的坐标。
+</li>
+<li>如果矩形的定位不再有效,并且这是唯一需要声明为无效的元素,请调用 {@code ActionMode.invalidateContentRect()} 方法。
+</li>
+</ol>
+
+<p>请注意,如果您使用 <a href="{@docRoot}tools/support-library/index.html">
+ Android Support Library</a> 22.2 修订版,浮动工具栏不向后兼容,默认情况下 appcompat 会获得对 {@link android.view.ActionMode} 对象的控制权。
+
+这会禁止显示浮动工具栏。如需在
+{@link android.support.v7.app.AppCompatActivity} 中启用
+{@link android.view.ActionMode} 支持,请调用
+{@code android.support.v7.app.AppCompatActivity.getDelegate()},然后对返回的
+{@link android.support.v7.app.AppCompatDelegate} 调用
+{@code android.support.v7.app.AppCompatDelegate.setHandleNativeActionModesEnabled()},并将输入参数设置为 {@code false}。
+此调用会将 {@link android.view.ActionMode} 对象的控制权交还给框架。
+在运行 M 预览版的设备上,框架可以支持
+{@link android.support.v7.app.ActionBar} 模式或浮动工具栏模式;而在运行 M 预览版之前版本的设备上,框架仅支持 {@link android.support.v7.app.ActionBar} 模式。
+</p>
+
+<h2 id="behavior-keystore">Android 密钥库变更</h2>
+<p>使用本预览版时,
+<a href="{@docRoot}training/articles/keystore.html">Android 密钥库提供程序</a>不再支持 DSA,
+但仍支持 ECDSA。</p>
+
+<p>禁用或重置安全锁屏时(例如,由用户或设备管理员执行此类操作时),系统将不再删除需要闲时加密的密钥,
+但在上述事件期间会删除需要闲时加密的密钥。
+</p>
+
+<h2 id="behavior-network">Wi-Fi 和网络连接变更</h2>
+
+<p>本预览版对 Wi-Fi 和网络连接 API 引入了以下行为变更。</p>
+<ul>
+<li>现在,您的应用只能更改由您创建的 {@link android.net.wifi.WifiConfiguration} 对象的状态。
+系统不允许您修改或删除由用户或其他应用创建的
+{@link android.net.wifi.WifiConfiguration} 对象;
+</li>
+<li>
+在之前的版本中,如果应用利用带有
+{@code disableAllOthers=true} 设置的
+{@link android.net.wifi.WifiManager#enableNetwork(int,boolean) enableNetwork()} 强制设备连接特定 Wi-Fi 网络,设备将会断开与蜂窝数据网络等其他网络的连接。
+在本预览版中,设备不再断开与上述其他网络的连接。如果您的应用的 {@code targetSdkVersion} 为 {@code “20”} 或更低,则会固定连接所选 Wi-Fi 网络。
+
+如果您的应用的 {@code targetSdkVersion} 为 {@code “21”} 或更高,请使用多网络 API(如
+{@link android.net.Network#openConnection(java.net.URL) openConnection()} 、
+{@link android.net.Network#bindSocket(java.net.Socket) bindSocket()} 和新增的
+{@code ConnectivityManager.bindProcessToNetwork()} 方法)来确保通过所选网络传送网络流量。
+
+</li>
+</ul>
+
+<h2 id="behavior-camera">相机服务变更</h2>
+<p>在本预览版中,相机服务中共享资源的访问模式已从之前的“先到先得”访问模式更改为高优先级进程优先的访问模式。
+
+对服务行为的变更包括:</p>
+<ul>
+<li>根据客户端应用进程的“优先级”授予对相机子系统资源的访问权,包括打开和配置相机设备。
+带有对用户可见活动或前台活动的应用进程一般会被授予较高的优先级,从而使相机资源的获取和使用更加可靠;
+
+</li>
+<li>当高优先级的应用尝试使用相机时,系统可能会“驱逐”正在使用相机客户端的低优先级应用。
+在已弃用的 {@link android.hardware.Camera} API 中,这会导致系统为被驱逐的客户端调用
+{@link android.hardware.Camera.ErrorCallback#onError(int,android.hardware.Camera) onError()}。
+
+在 {@link android.hardware.camera2 Camera2} API 中,这会导致系统为被驱逐的客户端调用
+{@link android.hardware.camera2.CameraDevice.StateCallback#onDisconnected(android.hardware.camera2.CameraDevice) onDisconnected()};
+</li>
+<li>在配备相应相机硬件的设备上,不同的应用进程可同时独立打开和使用不同的相机设备。
+但现在,如果在多进程用例中同时访问相机会造成任何打开的相机设备的性能或能力严重下降,相机服务会检测到这种情况并禁止同时访问。
+
+即使并没有其他应用直接尝试访问同一相机设备,此变更也可能导致低优先级客户端被“驱逐”。
+
+
+</li>
+<li>
+更改当前用户会导致之前用户帐户拥有的应用内活动相机客户端被驱逐。
+对相机的访问仅限于访问当前设备用户拥有的用户个人资料。举例来说,这意味着,当用户切换到其他帐户后,“来宾”帐户实际上无法让使用相机子系统的进程保持运行状态。
+
+
+</li>
+</ul>
+
+<h2 id="behavior-art-runtime">ART 运行时</h2>
+<p>ART 运行时现在可正确实现
+{@link java.lang.reflect.Constructor#newInstance(java.lang.Object...) newInstance()} 方法的访问规则。此变更修正了之前版本中 Dalvik 无法正确检查访问规则的问题。如果您的应用使用
+{@link java.lang.reflect.Constructor#newInstance(java.lang.Object...) newInstance()} 方法,并且您想替代访问检查,请调用
+{@link java.lang.reflect.Constructor#setAccessible(boolean) setAccessible()} 方法(将输入参数设置为 {@code true})。
+
+
+
+如果您的应用使用
+<a href="{@docRoot}tools/support-library/features.html#v7-appcompat">v7 appcompat 库</a>或
+<a href="{@docRoot}tools/support-library/features.html#v7-recyclerview">v7 recyclerview 库</a>,则您必须更新应用以使用这些库的最新版本。
+否则,请务必更新从 XML 引用的任何自定义类,以便能够访问它们的类构造函数。
+</p>
+
+<p>本预览版更新了动态链接程序的行为。动态链接程序现在可以识别库的 {@code soname} 与其路径之间的差异(<a href="https://code.google.com/p/android/issues/detail?id=6670" class="external-link">
+公开 bug 6670</a>),并且现在已实现了按 {@code soname} 搜索。
+
+
+之前包含错误的 {@code DT_NEEDED} 条目(通常是开发计算机文件系统上的绝对路径)却仍工作正常的应用,如今可能会出现加载失败。
+</p>
+
+<p>现已正确实现 {@code dlopen(3) RTLD_LOCAL} 标志。请注意,
+{@code RTLD_LOCAL} 是默认值,因此不显式使用
+{@code RTLD_LOCAL} 的 {@code dlopen(3)} 调用将受到影响(除非您的应用显式使用 {@code RTLD_GLOBAL})。使用
+{@code RTLD_LOCAL} 时,在随后通过调用
+{@code dlopen(3)} 加载的库中并不能使用这些符号(这与由 {@code DT_NEEDED} 条目引用的情况截然不同)。</p>
+</p>
+
+<h2 id="behavior-apk-validation">APK 验证</h2>
+<p>该平台现在执行的 APK 验证更为严格。如果在清单文件中声明的文件在 APK 中并不存在,该 APK 将被视为已损坏。
+移除任何内容后必须重新签署 APK。
+</p>
+
+<h2 id="behavior-afw">Android for Work 变更</h2>
+<p>本预览版包含下列针对 Android for Work 的行为变更:</p>
+<ul>
+<li><strong>个人上下文中的工作联系人。</strong>Google Dialer Call Log 现在会在用户查看通话记录时显示工作联系人。将 {@code DevicePolicyManager.setCrossProfileCallerIdDisabled()} 设置为 {@code true} 可在 Google Dialer Call Log 中隐藏托管配置文件联系人。
+
+
+仅当您将 {@code DevicePolicyManager.setBluetoothContactSharingDisabled()} 设置为 {@code false} 时,才可以通过蓝牙将工作联系人随个人联系人一起显示给设备。
+
+默认情况下,它设置为 {@code true}。
+
+</li>
+<li><strong>WiFi 配置移除</strong>:现在,当删除某个托管配置文件时,将会移除由配置文件所有者添加的 WiFi 配置(例如,通过调用
+{@link android.net.wifi.WifiManager#addNetwork(android.net.wifi.WifiConfiguration)
+addNetwork()} 方法添加的配置);
+</li>
+<li><strong>WiFi 配置锁定</strong>:用户无法再修改或删除任何由活动设备所有者创建的 WiFi 配置。
+用户仍可创建和修改其自己的 WiFi 配置,前提是尚未针对该用户设置 {@link android.os.UserManager} 常量
+{@link android.os.UserManager#DISALLOW_CONFIG_WIFI}。
+</li>
+<li><strong>通过添加 Google 帐户下载工作策略控制器</strong>向托管环境以外的设备添加需要通过工作策略控制器 (WPC) 管理的 Google 帐户时,帐户添加流程现在会提示用户安装相应的 WPC。在设备初始设置向导中通过<strong>设置 &gt; 帐户</strong>添加帐户时,也会出现此行为。
+
+
+
+</li>
+<li><strong>对特定 DevicePolicyManager API 行为的变更</strong>:调用 {@link android.app.admin.DevicePolicyManager#setCameraDisabled(android.content.ComponentName,boolean) setCameraDisabled()} 方法只会影响调用该方法的用户的相机;从托管配置文件调用它不会影响主用户运行的相机应用。
+
+
+此外,
+{@link android.app.admin.DevicePolicyManager#setKeyguardDisabledFeatures(android.content.ComponentName,int) setKeyguardDisabledFeatures()} 方法现在除了可供设备所有者使用外,还可供配置文件所有者使用。
+配置文件所有者可设置以下键盘锁限制:
+
+<ul>
+<li>{@link android.app.admin.DevicePolicyManager#KEYGUARD_DISABLE_TRUST_AGENTS} 和
+{@link android.app.admin.DevicePolicyManager#KEYGUARD_DISABLE_FINGERPRINT},它们影响配置文件上级用户的键盘锁设置。
+</li>
+<li>{@link android.app.admin.DevicePolicyManager#KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS},它只影响应用在托管配置文件中生成的通知。
+</li>
+</ul>
+</li>
+</ul>
diff --git a/docs/html-intl/intl/zh-cn/preview/features/runtime-permissions.jd b/docs/html-intl/intl/zh-cn/preview/features/runtime-permissions.jd
new file mode 100644
index 0000000..94a6212
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/preview/features/runtime-permissions.jd
@@ -0,0 +1,794 @@
+page.title=权限
+page.tags=预览资源, androidm
+page.keywords=权限, 运行时, 预览
+page.image={@docRoot}preview/features/images/permissions_check.png
+@jd:body
+
+
+<div id="qv-wrapper">
+ <div id="qv">
+ <h2>内容快览</h2>
+ <ul>
+ <li>如果您的应用主要面向 M 预览版 SDK,则会在运行时(而非安装时)提示用户授予权限。
+</li>
+ <li>用户可以随时从应用“设置”屏幕撤销权限。
+</li>
+ <li>每次运行时,应用均需检查自身是否具备所需的权限。
+</li>
+ </ul>
+
+ <h2>本文内容</h2>
+ <ol>
+ <li><a href="#overview">概览</a></li>
+ <li><a href="#coding">为运行时权限编码</a></li>
+ <li><a href="#testing">测试运行时权限</a></li>
+ <li><a href="#best-practices">最佳做法</a></li>
+ </ol>
+
+<!--
+ <h2>Related Samples</h2>
+ <ol>
+ <li></li>
+ </ol>
+-->
+
+<!--
+ <h2>See also</h2>
+ <ol>
+ <li></li>
+ </ol>
+-->
+ </div> <!-- qv -->
+</div> <!-- qv-wrapper -->
+
+
+<p>
+ M 开发者预览版引入了一种新的应用权限模型,旨在简化用户安装和升级应用的过程。
+如果在 M 预览版上运行的应用支持新权限模型,则用户无需在安装或升级应用时授予任何权限。相反,应用会根据需要请求权限,且系统将向用户显示一个请求权限的对话框。
+
+
+
+
+</p>
+
+<p>
+ 如果应用支持新权限模型,则仍可在运行旧版 Android 的设备上使用旧权限模型安装并运行此应用。
+
+
+</p>
+
+<h2 id="overview">
+ 概览
+</h2>
+
+<p>
+ 通过 M 开发者预览版,该平台引入了新的应用权限模型。
+以下概述了此新模型的主要组件:
+</p>
+
+<ul>
+ <li>
+ <strong>声明权限:</strong>应用使用清单文件声明其所需的所有权限,就像在早期的 Android 平台中一样。
+
+ </li>
+
+ <li>
+ <strong>权限组:</strong>权限根据相应的功能分为若干
+<em>权限组</em>。例如,
+<code>CONTACTS</code> 权限组包含读取和写入用户联系人和个人资料信息的权限。
+
+ </li>
+
+ <li>
+ <p><strong>安装时授予的有限权限:</strong>当用户安装或更新应用时,系统将授予应用所请求的属于 {@link
+ android.content.pm.PermissionInfo#PROTECTION_NORMAL PROTECTION_NORMAL} 的所有权限。
+
+
+ 例如,闹铃和 Internet 权限属于 {@link
+ android.content.pm.PermissionInfo#PROTECTION_NORMAL PROTECTION_NORMAL},因此系统将在安装应用时自动授予这些权限。
+
+ </p>
+
+ <p>此外,系统还可以授予应用签名和系统权限,如<a href="#system-apps">系统应用和签名权限</a>中所述。
+
+系统不会在安装应用时提示用户授予任何权限。<em></em>
+</p>
+ </li>
+
+ <li>
+ <strong>用户在运行时授予权限:</strong>当应用请求权限时,系统将向用户显示一个对话框,然后调用应用的回调函数来通知它是否已授予权限。
+
+如果用户授予某项权限,则应用将获得应用清单文件中声明的、该权限功能区域中的所有权限。
+
+
+ </li>
+
+</ul>
+
+<p>
+ 对于需要权限的功能,此权限模型将改变应用的行为方式。
+以下概述了您调整此模型时所应遵循的开发实践:
+
+</p>
+
+<ul>
+
+ <li>
+ <strong>始终检查权限:</strong>当应用必须执行任何需要权限的操作时,应先检查它是否已具备该权限。
+
+如果没有,则请求授予该权限。
+
+ </li>
+
+ <li>
+ <strong>妥善处理权限不足的情况:</strong>如果应用未被授予适当的权限,则应正常处理失败情况。
+
+ 例如,如果只有新增的功能需要该权限,则应用可以禁用该功能。
+如果该权限对于应用正常运行至关重要,则应用可能会禁用其所有功能,并通知用户需要授予该权限。
+
+
+ </li>
+
+ <div class="figure" style="width:220px" id="fig-perms-screen">
+ <img src="{@docRoot}preview/features/images/app-permissions-screen_2x.png" srcset="{@docRoot}preview/features/images/app-permissions-screen.png 1x, {@docRoot}preview/features/images/app-permissions-screen_2x.png 2x" alt="" width="220">
+ <p class="img-caption">
+ <strong>图 1.</strong>应用“设置”中的“权限”屏幕。
+ </p>
+ </div>
+
+ <li>
+ <strong>权限可撤销:</strong>用户可以随时撤销应用的权限。
+即使用户禁用应用的权限,应用也不会收到通知。<em></em>
+再次强调:您的应用应在执行任何受限操作之前验证是否具备所需的权限。
+
+ </li>
+</ul>
+
+<p class="note">
+ <strong>注:</strong>如果应用主要面向 M 开发者预览版,则必须使用新权限模型。
+<em></em>
+</p>
+
+<p>
+ 截至 M 开发者预览版发布,并非所有 Google 应用均已完全实现新权限模型。
+Google 会在 M 开发者预览版运行期间更新这些应用,以便严格遵守权限切换设置。
+
+
+</p>
+
+<p class="note">
+ <strong>注:</strong>如果您的应用拥有自己的 API 接口,请先确保调用方具备访问该数据所需的必要权限,然后再代理权限。
+
+
+</p>
+
+<h3 id="system-apps">
+ 系统应用和签名权限
+</h3>
+
+<p>
+ 通常,当用户安装应用时,系统仅授予应用
+ {@link android.content.pm.PermissionInfo#PROTECTION_NORMAL
+ PROTECTION_NORMAL}。但在某些情况下,系统将授予应用更多权限:
+
+</p>
+
+<ul>
+ <li>如果应用是系统映像的一部分,则系统会自动授予该应用清单文件中列出的所有权限。
+
+ </li>
+
+ <li>如果应用请求提供清单文件中属于 {@link
+ android.content.pm.PermissionInfo#PROTECTION_SIGNATURE PROTECTION_SIGNATURE} 的权限,且该应用已使用与声明这些权限的应用相同的证书进行签名,则系统将在安装请求权限的应用时向其授予这些权限。
+
+
+
+ </li>
+</ul>
+
+<p>
+ 在这两种情况下,用户仍可随时撤销权限,具体方法是:转到系统的<strong>设置</strong>屏幕,然后选择<strong>应用 &gt;</strong>
+
+ <i>应用名称</i> <strong>&gt; 权限</strong>。应用应在运行时继续检查权限,并根据需要请求权限。
+
+
+</p>
+
+<h3 id="compatibility">
+ 前后兼容性
+</h3>
+
+<p>
+ 如果应用并非面向 M 开发者预览版,则即使是在 M 预览版设备上,该应用也会继续使用旧权限模型。
+当用户安装应用时,系统将要求用户授予应用清单文件中列出的所有权限。
+
+
+</p>
+
+<p class="note">
+ <strong>注:</strong>在运行 M 开发者预览版的设备上,用户可以从应用的“设置”屏幕禁用任何应用(包括旧版应用)的权限。
+
+如果用户禁用某旧版应用的权限,则系统将以静默方式禁用相应的功能。
+当应用尝试执行需要该权限的操作时,该操作不一定会导致出现异常。
+
+相反,它可能会返回空数据集、报告错误或以其他方式表现出异常行为。
+例如,如果您未经许可查询日历,则该方法会返回空数据集。
+
+</p>
+
+<p>
+ 如果您在未运行 M 预览版的设备上使用新权限模型安装应用,则系统将采用与其他任何应用相同的方式处理:系统会在安装应用时要求用户授予声明的所有权限。
+
+
+
+</p>
+
+<p class="note">
+ <strong>注:</strong>对于预览版本,您必须将最低 SDK 版本设置为 M 预览版 SDK,才可使用预览版 SDK 进行编译。
+这意味着在开发者预览版运行期间,您无法在旧版平台上测试此类应用。
+
+
+</p>
+
+<h3 id="perms-vs-intents">权限与意向的比较</h3>
+
+<p>
+ 许多情况下,您可以使用以下两种方式之一来让您的应用执行某项任务。
+您可以将应用设置为请求执行操作本身所需的权限。
+或者,您可以将应用设置为通过传送意向,让其他应用来执行任务。
+
+</p>
+
+<p>
+ 例如,假设应用需要能够使用设备相机拍摄照片。
+应用可以请求
+<code>android.permission.CAMERA</code> 权限,以便允许其直接访问相机。
+然后,应用将使用 Camera API 控制相机并拍摄照片。
+利用此方法,您的应用能够完全控制摄影过程,并支持您将相机 UI 合并至应用中。
+
+
+</p>
+
+<p>
+ 但是,如果您无需此类控制,则可仅使用 {@link
+ android.provider.MediaStore#ACTION_IMAGE_CAPTURE ACTION_IMAGE_CAPTURE} 意向来请求图像。
+启动该意向时,系统会提示用户选择相机应用(如果没有默认相机应用),然后该应用将拍摄照片。
+
+该相机应用会将照片返回给应用的 {@link
+ android.app.Activity#onActivityResult onActivityResult()} 方法。
+</p>
+
+<p>
+ 同样,如果您需要打电话、访问用户的联系人或要执行其他操作,则可通过创建适当的意向来完成,或者您可以请求相应的权限并直接访问相应的对象。
+
+每种方法各有优缺点。
+
+</p>
+
+<p>
+ 如果使用权限:
+</p>
+
+<ul>
+ <li>应用可在您执行操作时完全控制用户体验。
+但是,如此广泛的控制会增加任务的复杂性,因为您需要设计适当的 UI。
+
+ </li>
+
+ <li>当您首次执行操作时,系统会显示一次让用户授予权限的提示。
+之后,应用即可执行操作,不再需要用户进行其他交互。
+但是,如果用户不授予权限(或稍后撤销权限),则应用根本无法执行操作。
+
+
+ </li>
+</ul>
+
+<p>
+ 如果使用意向:
+</p>
+
+<ul>
+ <li>您无需为操作设计 UI。处理意向的应用将提供 UI。不过这意味着您无法控制用户体验。
+
+用户可以与您从未见过的应用进行交互。
+
+ </li>
+
+ <li>如果用户没有适用于操作的默认应用,则系统会提示用户选择应用。如果用户未指定默认处理程序,则必须在每次执行此操作时额外处理一个对话框。
+
+
+
+ </li>
+</ul>
+
+<h2 id="coding">为运行时权限编码</h2>
+
+<p>
+ 如果应用主要面向新的 M 开发者预览版,则您必须使用新权限模型。
+这意味着除了通过清单文件声明所需的权限以外,您还必须检查应用运行时是否已有相应的权限,如果没有,则需要请求权限。
+
+
+
+</p>
+
+<h3 id="enabling">
+ 启用新权限模型
+</h3>
+
+<p>
+ 要启用新的 M 开发者预览版权限模型,请将应用的
+<code>targetSdkVersion</code> 属性设置为 <code>"MNC"</code>,并将
+<code>compileSdkVersion</code> 设置为 <code>"android-MNC"</code>。这样可启用所有新的权限功能。
+
+</p>
+
+<p>
+ 对于预览版本,您必须将 <code>minSdkVersion</code> 设置为
+<code>"MNC"</code>,才能使用预览版 SDK 进行编译。
+</p>
+
+<h3 id="m-only-perm">
+ 指定仅用于 M 预览版的权限
+</h3>
+
+<p>
+ 您可以使用应用清单文件中的新 <code>&lt;uses-permission-sdk-m&gt;</code> 元素指明仅在 M 开发者预览版中需要某权限。
+如果您以这种方式声明权限,则每当在旧版设备上安装应用时,系统都不会提示用户或向应用授予权限。通过使用 <code>&lt;uses-permission-sdk-m&gt;</code>
+ 元素,您可以将新权限添加到更新后的应用版本,而不必强制用户在安装更新时授予权限。
+
+
+
+
+
+</p>
+
+<p>
+ 如果应用在已安装 M 开发者预览版的设备上运行,则
+<code>&lt;uses-permission-sdk-m&gt;</code> 的行为与
+<code><a href="{@docRoot}guide/topics/manifest/uses-permission-element.html">&lt;uses-permission&gt;</a></code> 相同。
+ 系统不会在安装应用时提示用户授予任何权限,且应用将根据需要请求权限。
+
+</p>
+
+<h3 id="prompting">
+ 提示授予权限
+</h3>
+
+<p>
+ 如果应用使用新的 M 开发者预览版权限模型,则在运行 M 预览版的设备上首次启动应用时,系统不会要求用户授予所有权限。
+
+相反,应用将根据需要请求权限。
+当应用请求某权限时,系统会向用户显示一个对话框。
+
+</p>
+
+<p>
+ 如果应用在已安装 SDK 22 或更低版本的设备上运行,则应用将使用旧权限模型。
+当用户安装应用时,系统将提示他们授予应用在清单文件中请求的所有权限,但那些带有 <code>&lt;uses-permission-sdk-m&gt;</code> 标记的权限除外。
+
+
+</p>
+
+<h4 id="check-platform">检查运行应用的平台</h4>
+
+<p>
+ 只有运行 M 开发者预览版的设备支持此权限模型。
+在调用其中任何方法之前,应用均应通过检查 {@link android.os.Build.VERSION#CODENAME
+ Build.VERSION.CODENAME} 的值来验证运行应用的平台。
+
+如果设备正在运行 M 开发者预览版,则
+{@link android.os.Build.VERSION#CODENAME CODENAME} 为 <code>"MNC"</code>。
+</p>
+
+<h4 id="check-for-permission">检查应用是否具备所需的权限</h4>
+
+<p>当用户尝试执行需要权限的操作时,应用将检查目前是否具备执行此操作所需的权限。
+为此,应用将调用
+<code>Context.checkSelfPermission(
+<i>permission_name</i>)</code>。即便知道用户已授予该权限,应用也应执行此检查,因为用户可以随时撤销应用的权限。
+
+
+例如,如果用户需要使用应用拍摄照片,则应用将调用
+<code>Context.checkSelfPermission(Manifest.permission.CAMERA)</code>。
+</p>
+
+<p class="table-caption" id="permission-groups">
+ <strong>表 1.</strong>权限和权限组。</p>
+<table>
+ <tr>
+ <th scope="col">权限组</th>
+ <th scope="col">权限</th>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.CALENDAR</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.READ_CALENDAR</code>
+ </li>
+ </ul>
+ <ul>
+ <li>
+ <code>android.permission.WRITE_CALENDAR</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.CAMERA</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.CAMERA</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.CONTACTS</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.READ_CONTACTS</code>
+ </li>
+ <li>
+ <code>android.permission.WRITE_CONTACTS</code>
+ </li>
+ <li>
+ <code>android.permission.READ_PROFILE</code>
+ </li>
+ <li>
+ <code>android.permission.WRITE_PROFILE</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.LOCATION</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.ACCESS_FINE_LOCATION</code>
+ </li>
+ <li>
+ <code>android.permission.ACCESS_COARSE_LOCATION</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.MICROPHONE</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.RECORD_AUDIO</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.PHONE</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.READ_PHONE_STATE</code>
+ </li>
+ <li>
+ <code>android.permission.CALL_PHONE</code>
+ </li>
+ <li>
+ <code>android.permission.READ_CALL_LOG</code>
+ </li>
+ <li>
+ <code>android.permission.WRITE_CALL_LOG</code>
+ </li>
+ <li>
+ <code>com.android.voicemail.permission.ADD_VOICEMAIL</code>
+ </li>
+ <li>
+ <code>android.permission.USE_SIP</code>
+ </li>
+ <li>
+ <code>android.permission.PROCESS_OUTGOING_CALLS</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.SENSORS</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.BODY_SENSORS</code>
+ </li>
+ </ul>
+ <ul>
+ <li>
+ <code>android.permission.USE_FINGERPRINT</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.SMS</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.SEND_SMS</code>
+ </li>
+ <li>
+ <code>android.permission.RECEIVE_SMS</code>
+ </li>
+ <li>
+ <code>android.permission.READ_SMS</code>
+ </li>
+ <li>
+ <code>android.permission.RECEIVE_WAP_PUSH</code>
+ </li>
+ <li>
+ <code>android.permission.RECEIVE_MMS</code>
+ </li>
+ <li>
+ <code>android.permission.READ_CELL_BROADCASTS</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+</table>
+
+<h4 id="request-permissions">根据需要请求权限</h4>
+
+<p>如果应用尚无所需的权限,则应用将调用
+<code>Activity.requestPermissions(String[], int)</code> 方法,请求提供一项或多项适当的权限。
+应用将传递所需的一项或多项权限,以及整数“请求代码”。
+
+ 此方法异步运行:它会立即返回,并且在用户响应对话框之后,系统会使用结果调用应用的回调方法,将应用传递的相同“请求代码”传递到 <code>requestPermissions()</code>。
+
+
+</p>
+
+ <p>以下代码检查应用是否具备读取用户联系人所需的权限,并根据需要请求该权限:
+</p>
+
+<pre>
+if (checkSelfPermission(Manifest.permission.READ_CONTACTS)
+ != PackageManager.PERMISSION_GRANTED) {
+ requestPermissions(new String[]{Manifest.permission.READ_CONTACTS},
+ MY_PERMISSIONS_REQUEST_READ_CONTACTS);
+
+ // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
+ // app-defined int constant
+
+ return;
+}
+</pre>
+
+<h4 id="handle-response">处理权限请求响应</h4>
+
+<p>
+ 当应用请求权限时,系统将向用户显示一个对话框。
+当用户响应时,系统将调用应用的
+<code>Activity.onRequestPermissionsResult(int, String[], int[])</code>
+,向其传递用户响应。应用需要替代该方法。回调会将您传递的相同请求代码传递给
+<code>requestPermissions()</code>。
+例如,如果应用请求
+<code>READ_CONTACTS</code> 访问权限,则可能采用以下回调方法:
+
+</p>
+
+<pre>
+&#64;Override
+public void onRequestPermissionsResult(int requestCode,
+ String permissions[], int[] grantResults) {
+ switch (requestCode) {
+ case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
+ if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+
+ // permission was granted, yay! do the
+ // calendar task you need to do.
+
+ } else {
+
+ // permission denied, boo! Disable the
+ // functionality that depends on this permission.
+ }
+ return;
+ }
+
+ // other 'switch' lines to check for other
+ // permissions this app might request
+ }
+}
+</pre>
+
+ <p>如果用户授予权限,则系统会为应用授予应用清单文件为该功能区域列出的所有权限。
+如果用户拒绝请求,则您应采取适当的操作。
+例如,您可以禁用任何取决于此权限的菜单操作。
+
+ </li>
+</p>
+
+<p>
+ 当系统要求用户授予权限时,用户可以选择指示系统不再要求提供该权限。
+在这种情况下,当应用使用 <code>requestPermissions()</code> 请求该权限时,系统会立即拒绝此请求。
+
+在这种情况下,如果用户已再次明确拒绝您的请求,则系统会以同样的方式调用您的 <code>onRequestPermissionsResult()</code>。
+
+因此,您的应用不能假设用户采取了任何直接交互行为。
+
+</p>
+
+<h2 id="testing">测试运行时权限</h2>
+
+
+<p>
+ 如果应用主要面向 M 开发者预览版,则您必须测试它是否正确处理权限。
+您不能假设应用在运行时具备任何特定的权限。
+应用首次启动时,它可能没有任何权限,且用户可以随时撤销或恢复权限。
+
+
+</p>
+
+<p>
+ 您应测试应用,确保它在所有权限情况下均可正常运行。
+通过 M 预览版 SDK,我们提供了新的
+<a href="{@docRoot}tools/help/adb.html">Android
+ Debug Bridge (adb)</a> 命令,支持您使用需要尝试的任何权限设置测试应用。
+
+</p>
+
+<h3>
+ 新 adb 命令和选项
+</h3>
+
+<p>
+ M 预览版 SDK 平台工具提供了多个新命令,支持您测试应用处理权限的方式。
+
+</p>
+
+<h4>
+ 使用权限安装
+</h4>
+
+<p>
+ 您可以使用 <a href="{@docRoot}tools/help/adb.html#move"><code>adb
+ install</code></a> 命令的新 <code>-g</code> 选项,该选项将安装应用并授予其清单文件中列出的所有权限:
+
+</p>
+
+<pre class="no-pretty-print">
+$ adb install -g &lt;path_to_apk&gt;
+</pre>
+
+<h4>
+ 授予和撤销权限
+</h4>
+
+<p>
+ 您可以使用新的 ADB <a href="{@docRoot}tools/help/adb.html#pm">软件包管理器 (pm)</a> 命令向已安装的应用授予权限和撤销其权限。此功能对于自动化测试非常有用。
+
+
+</p>
+
+<p>
+ 要授予权限,请使用软件包管理器的 <code>grant</code> 命令:
+</p>
+
+<pre class="no-pretty-print">
+$ adb pm grant &lt;package_name&gt; &lt;permission_name&gt;
+</pre>
+
+<p>
+ 例如,要向录音​​授予 com.example.myapp 软件包权限,请使用以下命令:
+
+</p>
+
+<pre class="no-pretty-print">
+$ adb pm grant com.example.myapp android.permission.RECORD_AUDIO
+</pre>
+
+<p>
+ 要撤销权限,请使用软件包管理器的 <code>revoke</code> 命令:
+</p>
+
+<pre class="no-pretty-print">
+$ adb pm revoke &lt;package_name&gt; &lt;permission_name&gt;
+</pre>
+
+<h2 id="best-practices">最佳做法</h2>
+
+<p>
+ 新权限模型为用户带来更流畅的体验,让他们能够更轻松地安装应用,并得心应手地使用应用的各项功能。
+
+为了充分利用该新模型,我们建议采用下列最佳做法。
+
+</p>
+
+
+<h3 id="bp-what-you-need">仅请求自己所需的权限</h3>
+
+<p>
+ 每次您请求权限时,实际上是在强迫用户作出决定。
+ 如果用户拒绝请求,则会减少应用的功能。
+ 您应尽量减少提出这些请求的次数。
+</p>
+
+<p>
+ 例如,应用往往可以通过使用
+<a href="{@docRoot}guide/components/intents-filters.html">意向</a>(而不是请求权限)获得所需的功能。
+如果应用需要使用手机的相机拍摄照片,则可使用
+ {@link
+ android.provider.MediaStore#ACTION_IMAGE_CAPTURE
+ MediaStore.ACTION_IMAGE_CAPTURE} 意向。当应用执行该意向时,系统会提示用户选择已安装的相机应用拍摄照片。
+
+
+</p>
+
+<h3 id="bp-dont-overwhelm">
+ 不要让用户感到无所适从
+</h3>
+
+<p>
+ 如果您让用户一次面对大量权限请求,用户可能会感到无所适从并因此退出应用。替代做法是,您应根据需要请求权限。
+
+
+</p>
+
+<p>
+ 某些情况下,您的应用可能绝对需要一项或多项权限。在这种情况下,合理的做法是,在应用启动之后立即请求所有权限。
+
+例如,如果您运行摄影应用,则该应用需要访问设备的相机。
+当用户首次启动该应用时,不会对请求使用相机所需的权限感到惊讶。
+
+但是,如果同一应用还具备与用户联系人共享照片的功能,则您不应在首次启动时请求用户提供该权限,<em></em>
+
+而是等到用户尝试使用“共享”功能之后,再请求该权限。
+
+</p>
+
+<p>
+ 如果应用提供了教程,则合理的做法是,在教程结束时请求提供应用的必要权限。
+
+</p>
+
+<h3 id="bp-explain">
+ 解释需要权限的原因
+</h3>
+
+<p>
+ 系统在您调用
+<code>requestPermissions()</code> 时显示的权限对话框将说明应用所需的权限,但不会解释为何需要这些权限。
+在某些情况下,用户可能会感到困惑。
+ 最好在调用 <code>requestPermissions()</code> 之前向用户解释应用需要权限的原因。
+
+</p>
+
+<p>
+ 例如,摄影应用可能需要使用位置服务,以便能够为照片添加地理标签。
+通常,用户可能不了解照片能够包含位置信息,并且对摄影应用想要了解具体位置感到不解。
+
+因此在这种情况下,应用最好在调用
+<code>requestPermissions()</code> 之前告知此功能的相关信息。<em></em>
+
+</p>
+
+<p>
+ 其中一种办法是将这些请求纳入应用教程。这样,教程可以依次显示应用的每项功能,并在显示每项功能时解释需要哪些相应的权限。
+
+例如,摄影应用的教程可以演示其“与您的联系人共享照片”功能,然后告知用户需要为应用授予权限以便其查看用户的联系人。
+
+
+然后,应用可以调用 <code>requestPermissions()</code>,要求用户提供该访问权限。
+当然,并非所有用户都会按照教程操作,因此您仍需在应用的正常操作期间检查和请求权限。
+
+
+</p>
diff --git a/docs/html-intl/intl/zh-cn/preview/overview.jd b/docs/html-intl/intl/zh-cn/preview/overview.jd
new file mode 100644
index 0000000..cebbf06
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/preview/overview.jd
@@ -0,0 +1,362 @@
+page.title=计划概览
+page.metaDescription=欢迎参加 Android M 开发者预览版计划。此计划将为您提供针对 Android 的下一版本测试和优化应用所需的所有功能。
+page.image=images/cards/card-preview_16-9_2x.png
+page.tags="preview", "developer", "android"
+
+@jd:body
+
+<p>
+ 欢迎使用 <strong>Android M 开发者预览版</strong>计划。此计划将为您提供针对 Android 的下一版本测试和优化应用所需的所有功能。
+
+它是一款免费软件。您仅需下载 M 开发者预览版工具即可立即使用。
+
+</p>
+
+<div style="background-color:#eceff1;padding:1em;">
+<div class="wrap">
+ <div class="cols">
+ <div class="col-4of12">
+ <h5>
+ 硬件和模拟器系统映像
+ </h5>
+
+ <p>
+ 在 Nexus 5、6、9 和 Player(适用于电视)以及模拟器中运行并测试应用。
+
+ </p>
+ </div>
+
+ <div class="col-4of12">
+ <h5>
+ 最新的平台代码
+ </h5>
+
+ <p>
+ 我们将在预览版期间提供多次更新,因此您将可以针对最新的平台变更测试您的应用。
+
+ </p>
+ </div>
+
+ <div class="col-4of12">
+ <h5>
+ 通过 OTA(空中下载技术)更新
+ </h5>
+
+ <p>
+ 在向设备刷入初始预览版后,即可通过 OTA 技术获取更新。
+
+ </p>
+ </div>
+ </div>
+
+ <div class="cols">
+
+
+ <div class="col-4of12">
+ <h5>
+ 新行为和新功能
+ </h5>
+
+ <p>
+ 尽早做好支持新平台行为(例如新运行时权限模型和省电功能)的准备工作。
+
+ </p>
+ </div>
+
+ <div class="col-4of12">
+ <h5>
+ 为处理开发者反馈问题而设的优先窗口
+ </h5>
+
+ <p>
+ 在最初的几周里,我们将优先处理开发者报告的问题,以便尽快测试并提供反馈。
+
+ </p>
+ </div>
+
+ <div class="col-4of12">
+ <h5>
+ 反馈和支持
+ </h5>
+
+ <p>
+ 使用<a href="https://code.google.com/p/android-developer-preview/">问题跟踪器</a>向我们报告问题并提供反馈。
+ 与 <a href="http://g.co/dev/AndroidMDevPreview">M&nbsp;开发者社区</a>中的其他开发者建立联系。
+
+ </p>
+ </div>
+ </div>
+</div>
+</div>
+
+<!--
+<p>
+ With the M Developer Preview, you'll get an early start on testing your apps,
+ with enough time to make adjustments before the public platform release later
+ in the year. We'll provide several updates to the Preview tools in the weeks
+ ahead, so you can keep in sync with the latest changes as the platform moves
+ toward launch.
+</p>
+<img src="{@docRoot}preview/images/m-preview-timeline.png" alt=
+"Preview program timeline" id="timeline">
+<p>
+ You can help us improve the platform by <a href=
+ "https://code.google.com/p/android-developer-preview/">reporting issues</a>
+ through our feedback channels. This is especially
+ critical in the first month of the preview, when we’ll be giving priority to
+ developer-reported issues and feedback.
+</p> -->
+
+
+<h2 id="timeline">
+ 时间表和更新
+</h2>
+<img src="{@docRoot}preview/images/m-preview-timeline-crop.png" alt="Preview program timeline" id="timeline">
+<p>
+ M 开发者预览版从 5 月 28 日开始一直运行到最终 Android M SDK 发布为止。最终的 Android M SDK 将于 2015 年第三季度公众版发布之前不久发布。
+
+
+</p>
+
+<p>
+ 在开发阶段的各个里程碑,我们将为您的测试设备提供预览版更新。
+ 暂定的里程碑包括
+</p>
+
+<ul>
+ <li>
+ <strong>预览版&nbsp;1</strong>(5 月底发布初始预览版);
+ </li>
+
+ <li>
+ <strong>预览版&nbsp;2</strong>(6 月底/7 月初);
+ </li>
+
+ <li>
+ <strong>预览版&nbsp;3</strong>(7 月底发布近乎最终版本)
+ </li>
+</ul>
+
+<p>
+ 这些更新将促进形成<strong>最终版本的 SDK</strong>(第三季度末),为 Android 新版本以及最终的系统行为和功能交付官方 API。
+
+
+</p>
+
+<p>
+ 如果您在 Android M 中进行测试和开发,我们郑重建议您随着预览版更新的发布,<strong>将开发环境保持为相应的最新版本</strong>。
+
+ 为了简化这一过程,我们将为已刷入预览版内部版本的设备提供<strong>空中下载 (OTA) 更新</strong>功能,并提供可供您手动下载并刷入的系统映像。
+
+
+</p>
+<p class="note">
+ <strong>注:</strong>最终的 SDK 和系统映像无法通过 OTA 交付,而是需要<strong>手动刷入</strong>到测试设备中。</strong>
+
+
+</p>
+
+<p>
+ 当有预览版更新可用时,我们将通过 <a href="http://android-developers.blogspot.com/">Android 开发者博客</a>、此站点以及 <a href="http://g.co/dev/AndroidMDevPreview">Android M 开发者社区</a>通知您。
+
+
+</p>
+
+<h2 id="preview_tools">
+ 预览版具有哪些功能?
+</h2>
+
+<p>
+ M 开发者预览版包括您在各种使用不同屏幕尺寸、网络技术、CPU/GPU 芯片和硬件架构的设备中测试现有应用所需的所有功能。
+
+
+</p>
+
+<h4>
+ SDK 工具
+</h4>
+
+<p>
+ 您可通过 <a href="{@docRoot}sdk/installing/adding-packages.html">Android Studio</a> 中的 SDK 管理器下载这些组件:
+</p>
+
+<ul>
+ <li>M 开发者预览版 <strong>SDK 工具</strong>
+ </li>
+
+ <li>M 开发者预览版<strong>模拟器系统映像</strong>(32 位和 64 位)
+
+ </li>
+
+ <li>适用于 Android TV 的 M 开发者预览版<strong>模拟器系统映像</strong>(32 位)
+
+ </li>
+</ul>
+
+<h4>
+ 硬件系统映像
+</h4>
+
+<p>
+ 您可从<a href="download.html">“下载”页面</a>中下载这些供 Nexus 设备使用的硬件系统映像:
+
+</p>
+
+<ul>
+ <li>
+ <strong>Nexus 5</strong> (GSM/LTE) “hammerhead” 设备系统映像
+ </li>
+
+ <li>
+ <strong>Nexus 6</strong> “shamu” 设备系统映像
+ </li>
+
+ <li>
+ <strong>Nexus 9</strong> (Wi-Fi) “volantis” 设备系统映像
+ </li>
+
+ <li>
+ <strong>Nexus Player</strong> (Android TV) “fugu” 设备系统映像
+ </li>
+</ul>
+
+<h4>
+ 文档和示例代码
+</h4>
+
+<p>
+ 以下文档资源有助于您了解预览版:
+</p>
+
+<ul>
+ <li>
+ <a href="setup-sdk.html">设置 SDK</a>,提供入门指南的分步说明。
+
+ </li>
+
+ <li>
+ <a href="{@docRoot}preview/testing/guide.html">测试指南</a>和<a href="behavior-changes.html">行为变更</a>,带您了解主要测试领域。
+ </li>
+
+ <li>新 API 文档,包括 <a href="api-overview.html">API 概览</a>、可下载的 <a href="{@docRoot}preview/download.html#docs">API 参考资料</a>以及有关<a href="{@docRoot}preview/features/runtime-permissions.html">权限</a>、<a href="{@docRoot}preview/backup/index.html">应用备份</a>等主要功能的详细开发者指南。
+
+
+
+
+ </li>
+
+ <li>
+ <a href="{@docRoot}preview/samples.html">示例代码</a>,演示如何支持权限和其他新功能。
+
+ </li>
+
+ <li>
+ M 开发者预览版当前版本的<a href="{@docRoot}preview/support.html#release-notes">版本说明</a>,包括变更说明和差异报告。
+
+ </li>
+</ul>
+
+<h4>
+ 支持资源
+</h4>
+
+<p>
+ 在 M 开发者预览版中测试和开发时,您可使用以下支持资源:
+
+</p>
+
+<ul>
+ <li><a href="https://code.google.com/p/android-developer-preview/">M 开发者预览版问题跟踪器</a>是您的<strong>主要反馈渠道。</strong>
+
+您可通过问题跟踪器报告错误、性能问题和一般反馈。
+您还可检查<a href="https://code.google.com/p/android-developer-preview/wiki/KnownIssues">已知问题</a>并找出解决方法步骤。
+
+ </li>
+
+ <li><a href="http://g.co/dev/AndroidMDevPreview">Android M 开发者社区</a>是一家 Google+ 社区。在此社区中,您可<strong>与其他使用 Android M 的开发者建立联系</strong>。您可以共享观察结果或想法,或查找 Android M 问题的解决方法。
+
+
+
+ </li>
+</ul>
+
+
+<h2 id="preview_apis_and_publishing">
+ 锁定目标、预览版 API 和发布
+</h2>
+
+<p>
+ Android M 开发者预览版是仅面向开发的版本,
+<strong>并不具有标准的 API 级别</strong>。如果您想选择拒绝通过兼容性行为测试您的应用(强烈推荐),则可将应用的 <code><a href=
+ "/guide/topics/manifest/uses-sdk-element.html">targetSdkVersion</a></code>
+ 设置为 <code>“MNC”</code>,从而锁定 M 开发者预览版。
+
+
+</p>
+
+<p>
+ Android M 开发者预览版提供<strong>预览 API</strong> 功能
+&mdash; 在最终的 SDK 发布之前,这些 API 都不是正式的 API。目前,最终的 SDK 计划于 2015 年第三季度发布。
+这意味着一段时期内,特别是该计划的最初几周内,
+<strong>API 可能会出现细微变化</strong>。
+我们会通过 Android M 开发者预览版的每次更新,为您提供一份变更摘要。
+
+</p>
+
+<p class="note">
+ 请注意,尽管预览版 API 可能会更改,但运行时权限和省电功能等基本系统行为仍保持稳定,可以立即用于测试。
+
+
+</p>
+
+<p>
+ 关于发布,Google Play 会<strong>禁止发布面向 M 开发者预览版的应用</strong>。
+当 Android M 最终版本 SDK 可用时,您可以锁定官方 Android M API 级别,并将应用发布至 Google Play。
+
+与此同时,如果您需要将针对 Android M 的应用分发给测试者,则可通过电子邮件或从您的站点直接下载实现这一点。
+
+
+</p>
+
+<h2 id="get_started">
+ 如何开始
+</h2>
+
+<p>
+ 要开始测试应用,请执行以下操作:
+</p>
+
+<ol>
+ <li>查看 <a href="{@docRoot}preview/api-overview.html">API 概览</a>和<a href="{@docRoot}preview/behavior-changes.html">行为变更</a>,大致了解新功能及其如何影响您的应用。
+
+特别地,您需要了解新的<a href="{@docRoot}preview/features/runtime-permissions.html">运行时权限</a>模型、省电功能和自动备份。
+
+
+ </li>
+
+ <li>遵循有关<a href="{@docRoot}preview/setup-sdk.html">设置预览版 SDK</a> 和配置测试设备的说明,来设置您的环境。
+
+
+ </li>
+
+ <li>遵循<a href="https://developers.google.com/android/nexus/images">刷入说明</a>,刷入 Nexus 5、6、9 和 Player 的最新 M 开发者预览版系统映像。
+
+为开发设备刷入系统映像后,预览版更新将通过无线 (OTA) 更新进行交付。</a>
+
+ </li>
+
+ <li>下载 <a href="{@docRoot}preview/download.html#docs">M 预览版 API 参考资料</a>和 <a href="{@docRoot}preview/samples.html">M 预览版示例</a>,更深入地了解新 API 功能以及如何在应用中使用这些功能。
+
+
+
+ </li>
+
+ <li>加入 <a href="http://g.co/dev/AndroidMDevPreview">Android M 开发者社区</a>,获取最新资讯并与使用新平台的其他开发者建立联系。
+
+
+ </li>
+</ol>
+
+<p>
+ 感谢您参加 Android M 开发者预览版计划!
+</p>