| page.title=Android 5.0 API |
| excludeFromSuggestions=true |
| sdk.platform.version=5.0 |
| sdk.platform.apiLevel=21 |
| @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="#ApiLevel">更新您的 API 目標等級</a></li> |
| <li><a href="#Behaviors">重要的行為模式異動</a> |
| <ol> |
| <li><a href="#ART">如果您還未在全新的 Android Runtime (ART) 測試您的應用程式...</a></li> |
| <li><a href="#BehaviorNotifications">如果您的應用程式實作了通知功能...</a></li> |
| <li><a href="#BehaviorMediaControl">如果您的應用程式使用了 RemoteControlClient...</a></li> |
| <li><a href="#BehaviorGetRecentTasks">如果您的應用程式使用了 getRecentTasks()...</a></li> |
| <li><a href="#64BitSupport">如果您使用 Android Native Development Kit (NDK)...</a></li> |
| <li><a href="#BindService">如果您的應用程式繫結了其他服務...</a></li> |
| <li><a href="#BehaviorWebView">如果您的應用程式使用了 WebView...</a></li> |
| </ol> |
| </li> |
| <li><a href="#UI">使用者介面</a> |
| <ol> |
| <li><a href="#MaterialDesign">實感設計支援</a></li> |
| <li><a href="#Recents">在最近使用項目的螢幕中同時顯示文件和活動</a></li> |
| <li><a href="#WebView">WebView 更新</a></li> |
| <li><a href="#ScreenCapture">螢幕擷取和分享</a></li> |
| </ol> |
| </li> |
| <li><a href="#Notifications">通知</a> |
| <ol> |
| <li><a href="#LockscreenNotifications">鎖定螢幕通知</a></li> |
| <li><a href="#NotificationsMetadata">通知中繼資料</a></li> |
| </ol> |
| </li> |
| <li><a href="#Graphics">顯示</a> |
| <ol> |
| <li><a href="#OpenGLES-3-1">支援 OpenGL ES 3.1</a></li> |
| <li><a href="#AndroidExtensionPack">Android 擴充功能套件</a></li> |
| </ol> |
| </li> |
| <li><a href="#Media">媒體</a> |
| <ol> |
| <li><a href="#Camera-v2">提供進階相機功能的 Camera API</a></li> |
| <li><a href="#AudioPlayback">音訊播放</a></li> |
| <li><a href="#MediaPlaybackControl">媒體播放控制項</a></li> |
| <li><a href="#MediaBrowsing">媒體瀏覽</a></li> |
| </ol> |
| </li> |
| <li><a href="#Storage">儲存空間</a> |
| <ol> |
| <li><a href="#DirectorySelection">目錄選擇</a></li> |
| </ol> |
| </li> |
| <li><a href="#Wireless">無線網路和連線功能</a> |
| <ol> |
| <li><a href="#Multinetwork">可與多個網路連線</a></li> |
| <li><a href="#BluetoothBroadcasting">藍牙廣播</a></li> |
| <li><a href="#NFCEnhancements">NFC 改良</a></li> |
| </ol> |
| </li> |
| <li><a href="#Power">Project Volta</a> |
| <ol> |
| <li><a href="#JobScheduler">排定工作</a></li> |
| <li><a href="#PowerMeasurementTools">監控耗電量的開發人員工具</a> |
| </ol> |
| </li> |
| <li><a href="#Enterprise">Android 在工作和教育方面的應用</a> |
| <ol> |
| <li><a href="#ManagedProvisioning">管理化設定檔建置</a></li> |
| <li><a href="#DeviceOwner">裝置擁有者</a></li> |
| <li><a href="#ScreenPinning">螢幕固定</a></li> |
| </ol> |
| </li> |
| <li><a href="#System">系統</a> |
| <ol> |
| <li><a href="#AppUsageStatistics">應用程式使用統計資料</a></li> |
| </ol> |
| </li> |
| <li><a href="#Printing">列印架構</a> |
| <ol> |
| <li><a href="#PDFRender">將 PDF 轉譯為點陣圖</a></li> |
| </ol> |
| </li> |
| <li><a href="#TestingA11y">測試和協助工具</a> |
| <ol> |
| <li><a href="#TestingA11yImprovements">測試和協助工具改進部分</a></li> |
| </ol> |
| </li> |
| <li><a href="#IME">IME</a> |
| <ol> |
| <li><a href="#Switching">切換輸入語言更輕鬆</a></li> |
| </ol> |
| </li> |
| <li><a href="#Manifest">資訊清單宣告</a> |
| <ol> |
| <li><a href="#ManifestFeatures">可宣告的必要功能</a></li> |
| <li><a href="#Permissions">使用者權限</a></li> |
| </ol> |
| </li> |
| </ol> |
| |
| <h2>API Differences</h2> |
| <ol> |
| <li><a href="{@docRoot}sdk/api_diff/21/changes.html">API level 20 to 21 »</a> </li> |
| <li><a href="{@docRoot}sdk/api_diff/preview-21/changes.html">L Developer Preview to 21 »</a> </li> |
| </ol> |
| |
| <h2>See Also</h2> |
| <ol> |
| <li><a href="{@docRoot}about/versions/android-5.0-changes.html">Android 5.0 Behavior Changes</a> </li> |
| <li><a href="{@docRoot}about/versions/lollipop.html">Android Lollipop Highlights</a> </li> |
| </ol> |
| |
| </div> |
| </div> |
| |
| <p>API 等級:{@sdkPlatformApiLevel}</p> |
| |
| <p>Android 5.0 (<a href="{@docRoot}reference/android/os/Build.VERSION_CODES.html#LOLLIPOP">LOLLIPOP</a>) 為使用者和應用程式開發人員帶來許多全新的功能。本文將為您介紹絕對不容錯過的全新 API。</p> |
| |
| <p>如要大致瞭解新平台的主要功能,請參閱 <a href="{@docRoot}about/versions/lollipop.html">Android Lollipop 重點介紹</a>。</p> |
| |
| |
| <h3 id="Start">著手開發</h3> |
| |
| <p>如要開始打造適用於 Android 5.0 的應用程式,您必須先<a href="{@docRoot}sdk/index.html">取得 Android SDK</a>。接著,請使用 <a href="{@docRoot}tools/help/sdk-manager.html">SDK Manager</a> 下載 Android 5.0 SDK 平台和系統映像。</p> |
| |
| <h3 id="ApiLevel">更新您的 API 目標等級</h3> |
| |
| <p>如要針對搭載 Android {@sdkPlatformVersion} 的裝置進一步最佳化應用程式,請將 <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code targetSdkVersion}</a> 設為 <code>"{@sdkPlatformApiLevel}"</code>、將應用程式安裝在 Android {@sdkPlatformVersion} 系統映像、詳加測試,然後再發佈更新後的應用程式。</p> |
| |
| <p>只要在程式碼中新增條件,於執行 <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code minSdkVersion}</a> 不支援的 API 之前檢查系統 API 等級,您就可以使用 Android {@sdkPlatformVersion} API,同時支援舊版本。如要進一步瞭解維持回溯相容性的方法,請參閱<a href="{@docRoot}training/basics/supporting-devices/platforms.html">支援不同的平台版本</a>。</p> |
| |
| <p>如要進一步瞭解 API 等級的運作方式,請參閱<a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#ApiLevels">什麼是 API 等級?</a></p> |
| |
| <h2 id="Behaviors">重要的行為模式異動</h2> |
| |
| <p>如果您曾經發佈適用於 Android 的應用程式,請注意您的應用程式可能會受到 Android 5.0 功能異動的影響。</p> |
| |
| <h3 id="ART">如果您還未在全新的 Android Runtime (ART) 測試您的應用程式...</h3> |
| |
| <p>4.4 版導入了全新的實驗性 Android Runtime,簡稱 ART。在 4.4 以下版本,ART 是選用項目,預設執行環境還是 Dalvik。在 Android 5.0 中,ART 現在已成為預設執行環境。</p> |
| |
| <p>如需 ART 新功能的總覽,請參閱 <a href="https://source.android.com/devices/tech/dalvik/art.html">ART 簡介</a>。以下列出部分主要的新功能:</p> |
| |
| <ul> |
| <li>預先 (AOT) 編譯</li> |
| <li>改良垃圾資訊收集 (GC) 方法</li> |
| <li>改良偵錯支援</li> |
| </ul> |
| |
| <p>大部分的 Android 應用程式不需任何變更即可在 ART 中運作。不過,仍有部分可支援 Dalvik 的技術無法在 ART 中運作。如需進一步瞭解最重要的問題,請參閱<a href="{@docRoot}guide/practices/verifying-apps-art.html">驗證應用程式在 Android Runtime (ART) 的行為</a>。如果應用程式符合下列情形,請特別留意:</p> |
| |
| <ul> |
| <li>您的應用程式使用 Java Native Interface (JNI) 執行 C/C++ 程式碼。</li> |
| <li>您使用產生非標準程式碼 (例如部分擾亂器) 的開發工具。</li> |
| <li>您使用的技術與精簡垃圾資訊收集方法不相容 (ART 目前未實作精簡 GC,但是 Android 開放原始碼專案已在進行相關開發工作)。</li> |
| </ul> |
| |
| <h3 id="BehaviorNotifications">如果您的應用程式實作了通知功能...</h3> |
| |
| <p>在實作通知功能時,請務必瞭解相關的 Android 5.0 異動部分會造成什麼影響。如要進一步瞭解如何設計適用於 Android 5.0 以上版本的通知功能,請參閱<a href="{@docRoot}design/patterns/notifications.html">通知功能設計指南</a>。 |
| </p> |
| |
| <h4 id="NotificationsMaterialDesignStyle">實感設計樣式</h4> |
| <p>為配合新的實感設計 (Material Design) 小工具的風格,通知會以深色文字搭配白色 (或非常淺色) 的背景呈現。請確認所有的通知都符合全新的配色規範。如果通知的配色不符合上述規範,請透過下列方法修正:</p> |
| |
| <ul> |
| <li>使用 {@link android.app.Notification.Builder#setColor(int) setColor()} 為圖示影像後的圓圈設定強調色。 </li> |
| <li>更新或移除任何與顏色相關的資產。系統會忽略動作圖示和主要通知圖示中 Alpha 以外的所有通道。建議您假設這些圖示都只具備 Alpha 通道。系統會以白色繪製通知圖示,而以深灰色繪製動作圖示。</li> |
| </ul> |
| |
| <h4 id="NotificationsSoundVibration">音效和震動</h4> |
| <p>如果您目前是使用 {@link android.media.Ringtone}、{@link android.media.MediaPlayer} 或 {@link android.os.Vibrator} 類別為通知新增音效和震動功能,請移除這個程式碼,以便系統可以「優先」<em></em>模式正確呈現通知。然後,請改用 {@link android.app.Notification.Builder} 方法新增音效和震動功能。</p> |
| |
| <p>如果將裝置設定為 {@link android.media.AudioManager#RINGER_MODE_SILENT RINGER_MODE_SILENT},裝置會進入新的優先模式。如果您將裝置設定為 {@link android.media.AudioManager#RINGER_MODE_NORMAL RINGER_MODE_NORMAL} 或 {@link android.media.AudioManager#RINGER_MODE_NORMAL RINGER_MODE_VIBRATE},裝置則會結束優先模式。</p> |
| |
| <p>Android 之前使用 {@link android.media.AudioManager#STREAM_MUSIC STREAM_MUSIC} 做為控制平板電腦音量的主要串流。在 Android 5.0 中,手機和平板電腦的主要音量串流已經統一由 {@link android.media.AudioManager#STREAM_RING STREAM_RING} 或 {@link android.media.AudioManager#STREAM_NOTIFICATION STREAM_NOTIFICATION} 控制。</p> |
| |
| <h4 id="NotificationsLockscreenVisibility">鎖定螢幕可見度</h4> |
| <p>根據 Android 5.0 預設設定,通知現在會顯示在使用者的鎖定螢幕。使用者可以選擇隱藏敏感的資訊,如此系統就會自動覆蓋通知顯示的文字。如要自訂具備覆蓋功能的通知,請使用 {@link android.app.Notification.Builder#setPublicVersion(android.app.Notification) setPublicVersion()}。</p> |
| <p>如果通知並未包含個人資訊,或者如果您要啟用通知中的媒體播放控制項,請呼叫 {@link android.app.Notification.Builder#setVisibility(int) setVisibility()} 方法,然後將通知可見度等級設為 {@link android.app.Notification#VISIBILITY_PUBLIC VISIBILITY_PUBLIC}。 |
| </p> |
| |
| <h4 id="NotificationsMediaPlayback">媒體播放</h4> |
| <p>如果您要實作會呈現媒體播放狀態或傳輸控制項的通知,不妨考慮使用全新的 {@link android.app.Notification.MediaStyle} 範本,而不是自訂的 {@link android.widget.RemoteViews.RemoteView}。無論您選擇哪一種方法,請確認將通知可見度設為 {@link android.app.Notification#VISIBILITY_PUBLIC VISIBILITY_PUBLIC},如此才可在鎖定螢幕使用控制項。請注意從 Android 5.0 開始,系統不會再將 {@link android.media.RemoteControlClient} 物件顯示在鎖定螢幕。詳情參閱<a href="#BehaviorMediaControl">如果您的應用程式使用了 RemoteControlClient</a>一節的說明。</p> |
| |
| <h4 id="NotificationsHeadsup">提醒通知</h4> |
| <p>當裝置處於使用中狀態 (裝置鎖定但顯示螢幕),通知現在會顯示在小型浮動視窗 (也稱為提醒通知)。提醒通知看起來很像精簡版的通知,只是另外還會顯示動作按鈕。使用者不需要離開目前的應用程式即可操作或關閉提醒通知。</p> |
| |
| <p>以下列出會觸發提醒通知的條件:</p> |
| |
| <ul> |
| <li>使用者活動目前以全螢幕顯示 (應用程式使用 {@link android.app.Notification#fullScreenIntent})</li> |
| <li>通知具有高優先級,並使用鈴聲或震動</li> |
| </ul> |
| |
| <p>如果您的應用程式在上述情況實作通知,請確認提醒通知可以正確顯示。</p> |
| |
| <h3 id="BehaviorMediaControl">如果您的應用程式使用了 RemoteControlClient...</h3> |
| <p>{@link android.media.RemoteControlClient} 類別現在已淘汰。請儘快改用全新的 {@link android.media.session.MediaSession} API。</p> |
| |
| <p>Android 5.0 的鎖定螢幕不會為您的 {@link android.media.session.MediaSession} 或 {@link android.media.RemoteControlClient} 顯示傳輸控制項。但是,您的應用程式可以透過通知在鎖定螢幕提供媒體播放控制項。您的應用程式可因此全權掌控媒體按鈕的呈現方式,無論裝置鎖定與否,使用者也可獲得一致的體驗。</p> |
| |
| <p>為達到這個目標,Android 5.0 特別導入了全新的 {@link android.app.Notification.MediaStyle} 範本。{@link android.app.Notification.MediaStyle} 會將您透過 {@link android.app.Notification.Builder#addAction(int, java.lang.CharSequence, android.app.PendingIntent) Notification.Builder.addAction()} 新增的通知動作轉換為內嵌在應用程式媒體播放通知的精簡按鈕。接著,再將工作階段符記傳遞到 {@link android.app.Notification.MediaStyle#setMediaSession(android.media.session.MediaSession.Token) setSession()} 方法,告知系統這個通知會控制進行中的媒體工作階段。</p> |
| |
| <p>請務必將通知的可見度設為 {@link android.app.Notification#VISIBILITY_PUBLIC VISIBILITY_PUBLIC},表示通知內容可顯示在任何鎖定螢幕 (無論是否完成安全設定皆可)。如需詳細資訊,請參閱<a href="#LockscreenNotifications">鎖定螢幕通知</a>。</p> |
| |
| <p>如果您的應用程式是在 Android <a href="{@docRoot}tv/index.html">TV</a> 或 <a href="{@docRoot}wear/index.html">Wear</a> 平台執行,而您想要顯示媒體播放控制項,請實作 {@link android.media.session.MediaSession} 類別。如果您的應用程式需要接收 Android 裝置上的媒體按鈕事件,建議您同時實作 {@link android.media.session.MediaSession}。</p> |
| |
| <h3 id="BehaviorGetRecentTasks">如果您的應用程式使用了 getRecentTasks()...</h3> |
| |
| <p>Android 5.0 推出了「同時顯示文件和活動工作」<em></em>的新功能 (請參閱下方的<a href="#Recents">在最近使用項目的螢幕中同時顯示文件和活動</a>),因此我們已淘汰 {@link android.app.ActivityManager#getRecentTasks ActivityManager.getRecentTasks()} 方法,以便提升對使用者隱私的保護強度。為提供回溯相容性,這個功能仍會傳回一小部分資料,包含發出呼叫的應用程式的工作,以及其他非敏感性的工作 (例如主畫面)。如果您的應用程式目前使用這個方法擷取所屬的工作,請改用 {@link android.app.ActivityManager#getAppTasks() getAppTasks()} 擷取這項資訊。</p> |
| |
| <h3 id="64BitSupport">如果您使用 Android Native Development Kit (NDK)...</h3> |
| |
| <p>Android 5.0 支援 64 位元的系統。64 位元改良功能可增加地址空間並提升效能,同時仍可完整支援現有的 32 位元應用程式。對於 64 位元系統的支援也可改善 OpenSSL 的加密效能。此外,這個版本也導入了全新的原生媒體 NDK API 和原生 OpenGL ES (GLES) 3.1 支援。</p> |
| |
| <p>如要使用 Android 5.0 的 64 位元支援功能,請前往 <a href="{@docRoot}tools/sdk/ndk/index.html">Android NDK 頁面</a>下載並安裝 NDK Revision 10c。如要瞭解 NDK 的重要異動和錯誤修正資訊,請參閱 Revision 10c <a href="{@docRoot}tools/sdk/ndk/index.html#Revisions">版本資訊</a>。</p> |
| |
| <h3 id="BindService">如果您的應用程式繫結了其他服務...</h3> |
| |
| <p>{@link android.content.Context#bindService(android.content.Intent, android.content.ServiceConnection, int) Context.bindService()} 方法現在會要求明確指定的 {@link android.content.Intent};如果收到隱式調用請求,則會擲回例外狀況。為確保您的應用程式安全無虞,在啟動或繫結 {@link android.app.Service} 時,請使用明確指定的調用請求,同時請勿針對服務宣告調用請求篩選器。</p> |
| |
| <h3 id="BehaviorWebView">如果您的應用程式使用了 WebView...</h3> |
| |
| <p>Android 5.0 變更了應用程式的預設行為。</p> |
| <ul> |
| <li><strong>如果您的應用程式的 API 目標等級為 21 以上:</strong> |
| <ul> |
| <li>在預設情況下,系統會封鎖<a href="https://developer.mozilla.org/en-US/docs/Security/MixedContent" class="external-link">混合內容</a>和第三方 Cookie。如要允許混合內容和第三方 Cookie,請分別使用 {@link android.webkit.WebSettings#setMixedContentMode(int) setMixedContentMode()} 和 {@link android.webkit.CookieManager#setAcceptThirdPartyCookies(android.webkit.WebView, boolean) setAcceptThirdPartyCookies()}·方法。</li> |
| <li>系統現在可精確擷取 HTML 文件的部分內容。這個全新的預設行為有助於降低記憶體足跡並有效提升效能。如果您要轉譯整份文件,請呼叫 {@link android.webkit.WebView#enableSlowWholeDocumentDraw()} 以停用這項最佳化行為。</li> |
| </ul> |
| </li> |
| <li><strong>如果您的應用程式指定 API 等級 21 以下:</strong>根據預設,系統會允許混合內容和第三方 Cookie,並一律轉譯整份文件。</li> |
| </ul> |
| |
| <h2 id="UI">使用者介面</h2> |
| |
| <h3 id="MaterialDesign">實感設計支援</h3> |
| |
| <p>在即將發行的版本中,我們開始支援新採用的 Android 實感設計 (Material Design) 樣式。<em></em>您可以使用實感設計機制來開發您的應用程式,為使用者提供充滿動感且流暢的使用者介面元素轉換效果。這項支援包含:</p> |
| |
| <ul> |
| |
| <li>實感主題</li> |
| <li>檢視畫面陰影</li> |
| <li>{@link android.support.v7.widget.RecyclerView} 小工具</li> |
| <li>可繪項目的動畫和樣式效果</li> |
| <li>實感設計動畫和活動轉換效果</li> |
| <li>依據檢視畫面狀態提供檢視畫面屬性的動畫</li> |
| <li>可自訂的使用者介面小工具和應用程式列 (附有可控制的調色盤)</li> |
| <li>依據 XML 向量圖形的動畫和非動畫可繪項目</li> |
| </ul> |
| |
| <p>如要進一步瞭解如何為您的應用程式加入實感設計功能,請參閱<a href="{@docRoot}training/material/index.html">實感設計</a>一節的介紹。</p> |
| |
| <h3 id="Recents">在最近使用項目的螢幕中同時顯示文件和活動</h3> |
| |
| <p>在先前的版本中,對於使用者最近互動的每一個應用程式,<a href="{@docRoot}guide/components/recents.html">最近使用項目的螢幕</a>只會顯示一個工作。現在,您的應用程式會視情況開啟更多工作,協助您掌握文件的同步執行活動。這項功能可提升多工作業效能,因為使用者可在最近使用項目的螢幕中快速切換各個活動和文件,而且在所有應用程式都可享有一致的切換體驗。舉例來說,這類同時執行的工作包含:網路瀏覽器應用程式中同時開啟的分頁、生產力應用程式中的文件、遊戲中同時執行的比賽,或是簡訊應用程式中的通訊活動。您的應用程式可以透過 {@link android.app.ActivityManager.AppTask} 類別·管理工作。</p> |
| |
| <p>如要插入邏輯中斷點告知系統將您的活動視為新工作,當您透過 {@link android.app.Activity#startActivity(android.content.Intent) startActivity()} 啟動活動時,請使用 {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT}。如要獲得這項行為,您也可以在資訊清單中將 <a href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a> 元素的 {@code documentLaunchMode} 屬性設定為 {@code "intoExisting"} 或 {@code "always"}。</p> |
| |
| <p>為避免最近使用項目的螢幕過於擁擠,不妨設定可在這個螢幕中顯示的應用程式工作上限。如要這麼做,請設定 <a href="{@docRoot}guide/topics/manifest/application-element.html"><application></a> 屬性的 {@link android.R.attr#maxRecents android:maxRecents}。目前的上限是每位使用者最多可以顯示 50 個工作 (RAM 較低的裝置則為 25 個)。</a></p> |
| |
| <p>對於最近使用項目螢幕中的工作,您可以進行設定,讓這些工作在重新開機後持續顯示。如要控制持續顯示行為,請使用 <a href="{@docRoot}reference/android/R.attr.html#persistableMode">android:persistableMode</a> 屬性。對於最近使用項目螢幕中的活動,您也可以變更視覺屬性,例如活動的顏色、標籤和圖示,只要呼叫 {@link android.app.Activity#setTaskDescription(android.app.ActivityManager.TaskDescription) setTaskDescription()} 方法即可。</p> |
| |
| <h3 id="WebView">WebView 更新</h3> |
| <p>Android 5.0 已將 {@link android.webkit.WebView} 實作更新為 Chromium M37,不僅提升安全性和穩定性,同時也修正了多項錯誤。在 Android 5.0 執行的 {@link android.webkit.WebView} 預設使用者代理程式字串也已更新,目前包含 37.0.0.0 版本資訊。</p> |
| |
| <p>這個版本導入了 {@link android.webkit.PermissionRequest} 類別,可讓您的應用程式授予 {@link android.webkit.WebView} 權限,以便透過 <a href="https://developer.mozilla.org/en-US/docs/NavigatorUserMedia.getUserMedia" class="external-link">getUse Media()</a> 等 Web API 存取受保護的資源 (例如相機和麥克風)。對於這些資源,您的應用程式必須具備適當的 Android 權限,才可將權限授予 {@link android.webkit.WebView}。</p> |
| |
| <p>透過全新的 <code><a href="{@docRoot}reference/android/webkit/WebChromeClient.html#onShowFileChooser(android.webkit.WebView, android.webkit.ValueCallback<android.net.Uri[]>, android.webkit.WebChromeClient.FileChooserParams)">onShowFileChooser()</a></code> 方法,您現在可以使用 {@link android.webkit.WebView} 中的輸入表單欄位,並啟動檔案選擇器選取 Android 裝置中的圖片和檔案。</p> |
| |
| <p>此外,這個版本也新增了 <a href="http://webaudio.github.io/web-audio-api/" class="external-link">WebAudio</a>、<a href="https://www.khronos.org/webgl/" class="external-link">WebGL</a> 和 <a href="http://www.webrtc.org/" class="external-link">WebRTC</a> 開放標準的支援功能。如要進一步瞭解這個版本中的全新功能,請參閱<a href="https://developer.chrome.com/multidevice/webview/overview" class="external-link">適用於 Android 的 WebView</a>。</p> |
| |
| <h3 id="ScreenCapture">螢幕擷取和分享</h3> |
| <p>Android 5.0 可讓您透過 {@link android.media.projection} API,將螢幕擷取和分享功能新增到應用程式。舉例來說,如果您想在視訊會議應用程式中啟用螢幕分享功能,這項功能就可派上用場。</p> |
| |
| <p>全新的 {@link android.media.projection.MediaProjection#createVirtualDisplay(java.lang.String, int, int, int, int, android.view.Surface, android.hardware.display.VirtualDisplay.Callback, android.os.Handler) createVirtualDisplay()} 方法可讓您的應用程式將主螢幕的內容 (預設畫面) 擷取到 {@link android.view.Surface} 物件,方便稍後傳送到網路。這個 API 只允許擷取未經過安全設定的螢幕內容,而且也不能擷取系統音訊。如要開始擷取螢幕,您的應用程式必須先使用 {@link android.media.projection.MediaProjectionManager#createScreenCaptureIntent()} 方法取得 {@link android.content.Intent},藉此啟動螢幕擷取對話方塊要求使用者的權限。</p> |
| |
| <p>如需全新 API 的使用示例,請參閱範例專案中的 {@code MediaProjectionDemo} 類別。</p> |
| |
| <h2 id="Notifications">通知</h2> |
| |
| <h3 id="LockscreenNotifications">鎖定螢幕通知</h3> |
| <p>Android 5.0 的鎖定螢幕可顯示通知。透過「設定」<em></em>,使用者可選擇是否要允許敏感的通知內容顯示在安全的鎖定螢幕。</p> |
| |
| <p>當通知內容顯示在安全的鎖定螢幕時,您的應用程式可控制要顯示多少內容。如要控制可見度等級,請呼叫 {@link android.app.Notification.Builder#setVisibility(int) setVisibility()} 並指定下列其中一個值:</p> |
| |
| <ul> |
| <li>{@link android.app.Notification#VISIBILITY_PRIVATE VISIBILITY_PRIVATE}:顯示基本資訊 (例如通知的圖示),但隱藏通知的完整內容。</li> |
| <li>{@link android.app.Notification#VISIBILITY_PUBLIC VISIBILITY_PUBLIC}:顯示通知的完整內容。</li> |
| <li>{@link android.app.Notification#VISIBILITY_SECRET VISIBILITY_SECRET}:不顯示任何資訊,即使是通知的圖示也不顯示。</li> |
| </ul> |
| |
| <p>當可見度等級為 {@link android.app.Notification#VISIBILITY_PRIVATE VISIBILITY_PRIVATE} 時,您也可以提供覆蓋個人資訊的通知內容。舉例來說,簡訊應用程式可能會顯示「您有 3 則新簡訊」的通知,但是隱藏簡訊內容和寄件者。如要提供這類通知,請先使用 {@link android.app.Notification.Builder} 建立替代通知。當您建立私人通知物件時,請透過 {@link android.app.Notification.Builder#setPublicVersion(android.app.Notification) setPublicVersion()} 方法附加替代通知。</p> |
| |
| <h3 id="NotificationsMetadata">通知中繼資料</h3> |
| <p>Android 5.0 會使用與您應用程式通知相關聯的中繼資料,精確分類各項通知。如要設定中繼資料,當您建構通知時,請在 {@link android.app.Notification.Builder} 呼叫下列方法:</p> |
| |
| <ul> |
| <li>{@link android.app.Notification.Builder#setCategory(java.lang.String) setCategory()}:告知系統當裝置為「優先」<em></em>模式時應如何處理應用程式通知 (例如,通知代表來電、即時訊息或鬧鐘時的處理方式)。 |
| <li>{@link android.app.Notification.Builder#setPriority(int) setPriority()}:標示這個通知的重要性 (與 般通知相比)。如果通知的優先欄位設為 {@link android.app.Notification#PRIORITY_MAX PRIORITY_MAX} 或 {@link android.app.Notification#PRIORITY_HIGH PRIORITY_HIGH},同時也具有音效和震動,則會顯示在小型浮動視窗。</li> |
| <li>{@link android.app.Notification.Builder#addPerson(java.lang.String) addPerson()}:讓您新增一或多個與通知相關的使用者。您的應用程式可以使用這個方法,告知系統應將指定使用者傳來的通知歸類在一起,或是將這些使用者傳來的通知優先顯示。</li> |
| </ul> |
| |
| <h2 id="Graphics">顯示</h2> |
| |
| <h3 id="OpenGLES-3-1">支援 OpenGL ES 3.1</h3> |
| <p>Android 5.0 新增了 Java 介面和 OpenGL ES 3.1 原生支援。OpenGL ES 3.1 主要的新功能包含:</p> |
| |
| <ul> |
| <li>運算著色器 |
| <li>獨立的著色器物件 |
| <li>間接繪製指令 |
| <li>多個範例和型染紋理 |
| <li>著色語言改良 |
| <li>進階混合模式和偵錯擴充功能 |
| <li>與 OpenGL ES 2.0 和 3.0 回溯相容 |
| </ul> |
| |
| <p>適用於 Android 版 OpenGL ES 3.1 的 Java 介面是透過 {@link android.opengl.GLES31} 提供。使用 OpenGL ES 3.1 時,請確認您透過 <a href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code <uses-feature>}</a> 標記和 {@code android:glEsVersion} 屬性,在資訊清單檔案中宣告。例如:</p> |
| |
| <pre> |
| <manifest> |
| <uses-feature android:glEsVersion="0x00030001" /> |
| ... |
| </manifest> |
| </pre> |
| |
| <p>如需使用 OpenGL ES 的詳細資訊 (包含在執行時間檢查裝置支援的 OpenGL ES 版本),請參閱 <a href="{@docRoot}guide/topics/graphics/opengl.html">OpenGL ES API 指南</a>。</p> |
| |
| <h3 id="AndroidExtensionPack">Android 擴充功能套件</h3> |
| |
| <p>除了 OpenGL ES 3.1,這個版本還提供包含 Java 介面的擴充功能套件和進階圖型功能的原生支援。Android 會將這些擴充功能視為單一套件 (如果 {@code ANDROID_extension_pack_es31a} 擴充功能存在,您的應用程式就會假設套件中的所有擴充功能都存在,並透過單一 {@code #extension} 陳述式啟用著色語言功能)。</p> |
| |
| <p>擴充功能套件支援:</p> |
| |
| <ul> |
| <li>對於著色器儲存空間緩衝區、圖片和原子圖像提供保證的片段著色器支援 (OpenGL ES 3.1 中的片段著色器支援是選擇性的)。</li> |
| <li>曲面細分和幾何圖形著色器</li> |
| <li>ASTC (LDR) 紋理壓縮格式</li> |
| <li>取樣差補和著色</li> |
| <li>在影格緩衝區中,每個顏色附件可以具有不同的混合模式</li> |
| </ul> |
| |
| <p>適用於擴充功能的 Java 介面是透過 {@link android.opengl.GLES31Ext} 提供。在您的應用程式資訊清單中,您可以宣告應用程式必須安裝在支援擴充功能的裝置。例如:</p> |
| |
| <pre> |
| <manifest> |
| <uses-feature android:name=“android.hardware.opengles.aep” |
| android:required="true" /> |
| ... |
| </manifest> |
| </pre> |
| |
| <h2 id="Media">媒體</h2> |
| |
| <h3 id="Camera-v2">提供進階相機功能的 Camera API</h3> |
| |
| <p>Android 5.0 導入了全新的 <a href="{@docRoot}reference/android/hardware/camera2/package-summary.html">android.hardware.camera2</a> API,可提供更精細的相片拍攝和圖片處理功能。您現在可以透過 {@link android.hardware.camera2.CameraManager#getCameraIdList() getCameraIdList()},以程式方式存取系統可用的相機裝置,並透過 {@link android.hardware.camera2.CameraManager#openCamera(java.lang.String, android.hardware.camera2.CameraDevice.StateCallback, android.os.Handler) openCamera()} 連接特定的裝置。如要開始拍攝影像,請建立 {@link android.hardware.camera2.CameraCaptureSession} 並指定 {@link android.view.Surface} 物件,以傳送拍攝的影像。您可以將 {@link android.hardware.camera2.CameraCaptureSession} 設定為拍攝單張相片或連續拍攝多張相片。</p> |
| |
| <p>如果希望系統在拍攝新影像時通知您,請實作 {@link android.hardware.camera2.CameraCaptureSession.CaptureCallback} 監聽器,並在拍攝要求中設定。設定完成後,當系統完成影像拍攝要求時,您的 {@link android.hardware.camera2.CameraCaptureSession.CaptureCallback} 監聽器就會收到針對 {@link android.hardware.camera2.CameraCaptureSession.CaptureCallback#onCaptureCompleted(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.hardware.camera2.TotalCaptureResult) onCaptureCompleted()} 的呼叫,透過 {@link android.hardware.camera2.CaptureResult} 為您提供影像拍攝中繼資料。</p> |
| |
| <p>{@link android.hardware.camera2.CameraCharacteristics} 類別可讓您的應用程式偵測裝置可用的相機功能。物件的 {@link android.hardware.camera2.CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL INFO_SUPPORTED_HARDWARE_LEVEL} 屬性代表相機的功能等級。</p> |
| |
| <ul> |
| <li>所有的裝置至少都支援 {@link android.hardware.camera2.CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY} 硬體等級,具備的功能大概等同已淘汰的 {@link android.hardware.Camera} API。</li> |
| <li>支援 {@link android.hardware.camera2.CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_FULL INFO_SUPPORTED_HARDWARE_LEVEL_FULL} 硬體等級的裝置具備手動拍攝和後製處理的控制功能,並可以高影格速率拍攝高解析度的影像。</li> |
| </ul> |
| |
| <p>如要瞭解更新版 <a href="{@docRoot}reference/android/hardware/camera2/package-summary.html">Camera</a> API 的使用方法,請參閱這個版本的 {@code Camera2Basic} 和 {@code Camera2Video} 實作示例。</p> |
| |
| <h3 id="AudioPlayback">音訊播放</h3> |
| <p>這個版本包括下列與 {@link android.media.AudioTrack} 相關的變更:</p> |
| <ul> |
| <li>您的應用程式現在可以透過浮點格式提供音訊資料 ({@link android.media.AudioFormat#ENCODING_PCM_FLOAT ENCODING_PCM_FLOAT})。這麼做可獲得更大的動態範圍、更一致的精準度,以及更高的音訊極限。在進行中間計算時,浮點算術特別實用。對於音訊資料,播放端點會使用整數格式,並採用較低的位元深度 (在 Android 5.0 中,部分的內部管道還不是浮點)。 |
| <li>您的應用程式現在可以使用 {@link java.nio.ByteBuffer} 提供音訊資料,與 {@link android.media.MediaCodec}·提供的格式相同。 |
| <li>{@link android.media.AudioTrack#WRITE_NON_BLOCKING WRITE_NON_BLOCKING} 選項可以簡化部分應用程式的緩衝和多執行緒處理程序。 |
| </ul> |
| |
| <h3 id="MediaPlaybackControl">媒體播放控制項</h3> |
| <p>使用全新的通知和媒體 API,即可確保系統使用者介面認得您的媒體播放作業,並可擷取即顯示專輯圖片。現在,只要使用全新的 {@link android.media.session.MediaSession} 和 {@link android.media.session.MediaController}·類別,您即可在使用者介面和服務輕鬆控制媒體播放作業。</p> |
| |
| <p>全新的 {@link android.media.session.MediaSession} 類別取代了已淘汰的 {@link android.media.RemoteControlClient} 類別,並提供一組回呼方法處理傳輸控制項和媒體按鈕。如果您的應用程式提供媒體播放功能並可在 Android <a href="{@docRoot}tv/index.html">TV</a>或 <a href="{@docRoot}wear/index.html">Wear</a> 平台執行,請使用 {@link android.media.session.MediaSession}·類別處理採用相同回呼方法的傳輸控制項。</p> |
| |
| <p>您現在可以使用全新的 {@link android.media.session.MediaController} 類別打造專屬的媒體控制應用程式。這個類別提供對執行緒安全的方式,監控及控制來自您的應用程式使用者介面程序的媒體播放作業。建立控制項時,請指定 {@link android.media.session.MediaSession.Token} 物件,以便應用程式可以與 {@link android.media.session.MediaSession} 互動。透過使用 {@link android.media.session.MediaController.TransportControls} 方法,您可以傳送 {@link android.media.session.MediaController.TransportControls#play() play()}、{@link android.media.session.MediaController.TransportControls#stop() stop()}、{@link android.media.session.MediaController.TransportControls#skipToNext() skipToNext()} 和 {@link android.media.session.MediaController.TransportControls#setRating(android.media.Rating) setRating()} 等指令,以控制該工作階段的媒體播放作業。您也可以運用這個控制項註冊 {@link android.media.session.MediaController.Callback} 物件,以便監聽中繼資料並在該工作階段陳述變更。</p> |
| |
| <p>此外,您可以使用全新的 {@link android.app.Notification.MediaStyle} 類別建立功能豐富的通知,允許播放控制項與媒體工作階段連結。</p> |
| |
| <h3 id="MediaBrowsing">媒體瀏覽</h3> |
| <p>Android 5.0 導入了新功能,可讓應用程式透過 <a href="{@docRoot}reference/android/media/browse/package-summary.html">android.media.browse</a> API 瀏覽其他應用程式的媒體內容庫。如要公開您應用程式的媒體內容,請擴展 {@link android.service.media.MediaBrowserService} 類別。實作 {@link android.service.media.MediaBrowserService} 後應可提供 {@link android.media.session.MediaSession.Token} 的存取權,以便應用程式播放透過您的服務提供的媒體內容。</p> |
| <p>如要與媒體瀏覽器服務互動,請使用 {@link android.media.browse.MediaBrowser} 類別。建立 {@link android.media.browse.MediaBrowser} 執行個體時,請指定 {@link android.media.session.MediaSession} 的元件名稱。使用該瀏覽器執行個體時,您的應用程式即可連結到相關的服務並獲得 {@link android.media.session.MediaSession.Token} 物件,以便播放該服務公開的內容。</p> |
| |
| <h2 id="Storage">儲存空間</h2> |
| |
| <h3 id="DirectorySelection">目錄選擇</h3> |
| |
| <p>Android 5.0 已擴展<a href="{@docRoot}guide/topics/providers/document-provider.html">儲存空間存取架構</a>,現在可讓使用者選取整個目錄子樹狀結構,應用程式不需要使用者逐一確認,即可獲得讀取/寫入其中所有文件的權限。</p> |
| |
| <p>如要選取目錄子樹狀結構,請建構並傳送 {@link android.content.Intent#ACTION_OPEN_DOCUMENT_TREE OPEN_DOCUMENT_TREE} 調用請求。系統會顯示所有支援子樹狀結構選取功能的 {@link android.provider.DocumentsProvider} 執行個體,方便使用者瀏覽及選取目錄。傳回 URI 代表您可存取所選的子樹狀結構。這時您就可以使用 {@link android.provider.DocumentsContract#buildChildDocumentsUriUsingTree(android.net.Uri, java.lang.String) buildChildDocumentsUriUsingTree()}、{@link android.provider.DocumentsContract#buildDocumentUriUsingTree(android.net.Uri, java.lang.String) buildDocumentUriUsingTree()} 和 {@link android.content.ContentResolver#query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String) query()} 探索子樹狀結構。</p> |
| |
| <p>全新的 {@link android.provider.DocumentsContract#createDocument(android.content.ContentResolver, android.net.Uri, java.lang.String, java.lang.String) createDocument()} 方法可讓您在子樹狀結構的任何位置建立新文件或目錄。如要管理現有的文件,請使用 {@link android.provider.DocumentsContract#renameDocument(android.content.ContentResolver, android.net.Uri, java.lang.String) renameDocument()} 和 {@link android.provider.DocumentsProvider#deleteDocument(java.lang.String) deleteDocument()}。發出呼叫前,請檢查 {@link android.provider.DocumentsContract.Document#COLUMN_FLAGS COLUMN_FLAGS} 以確認提供者支援這些呼叫。</p> |
| |
| <p>如果您正在實作 {@link android.provider.DocumentsProvider} 且想要支援子樹狀結構選取功能,請實作 {@link android.provider.DocumentsProvider#isChildDocument(java.lang.String, java.lang.String) isChildDocument()},並將 {@link android.provider.DocumentsContract.Root#FLAG_SUPPORTS_IS_CHILD FLAG_SUPPORTS_IS_CHILD} 納入您的 {@link android.provider.DocumentsContract.Root#COLUMN_FLAGS COLUMN_FLAGS}。</p> |
| |
| <p>Android 5.0 也在共用儲存空間導入了全新的套件專屬目錄,您的應用程式可將要納入 {@link android.provider.MediaStore} 的媒體檔案放在其中。全新的 {@link android.content.Context#getExternalMediaDirs()} 會傳回前往所有共用儲存空間裝置上的目錄路徑。與 {@link android.content.Context#getExternalFilesDir(java.lang.String) getExternalFilesDir()} 相似,您的應用程式不需要額外權限即可存取傳回的路徑。這個平台會定期掃描這些目錄中的新媒體,但您也可以使用 {@link android.media.MediaScannerConnection} 自行掃描新內容。</p> |
| |
| <h2 id="Wireless">無線網路和連線功能</h2> |
| |
| <h3 id="Multinetwork">可與多個網路連線</h3> |
| <p>Android 5.0 提供全新的多網路連線 API,可讓您的應用程式動態掃描可用且具備特定功能的網路,進而建立連線。當您的應用程式需要具備特定功能的網路 (例如 SUPL、MMS 或電信代扣結帳網路),或是您想要使用特定類型的傳輸通訊協定傳送資料,這項功能就能派上用場。</p> |
| |
| <p>如要從您的應用程式動態選取及連接網路,請按照下列步驟進行:</p> |
| |
| <ol> |
| <li>建立 {@link android.net.ConnectivityManager}。</li> |
| <li>使用 {@link android.net.NetworkRequest.Builder} 類別建立 {@link android.net.NetworkRequest} 物件,然後指定您的應用程式偏好的網路功能和傳輸類型。</li> |
| <li>如要掃描適用的網路,請呼叫 {@link android.net.ConnectivityManager#requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback) requestNetwork()} 或 {@link android.net.ConnectivityManager#registerNetworkCallback(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback) registerNetworkCallback()},然後傳遞 {@link android.net.NetworkRequest} 物件和 {@link android.net.ConnectivityManager.NetworkCallback} 實作。如果您希望系統偵測到適用網路時主動切換,請使用 {@link android.net.ConnectivityManager#requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback) requestNetwork()} 方法。如果只想收到適用網路的通知 (不要主動切換),請使用 {@link android.net.ConnectivityManager#registerNetworkCallback(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback) registerNetworkCallback()} 方法。</li> |
| </ol> |
| |
| <p>當系統偵測到適用網路時,就會自動連線並叫用 {@link android.net.ConnectivityManager.NetworkCallback#onAvailable(android.net.Network) onAvailable()} 回呼。您可以使用回呼的 {@link android.net.Network} 物件,以取得網路的額外資訊,或是將流量導向所選的網路。</p> |
| |
| <h3 id="BluetoothBroadcasting">藍牙低功耗技術</h3> |
| <p>Android 4.3 平台首度導入了<a href="{@docRoot}guide/topics/connectivity/bluetooth-le.html">藍牙低功耗技術</a> (<em>Bluetooth LE</em>) 支援功能,讓裝置以主機角色建立連線。在 Android 5.0 中,Android 裝置則可以扮演 Bluetooth LE「周邊裝置」<em></em>的角色。應用程式可以透過這項功能,輕鬆讓附近的裝置偵測到。舉例來說,您可以打造應用程式,讓裝置化身為計步器或健康監測器,並將資料傳送給另一台 Bluetooth LE 裝置。</p> |
| <p>全新的 {@link android.bluetooth.le} API 可讓您的應用程式播送廣告、掃描回應,以及與附近的 Bluetooth LE 裝置建立連線。如要使用全新的廣告和掃描功能,請在您的資訊清單中新增 {@link android.Manifest.permission#BLUETOOTH_ADMIN BLUETOOTH_ADMIN} 權限。當使用者從 Play 商店更新或下載您的應用程式時,會看到以下的權限要求提示:「藍牙連線資訊:允許應用程式控制藍牙功能,包括對附近的藍牙裝置播送資訊,或是從附近的藍牙裝置取得資訊。」</p> |
| |
| <p>如要開始 Bluetooth LE 廣告功能,以便其他裝置發掘您的應用程式,請呼叫 {@link android.bluetooth.le.BluetoothLeAdvertiser#startAdvertising(android.bluetooth.le.AdvertiseSettings, android.bluetooth.le.AdvertiseData, android.bluetooth.le.AdvertiseCallback) startAdvertising()} 並傳遞 {@link android.bluetooth.le.AdvertiseCallback} 類別實作。回呼物件會收到廣告作業成功或失敗的報告。</p> |
| |
| <p> Android 5.0 導入了 {@link android.bluetooth.le.ScanFilter} 類別,因此您的應用程式可以只掃描偏好的特定裝置類型。如要開始掃描 Bluetooth LE 裝置,請呼叫 {@link android.bluetooth.le.BluetoothLeScanner#startScan(android.bluetooth.le.ScanCallback) startScan()} 並傳遞篩選器清單。在方法呼叫中,您也必須提供 {@link android.bluetooth.le.ScanCallback} 實作,以便系統在發現 Bluetooth LE·裝置時向您回報。 </p> |
| |
| <h3 id="NFCEnhancements">NFC 改良</h3> |
| <p>Android 5.0 新增了改良措施,讓 NFC 的用途更廣更靈活。</p> |
| |
| <ul> |
| <li>您現在可以在「分享」選單中找到 Android Beam<em></em>。</li> |
| <li>透過呼叫 {@link android.nfc.NfcAdapter#invokeBeam(android.app.Activity) invokeBeam()},您的應用程式可以在使用者的裝置叫用 Android Beam 來分享資料。如此一來,使用者不必將裝置與另一台具備 NFC 功能的裝置實際接觸,即可完成資料傳輸。</li> |
| <li>您可以使用全新的 {@link android.nfc.NdefRecord#createTextRecord(java.lang.String, java.lang.String) createTextRecord()} 方法來建立包含 UTF-8·文字資料的 NDEF 紀錄。</li> |
| <li>如果您正在開發付款應用程式,現在可以透過呼叫 <code><a href="{@docRoot}reference/android/nfc/cardemulation/CardEmulation.html#registerAidsForService(android.content.ComponentName, java.lang.String, java.util.List<java.lang.String>)">registerAidsForService()</a></code> 的方式,動態註冊 NFC 應用程式 ID (AID)。您也可以使用 {@link android.nfc.cardemulation.CardEmulation#setPreferredService(android.app.Activity, android.content.ComponentName) setPreferredService()},針對前景的特定活動設定應該使用的偏好卡片模擬服務。</li> |
| </ul> |
| |
| <h2 id="Power">Project Volta</h2> |
| |
| <p>除了導入新功能之外,Android 5.0 也很重視如何提升電池電力方面的效能。建議您不妨使用全新的 API 和工具,瞭解應用程式的耗電量並進行最佳化。</p> |
| |
| <h3 id="JobScheduler">排定工作</h3> |
| <p>Android 5.0 提供了全新的 {@link android.app.job.JobScheduler} API,可讓您為系統定義稍後執行的非同步工作或是在特定條件下 (例如裝置充電時) 執行的工作,進而將電池電力最佳化。對於下列情況來說,工作安排功能特別實用:</p> |
| <ul> |
| <li>應用程式包含使用者不會看到且可以延後執行的工作。</li> |
| <li>應用程式包含您希望裝置充電時再執行的工作。</li> |
| <li>應用程式包含需要網路或 Wi-Fi 連線的工作。</li> |
| <li>應用程式包含您希望定期批次執行的多個工作。</li> |
| |
| </ul> |
| |
| <p>每一個工作單元都封裝在 {@link android.app.job.JobInfo} 物件中,這個物件會指定各項安排條件。</p> |
| |
| <p>請使用 {@link android.app.job.JobInfo.Builder} 類別設定應如何執行已排定的工作。您可以排定工作在特定條件下執行,例如:</p> |
| |
| <ul> |
| <li>當裝置充電時啟動</li> |
| <li>當裝置連線到非計量付費網路時啟動</li> |
| <li>當裝置閒置時啟動</li> |
| <li>在特定期限之前完成或稍微延遲後完成</li> |
| </ul> |
| |
| <p>舉例來說,您可以新增下列程式碼,以便在非計量付費網路執行工作:</p> |
| |
| <pre> |
| JobInfo uploadTask = new JobInfo.Builder(mJobId, |
| mServiceComponent /* JobService component */) |
| .setRequiredNetworkCapabilities(JobInfo.NetworkType.UNMETERED) |
| .build(); |
| JobScheduler jobScheduler = |
| (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); |
| jobScheduler.schedule(uploadTask); |
| </pre> |
| |
| <p>如果裝置具備穩定的電力 (也就是裝置已接上電源超過 2 分鐘,而且電池處於<a href="{@docRoot}reference/android/content/Intent.html#ACTION_BATTERY_OKAY">健康狀態</a>),即使排定工作的期限還沒到,系統也會執行任何準備就緒的排定工作。</p> |
| |
| <p>如要查看 {@link android.app.job.JobScheduler} API 的使用示例,請參閱這個版本中的 {@code JobSchedulerSample} 實作示例。</p> |
| |
| <h3 id="PowerMeasurementTools">監控耗電量的開發人員工具</h3> |
| |
| <p>全新的 {@code dumpsys batterystats} 指令會產生值得您注意的裝置耗電量統計資料,並依照不重複使用者 ID (UID) 排列。統計資料包含:</p> |
| |
| <ul> |
| <li>與電池相關的事件紀錄 |
| <li>裝置的一般統計資料 |
| <li>每個 UID 和系統元件的概略耗電量 |
| <li>每個封包的每個應用程式手機毫秒數 |
| <li>系統 UID 彙總統計資訊 |
| <li>應用程式 UID 彙總統計資訊 |
| </ul> |
| |
| <p>如要瞭解對輸出結果進行自訂的各種選項,請使用 {@code --help} 選項。例如,如要列出特定應用程式套件自裝置上次充電後的耗電量統計資訊,請執行下列指令: |
| <pre> |
| $ adb shell dumpsys batterystats --charged <package-name> |
| </pre> |
| |
| <p>您可以對 {@code dumpsys} 指令的輸出使用 <a href="https://github.com/google/battery-historian" class="external-link">Battery Historian</a> 工具,利用紀錄中與電力相關的事件產生 HTML 圖示。這項資訊可讓您更輕鬆地掌握及診斷任何與電池相關的問題。</p> |
| |
| <h2 id="Enterprise">Android 在工作和教育方面的應用</h2> |
| <h3 id="ManagedProvisioning">管理化設定檔建置</h3> |
| |
| <p>Android 5.0 提供了新功能,可讓您在企業環境內執行應用程式。如果使用者擁有現有的個人帳戶,則<a href="{@docRoot}guide/topics/admin/device-admin.html">裝置管理員</a>可以啟動管理化設定檔建置流程,將共存但獨立的「管理化設定檔」<em></em>新增到裝置中。與管理化設定檔相關聯的應用程式將與非管理化應用程式一起出現在使用者的啟動器、最近使用項目的螢幕以及通知中。</p> |
| |
| <p>如要啟動管理化設定檔建置流程,請在 {@link android.content.Intent} 中傳送 {@link android.app.admin.DevicePolicyManager#ACTION_PROVISION_MANAGED_PROFILE ACTION_PROVISION_MANAGED_PROFILE}。如果呼叫成功,系統將觸發 {@link android.app.admin.DeviceAdminReceiver#onProfileProvisioningComplete(android.content.Context, android.content.Intent) onProfileProvisioningComplete()} 回呼。然後,您就可以呼叫 {@link android.app.admin.DevicePolicyManager#setProfileEnabled(android.content.ComponentName) setProfileEnabled()} 以啟用這個管理化設定檔。</p> |
| |
| <p>在預設情況下,管理化設定檔中只會啟用一部分的應用程式。只要呼叫 {@link android.app.admin.DevicePolicyManager#enableSystemApp(android.content.ComponentName, android.content.Intent) enableSystemApp()},您就可以在受管理的設定檔安裝額外的應用程式。</p> |
| |
| <p>如果您在開發啟動器應用程式,不妨使用全新的 {@link android.content.pm.LauncherApps} 類別,取得目前使用者和任何關聯的受管理設定檔的可啟動活動清單。只要在可編輯的圖示上附加工作徽章,您的啟動器便能讓管理化應用程式變得更加顯目。如要擷取附帶徽章的圖示,請呼叫 {@link android.content.pm.PackageManager#getUserBadgedIcon(android.graphics.drawable.Drawable, android.os.UserHandle) getUserBadgedIcon()}。</p> |
| |
| <p>如要查看這項新功能的使用方式,請參閱這個版本的 {@code BasicManagedProfile} 實作示例。</p> |
| |
| <h3 id="DeviceOwner">裝置擁有者</h3> |
| <p>Android 5.0 導入了部署裝置擁有者應用程式的功能。與一般<em></em><a href="{@docRoot}guide/topics/admin/device-admin.html">裝置管理員</a>不同,「裝置擁有者」另外具備在裝置上建立及移除次要使用者,以及配置全域設定的能力。您的裝置擁有者應用程式可以使用 {@link android.app.admin.DevicePolicyManager} 類別中的方法,針對受管理的裝置的設定、安全性和應用程式進行精細的控制。無論在任何時候,每部裝置都只能具備一個有效的裝置擁有者。</p> |
| |
| <p>如要部署並啟用裝置擁有者,您必須在裝置尚未進行設定建置時,先透過 NFC 將程式設計應用程式的資料傳輸到裝置中。這項資料傳輸作業所傳送的資訊,與<a href="#ManagedProvisioning">受管理的設定檔建置</a>中描述的建置調用請求所傳送的資訊相同。</p> |
| |
| <h3 id="ScreenPinning">螢幕固定</h3> |
| |
| <p>Android 5.0 導入了全新的螢幕固定 API,可讓您暫時防止使用者離開您的工作或受到通知干擾。舉例來說,如果您正在開發可在 Android 或單一用途或 Kiosk 應用程式上支援高風險評估需求的教育應用程式,則可以使用這個功能。您的應用程式啟用了螢幕固定之後,使用者將無法看到通知、存取其他應用程式或返回主畫面,直到您的應用程式退出這個模式為止。</p> |
| |
| <p>您可透過兩種方法啟用螢幕固定:</p> |
| |
| <ul> |
| <li><strong>手動</strong>:使用者可以依序點選 [設定] > [安全性] > [螢幕固定]<em></em> 啟用螢幕固定。只要在最近使用項目的螢幕上點選綠色的螢幕固定圖示,然後選擇要固定的工作即可。</li> <li><strong>透過程式</strong>:如要透過程式啟用螢幕固定功能,請在您的應用程式中呼叫 {@link android.app.Activity#startLockTask() startLockTask()}。如果發出請求的應用程式不是裝置擁有者,系統會提示使用者進行確認。只要呼叫 {@link android.app.admin.DevicePolicyManager#setLockTaskPackages(android.content.ComponentName, java.lang.String[]) setLockTaskPackages()} 方法,裝置擁有者應用程式就可讓應用程式成為可固定的項目,完全不需要經過使用者確認。</li> |
| </ul> |
| |
| <p>當工作鎖定處於有效狀態時,就會發生下列行為:</p> |
| |
| <ul> |
| <li>狀態列空白,而且使用者通知和狀態資訊都會隱藏。</li> |
| <li>「主畫面」和「最近使用的應用程式」按鈕都會隱藏。</li> |
| <li>其他應用程式無法啟動新活動。</li> |
| <li>目前的應用程式可以啟動新活動,只要這項動作不會建立新工作即可。</li> |
| <li>如果螢幕固定是由裝置擁有者叫用,使用者將會保持鎖定在您的應用程式,直到應用程式呼叫 {@link android.app.Activity#stopLockTask() stopLockTask()} 為止。</li> |
| <li>如果螢幕固定是由非裝置擁有者的應用程式或是由使用者直接呼叫的活動,使用者可以透過同時按住「返回」和「最近」按鈕退出。</li> |
| |
| </ul> |
| |
| <h2 id="Printing">列印架構</h2> |
| |
| <h3 id="PDFRender">將 PDF 轉譯為點陣圖</h3> |
| <p>您現在可以使用新的 {@link android.graphics.pdf.PdfRenderer} 類別將 PDF 文件頁面轉譯為點陣圖圖片以便列印。您必須指定可尋找 (也就是內容可供隨機存取) 的 {@link android.os.ParcelFileDescriptor},方便系統將可列印內容寫入其中。您的應用程式可以透過 {@link android.graphics.pdf.PdfRenderer#openPage(int) openPage()} 取得頁面進行轉譯,然後再呼叫 {@link android.graphics.pdf.PdfRenderer.Page#render(android.graphics.Bitmap, android.graphics.Rect, android.graphics.Matrix, int) render()},將開啟的 {@link android.graphics.pdf.PdfRenderer.Page} 轉變為點陣圖。如果您只希望將文件的一部分轉變為點陣圖圖片 (例如,想要實作<a href="http://en.wikipedia.org/wiki/Tiled_rendering" class="external-link">圖塊轉譯</a>以放大文件),還可以設定其他參數。</p> |
| |
| <p>如需瞭解全新 API 的使用示例,請參閱 {@code PdfRendererBasic} 示例。</p> |
| |
| <h2 id="System">系統</h2> |
| <h3 id="AppUsageStatistics">應用程式使用統計資料</h3> |
| <p>透過全新的 {@link android.app.usage} API,您現在可以存取 Android 裝置上的應用程式使用紀錄。與已淘汰的 {@link android.app.ActivityManager#getRecentTasks(int, int) getRecentTasks()} 方法相比,這個 API 提供了更詳細的使用資訊。如要使用這個 API,您必須先在資訊清單中宣告 {@code "android.permission.PACKAGE_USAGE_STATS"} 權限。如要存取使用紀錄,使用者還必須依序點擊 [設定] > [安全性] > [應用程式]<em></em>,啟用對這個應用程式的存取權限。</p> |
| |
| <p>系統將以每個應用程式為單位收集使用資料,並依照每天、每週、每月和每年的時間間隔彙總資料。系統對於這些資料的最長保留期限分別為:</p> |
| |
| <ul> |
| <li>每日資料:7 天</li> |
| <li>每週資料:4 週</li> |
| <li>每月資料:6 個月</li> |
| <li>每年資料:2 年</li> |
| </ul> |
| |
| <p>至於每個應用程式,系統會記錄下列資料:</p> |
| <ul> |
| <li>應用程式上次的使用時間</li> |
| <li>應用程式在該時間間隔內 (依日、週、月或年排列) 處於前景的總時間長度</li> |
| <li>元件 (以套件和活動名稱標識) 在一天中移動到前景或背景時擷取的時間戳記</li> |
| <li>裝置設定變更時 (例如裝置設定因旋轉而變更時) 擷取的時間戳記</li> |
| </ul> |
| |
| <h2 id="TestingA11y">測試和協助工具 </h2> |
| |
| <h3 id="TestingA11yImprovements">測試和協助工具改進部分</h3> |
| <p>Android 5.0 新支援了下列測試和協助工具:</p> |
| |
| <ul> |
| <li>全新的 {@link android.app.UiAutomation#getWindowAnimationFrameStats() getWindowAnimationFrameStats()} 和 {@link android.app.UiAutomation#getWindowContentFrameStats(int) getWindowContentFrameStats()} 方法會擷取視窗動畫和內容的影格統計資訊。這些方法可讓您編寫解析測試,以便評估應用程式轉譯影格的重新整理頻率是否足以提供流暢的使用者體驗。</li> |
| |
| <li>全新的 {@link android.app.UiAutomation#executeShellCommand(java.lang.String) executeShellCommand()} 方法可讓您透過解析測試執行殼層介面指令。指令執行作業與您從連接到裝置的主機執行 {@code adb shell} 的作業類似,但是可讓您使用殼層介面的工具,例如 {@code dumpsys}、{@code am} {@code content} 和 {@code pm}。</li> |
| |
| <li>對於視力正常的使用者在畫面上互動的視窗,現在只要使用協助工具 API (例如 <a href="{@docRoot}tools/help/uiautomator/index.html">{@code UiAutomator}</a>) 的協助工具服務和測試工具,即可擷取這些視窗的屬性詳細資訊。如要擷取 {@link android.view.accessibility.AccessibilityWindowInfo} 物件清單,請呼叫新的 {@link android.accessibilityservice.AccessibilityService#getWindows() getWindows()}·方法。</li> |
| |
| <li>全新 {@link android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction} 類別允許您定義可以對 {@link android.view.accessibility.AccessibilityNodeInfo} 執行的標準或自訂操作。全新 {@link android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction} 類別取代了以前在 {@link android.view.accessibility.AccessibilityNodeInfo} 中提供的操作相關 API。</li> |
| |
| <li>針對您應用程式中的文字轉語音合成功能,Android 5.0 提供了更細微的控制。全新 {@link android.speech.tts.Voice} 類別可讓您的應用程式使用與特定區域設定、品質和延遲等級相關聯的語音設定檔,以及文字轉語音引擎專屬的參數。</li> |
| </ul> |
| |
| <h2 id="IME">IME</h2> |
| |
| <h3 id="Switching">切換輸入語言更輕鬆</h3> |
| |
| <p>從 Android 5.0 開始,使用者可以更輕鬆地在平台支援的所有<a href="{@docRoot}guide/topics/text/creating-input-method.html">輸入法編輯器 (IME) </a> 之間進行切換。當您執行指定的切換操作時 (通常是輕觸軟鍵盤上的地球圖示),將會依序看到所有 IME。這項行為變更是由 {@link android.view.inputmethod.InputMethodManager#shouldOfferSwitchingToNextInputMethod(android.os.IBinder) shouldOfferSwitchingToNextInputMethod()} 方法實作。</p> |
| |
| <p>此外,這個架構現在還會檢查下一個 IME 是否包含切換機制 (並同時確認這個 IME 是否支援切換到下一個 IME 的功能)。具備切換機制的 IME 不會切換到沒有切換機制的 IME。這項行為變更是由 {@link android.view.inputmethod.InputMethodManager#switchToNextInputMethod(android.os.IBinder, boolean) switchToNextInputMethod()} 方法實作。 |
| |
| <p>如要查看更新版 IME 切換 API 的使用示例,請參閱這個版本中更新的軟鍵盤實作示例。如要進一步瞭解實作 IME 切換機制的方法,請參閱<a href="{@docRoot}guide/topics/text/creating-input-method.html">建立輸入法</a>。 |
| </p> |
| |
| <h2 id="Manifest">資訊清單宣告</h2> |
| |
| <h3 id="ManifestFeatures">可宣告的必要功能</h3> |
| <p><a href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code <uses-feature>}</a> 元素現在支援下列各值,有助您確保應用程式只會安裝在提供應用程式所需功能的裝置上。</p> |
| |
| <ul> |
| <li>{@link android.content.pm.PackageManager#FEATURE_AUDIO_OUTPUT}</li> |
| <li>{@link android.content.pm.PackageManager#FEATURE_CAMERA_CAPABILITY_MANUAL_POST_PROCESSING}</li> |
| <li>{@link android.content.pm.PackageManager#FEATURE_CAMERA_CAPABILITY_MANUAL_SENSOR}</li> |
| <li>{@link android.content.pm.PackageManager#FEATURE_CAMERA_CAPABILITY_RAW}</li> |
| <li>{@link android.content.pm.PackageManager#FEATURE_CAMERA_LEVEL_FULL}</li> |
| <li>{@link android.content.pm.PackageManager#FEATURE_GAMEPAD}</li> |
| <li>{@link android.content.pm.PackageManager#FEATURE_LIVE_TV}</li> |
| <li>{@link android.content.pm.PackageManager#FEATURE_MANAGED_USERS}</li> |
| <li>{@link android.content.pm.PackageManager#FEATURE_LEANBACK}</li> |
| <li>{@link android.content.pm.PackageManager#FEATURE_OPENGLES_EXTENSION_PACK}</li> |
| <li>{@link android.content.pm.PackageManager#FEATURE_SECURELY_REMOVES_USERS}</li> |
| <li>{@link android.content.pm.PackageManager#FEATURE_SENSOR_AMBIENT_TEMPERATURE}</li> |
| <li>{@link android.content.pm.PackageManager#FEATURE_SENSOR_HEART_RATE_ECG}</li> |
| <li>{@link android.content.pm.PackageManager#FEATURE_SENSOR_RELATIVE_HUMIDITY}</li> |
| <li>{@link android.content.pm.PackageManager#FEATURE_VERIFIED_BOOT}</li> |
| <li>{@link android.content.pm.PackageManager#FEATURE_WEBVIEW}</li> |
| </ul> |
| |
| <h3 id="Permissions">使用者權限</h3> |
| |
| <p><a href="{@docRoot}guide/topics/manifest/uses-permission-element.html">{@code <uses-permission>}</a> 元素現在支援下列權限,以便宣告您的應用程式存取特定 API 時所需的權限。</p> |
| |
| <ul> |
| <li>{@link android.Manifest.permission#BIND_DREAM_SERVICE}:如果您的應用程式指定 API 等級 21 以上,<a href="{@docRoot}about/versions/android-4.2.html#Daydream">Daydream</a> 服務需要這項權限,以確保只有系統可以建立繫結。</li> |
| </ul> |