diff options
author | David Friedman <dmail@google.com> | 2015-06-29 16:03:08 -0700 |
---|---|---|
committer | David Friedman <dmail@google.com> | 2015-06-29 16:03:08 -0700 |
commit | 4fd1a573eb0724251b5c0986c7f0ae7b36d52369 (patch) | |
tree | 3b02b8800d002fd5e19fe7b170988ec61cbb5fad /docs/html-intl/intl/zh-tw | |
parent | 3686e0430f8366e2f4de867eeabfd1b7fe4aefc0 (diff) | |
download | frameworks_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-tw')
-rw-r--r-- | docs/html-intl/intl/zh-tw/preview/api-overview.jd | 521 | ||||
-rw-r--r-- | docs/html-intl/intl/zh-tw/preview/behavior-changes.jd | 402 | ||||
-rw-r--r-- | docs/html-intl/intl/zh-tw/preview/features/runtime-permissions.jd | 794 | ||||
-rw-r--r-- | docs/html-intl/intl/zh-tw/preview/overview.jd | 362 |
4 files changed, 2079 insertions, 0 deletions
diff --git a/docs/html-intl/intl/zh-tw/preview/api-overview.jd b/docs/html-intl/intl/zh-tw/preview/api-overview.jd new file mode 100644 index 0000000..f6c5696 --- /dev/null +++ b/docs/html-intl/intl/zh-tw/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">無線基地台 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 預覽版»</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>請勿將使用 M 開發人員預覽版的應用程式發行到 Google Play 商店。 +</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 指紋圖示。Android 指紋圖示 ({@code c_fp_40px.png}) 隨附於<a href="https://github.com/googlesamples/android-FingerprintDialog" class="external-link">範例應用程式</a>中。如果您正在開發多個使用指紋驗證的應用程式,請注意,每個應用程式都必須個別驗證使用者的指紋。 + + + + +</p> + +<p>如要在您的應用程式中使用此功能,請先在您的宣示說明中新增 {@code USE_FINGERPRINT} 權限。 +</p> + +<pre> +<uses-permission + android:name="android.permission.USE_FINGERPRINT" /> +</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></strong>,然後依照註冊指示,在模擬器中註冊新的指紋。 +</li> +<li>使用模擬器,利用下列命令來模擬指紋輕觸事件。 +使用同一個命令,在鎖定螢幕上或您的應用程式中模擬指紋輕觸事件。 + +<pre class="no-prettyprint"> +adb -e emu finger touch <finger_id> +</pre> +<p>在 Windows 上,您可能必須執行 {@code telnet 127.0.0.1 <emulator-id>},後面接著 +{@code finger touch <finger_id>}。 +</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> +<service android:name=".ChooserTargetService" + android:label="@string/service_name" + android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE"> + <intent-filter> + <action android:name="android.service.chooser.ChooserTargetService" /> + </intent-filter> +</service> +</pre> + +<p>針對您要向 {@code ChooserTargetService} 公開的每個活動,在您的應用程式宣示說明中,新增名稱為 +{@code "android.service.chooser.chooser_target_service"} 的 +{@code <meta-data>} 元素。 +</p> + +<pre> +<activity android:name=".MyShareActivity” + android:label="@string/share_activity_label"> + <intent-filter> + <action android:name="android.intent.action.SEND" /> + </intent-filter> +<meta-data + android:name="android.service.chooser.chooser_target_service" + android:value=".ChooserTargetService" /> +</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>Home</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">無線基地台 2.0 版本 1 支援</h2> +<p> +這個預覽版在 Nexus 6 和 Nexus 9 裝置上新增對於無線基地台 2.0 版本 1 規格的支援。如要在您的應用程式中佈建無線基地台 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} 屬性指出偵測到的網路是否代表無線基地台 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()} 方法。 +您也可以透過 {@link android.support.v4.content.ContextCompat},在 v4 appcompat 程式庫中取得這些方法。 +</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 即時資訊的導覽向上滑動手勢)。 +</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 帳戶的情況下輕觸一次就能佈建 Kiosk 或其他這類裝置,這個功能非常有用。 +</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()} 來設定系統更新原則,裝置擁有者現在可以自動接受系統更新 (例如,在 Kiosk 裝置的案例中),或者延後更新,並防止使用者進行更新,最多 30 天。 + +因此,系統管理員可以設定必須取得更新的每日時間範圍 ,例如,在 Kiosk 裝置處於未使用狀態時。 +在系統更新可供使用時,系統就會檢查工作原則控制器應用程式是否已設定系統更新原則,並據以運作。 + + +</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)。 +NFC 程式設計人員應用程式可以在已重設裝置來解除鎖定 FRP 並佈建裝置之後提供這些參數,而不需使用先前設定的 Google 帳戶。 + +如果您並未修改這些參數,FRP 會就地保留,並防止裝置在沒有先前啟用的 Google 認證的情況下啟用。 + + +<p>此外,裝置擁有者可以在 Google Play 服務上設定應用程式限制,來指定可用來解除鎖定 FRP 的替代 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></strong> 使用量中看見的資料使用量統計資料進行查詢。 +系統會自動授與設定檔擁有者權限來查詢他們所管理之設定檔上的資料,在此同時,裝置擁有者會取得受管理的主要使用者之使用量資料的存取權限。 + +</li> +<li><strong>執行階段權限管理:</strong> +<p>設定檔或裝置擁有者可以使用 +{@code DevicePolicyManager.setPermissionPolicy()},針對所有應用程式的所有執行階段要求設定權限原則,以提示使用者授與一般權限,或者以無訊息方式自動授與或拒絕該權限。 + +如果設定了後項原則,使用者就無法在應用程式權限畫面的 [設定]<strong></strong> 中,修改設定檔或裝置擁有者所做的選項。 + +</p></li> +<li><strong>設定中的 VPN:</strong>VPN 應用程式現在可以在 [設定] > [更多] > [VPN]<strong></strong> 中看見。此外,伴隨 VPN 使用量出現的通知是該 VPN 設定方式的特定通知。 + + +針對設定檔擁有者,通知是專門用來通知是否已針對受管理的設定檔、個人設定檔或兩者設定了 VPN。 +針對裝置擁有者,通知是專門用來通知是否已針對整個裝置設定了 VPN。 +</li> +<li><strong>工作狀態通知:</strong>每當來自受管理設定檔的應用程式在前景中有活動時,狀態列上就會出現公事包圖示。 +因此,如果直接將裝置解除鎖定至受管理設定檔中應用程式的活動,即會顯示一個快顯通知,通知使用者他們正處於工作設定檔內。 + + +</li> +</ul> + +<p class="note"> + 如需 M 開發人員預覽版中所有 API 變更的詳細檢視,請參閱 <a href="{@docRoot}preview/download.html">API 差異報告</a>。 +</p> diff --git a/docs/html-intl/intl/zh-tw/preview/behavior-changes.jd b/docs/html-intl/intl/zh-tw/preview/behavior-changes.jd new file mode 100644 index 0000000..405aea1 --- /dev/null +++ b/docs/html-intl/intl/zh-tw/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">AudioManager 變更</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 預覽版»</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 雲端通訊活動訊號 (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 雲端通訊</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 <packageName> true +$ adb shell am set-idle <packageName> false +$ adb shell am get-idle <packageName> +</pre> + +<p class="note"><strong>注意:</strong>即將發行的 <a href="https://developers.google.com/cloud-messaging/" class="external-link">Google 雲端通訊</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 裝置): +</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">AudioManager 變更</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 支援程式庫</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> +在以前,如果應用程式使用 +{@link android.net.wifi.WifiManager#enableNetwork(int,boolean) enableNetwork()} 搭配 +{@code disableAllOthers=true} 設定來強制裝置連接到特定的 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()} 方法且您想要覆寫存取檢查,請搭配已設定為 {@code true} 的輸入參數呼叫 +{@link java.lang.reflect.Constructor#setAccessible(boolean) setAccessible()} 方法。 + + + +如果您的應用程式使用 <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 dlopen(3)} 的呼叫 (不會明確使用 +{@code RTLD_LOCAL}) 將會受到影響 (除非您的應用程式明確使用 {@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 撥號程式通話記錄現在會在使用者檢視過去的通話記錄時顯示工作聯絡人。將 {@code DevicePolicyManager.setCrossProfileCallerIdDisabled()} 設定為 {@code true},可以在 Google 撥號程式通話記錄中隱藏工作設定檔聯絡人。 + + +只有在您將 {@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 設定。 +只要尚未針對使用者設定 {@link android.os.UserManager} 常數 +{@link android.os.UserManager#DISALLOW_CONFIG_WIFI},該使用者就仍能建立和修改他們自己的 WiFi 設定。 +</li> +<li><strong>透過 Google 帳戶新增來下載工作原則控制器:</strong>在將要求透過工作原則控制器 (WPC) 應用程式進行管理的 Google 帳戶新增到受管理內容以外的裝置時,新增帳戶流程現在會提示使用者安裝適當的 WPC。這個行為也適用於在初始裝置設定精靈中透過 [設定] > [帳戶]<strong></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-tw/preview/features/runtime-permissions.jd b/docs/html-intl/intl/zh-tw/preview/features/runtime-permissions.jd new file mode 100644 index 0000000..cf756aa --- /dev/null +++ b/docs/html-intl/intl/zh-tw/preview/features/runtime-permissions.jd @@ -0,0 +1,794 @@ +page.title=權限 +page.tags=previewresources, 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} 的所有權限授與應用程式。 + + + 例如,會在安裝期間自動授與歸入 {@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 介面,務必要先確定呼叫端具備存取該資料的必要權限後,再 Proxy 權限。 + + +</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></strong> + + <i>app_name</i> > [權限]<strong></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> 權限,讓應用程式直接存取相機。 +接著,應用程式會使用相機 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><uses-permission-sdk-m></code> 元素,指出只有在 M 預覽版上才需要某權限。 +如果您以這種方式宣告權限,每當在舊版裝置上安裝應用程式時,系統都不會提示使用者或將權限授與應用程式。藉由使用 <code><uses-permission-sdk-m></code> 元素,當使用者安裝更新時,您不需要強制他們授與權限,就可以將新的權限新增至更新的應用程式版本。 + + + + + + +</p> + +<p> + 如果應用程式在使用 M 開發人員預覽版的裝置上執行, +<code><uses-permission-sdk-m></code> 的運作方式會和 +<code><a href="{@docRoot}guide/topics/manifest/uses-permission-element.html"><uses-permission></a></code> 相同。 + 當他們安裝應用程式時,系統不會提示使用者授與任何權限,而應用程式會在需要時才要求權限。 + +</p> + +<h3 id="prompting"> + 提示授與權限 +</h3> + +<p> + 如果您的應用程式使用新的 M 開發人員預覽版權限模型,在執行 M 預覽版的裝置上初次啟動應用程式時,不會要求使用者授與所有權限。 + +您的應用程式會在需要時才要求權限。 +應用程式要求權限時,系統會對使用者顯示對話方塊。 + +</p> + +<p> + 如果您的應用程式在 SDK 22 以下版本的裝置上執行,應用程式會使用舊的權限模型。 +當使用者安裝應用程式時,會提示他們授與應用程式在其宣示說明中要求的所有權限,但標示為 <code><uses-permission-sdk-m></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> +@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 偵錯橋 (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 <path_to_apk> +</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 <package_name> <permission_name> +</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 <package_name> <permission_name> +</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-tw/preview/overview.jd b/docs/html-intl/intl/zh-tw/preview/overview.jd new file mode 100644 index 0000000..63cde32 --- /dev/null +++ b/docs/html-intl/intl/zh-tw/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> + 歡迎使用「Android M 開發人員預覽版」<strong></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> + 在您將裝置刷新為初始預覽版之後,就能以無線方式取得更新。 + + </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 開發人員社群</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 日開始執行,直到我們將在 2015 年第 3 季正式發行之前發行的最終版 Android M SDK。 + + +</p> + +<p> + 我們將在主要的開發里程碑為您的測試裝置提供更新。 + 里程碑暫定如下 +</p> + +<ul> + <li> + <strong>預覽版 1</strong> (初始預覽版,五月下旬)、 + </li> + + <li> + <strong>預覽版 2</strong> (六月下旬/七月上旬) 及 + </li> + + <li> + <strong>預覽版 3</strong> (接近最終版,七月下旬) + </li> +</ul> + +<p> + 這些更新最終會成為「最終版 SDK」<strong></strong> (稍後於第 3 季),為新版 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>M 開發人員預覽版<strong>模擬器系統映像 (適用於 Android TV)</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>是您能<strong>與其他 Android M 開發人員聯絡</strong>的 Google+ 社群。您可以分享有關 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> — 在最終版 SDK (目前規劃在 2015 年第三季) 發行之前的都不是正式 API。 + +這表示您可以預期 API 會隨時間而有些許變更,特別是程式一開始的幾週。<strong></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> |