Android 8.0 功能與 API

Android 8.0 (API 級別 26) 為使用者和開發人員推出多種新功能和能力。這份文件會說明開發人員的最新消息。

別忘了查看 Android 8.0 行為變更:瞭解平台變更的部分 可能會影響您的應用程式。

使用者體驗

子母畫面模式

Android 8.0 的子母畫面。

Android 8.0 (API 級別 26) 允許活動在子母畫面 (PIP) 模式下啟動。子母畫面是一種特殊的多視窗模式,主要用於影片播放。子母畫面模式原本可用於 僅限 Android TV;Android 8.0 提供這項功能 在其他裝置上

活動處於子母畫面模式時,會處於暫停狀態,但應繼續顯示內容。因此,請務必確保應用程式不會在 onPause() 處理常式中暫停播放。請改為在 onStop() 中暫停影片,並在 onStart() 中繼續播放。詳情請參閱「多視窗生命週期」。

如要指定活動可使用子母畫面模式,請在資訊清單中將 android:supportsPictureInPicture 設為 true。(從 Android 8.0 開始,子母畫面不需要 android:resizeableActivity 資訊清單屬性。 不過,您必須設定 如果您的活動支援其他android:resizeableActivity 多視窗模式)。

Android 8.0 (API 級別 26) 導入了新物件 PictureInPictureParams。 您傳遞至 PIP 方法,以指定活動行為的方式 也就是在子母畫面模式下執行時這個物件可指定下列屬性: 活動的偏好顯示比例。

新增子母畫面一文中所述的現有子母畫面方法,現在可在所有 Android 裝置上使用,而不僅限於 Android TV。此外,Android 8.0 提供下列方法來支援 PIP 模式:

  • Activity.enterPictureInPictureMode(PictureInPictureParams args):將活動置於子母畫面模式。args 會指定活動的顯示比例和其他設定。如果 args 中的任何欄位為空白,系統會使用上次呼叫 Activity.setPictureInPictureParams() 時設定的值。

    指定活動會放在畫面角落;其餘的 螢幕上會填滿先前畫面上的活動。 進入子母畫面模式的活動會進入暫停狀態,但仍會維持 已開始。使用者輕觸子母畫面活動時,系統會顯示 使用者互動;裝置處於活動狀態時沒有任何觸控事件 放在子母畫面狀態中

  • Activity.setPictureInPictureParams():更新活動的 PIP 設定。如果活動是 目前處於子母畫面模式,表示設定已更新這種做法相當實用 活動的顯示比例變更。如果活動不在子母畫面模式中,無論您呼叫的 enterPictureInPictureMode() 方法為何,都會使用這些設定。

通知

在 Android 8.0 (API 級別 26) 中,我們還重新設計了通知 讓您以更輕鬆且一致的方式管理通知行為 和設定這些異動包括:

    Android 8.0 (API 級別 26) 中的通知長按選單。

    使用者長按應用程式啟動器圖示即可查看 Android 8.0 中的通知功能。

  • 通知管道:Android 8.0 推出通知管道,可讓您為每種要顯示的通知類型建立可供使用者自訂的管道。使用者介面將通知管道稱為「通知類別」。如要瞭解操作方式 實作通知管道,請參閱 管理 通知管道
  • 通知圓點:Android 8.0 推出了在應用程式啟動器圖示上顯示圓點或徽章的支援功能。通知點會顯示使用者尚未關閉或採取行動的通知。如要瞭解如何使用通知圓點,請參閱 通知 徽章
  • 延後通知:使用者可以延後通知,讓通知在一段時間後才會顯示。通知會以首次顯示時的重要性等級重新顯示。應用程式可以移除或更新已暫存的通知,但更新已暫存的通知不會導致通知重新顯示。
  • 通知逾時:您可以使用 setTimeoutAfter() 建立通知時設定逾時時間。您可以使用此方法指定通知多久後傳送通知。 都應取消如有需要,您可以在 指定的逾時時間長度。
  • 通知設定:您可以呼叫 setSettingsText() 來設定文字,當您使用 Notification.INTENT_CATEGORY_NOTIFICATION_PREFERENCES 意圖從通知建立應用程式通知設定的連結時,系統就會顯示這段文字。系統可能會提供下列額外項目,意圖篩選應用程式必須向使用者顯示的設定:EXTRA_CHANNEL_IDNOTIFICATION_TAGNOTIFICATION_ID
  • 關閉通知:使用者可以自行關閉通知,應用程式也可以透過程式碼移除通知。您可以實作 NotificationListenerService 類別的 onNotificationRemoved() 方法,判斷系統何時會關閉通知,以及為何關閉通知。
  • 背景顏色:您可以設定並啟用通知的背景顏色。您應該只在通知中使用這項功能,且通知內容必須是使用者需要一目瞭然的進行中工作。舉例來說,您可以為與行車路線或通話相關的通知設定背景顏色。您也可以設定 所需背景顏色 setColor()。建議做法 可讓您使用 setColorized(),啟用通知的背景顏色。
  • 訊息樣式:在 Android 8.0 中,使用 MessagingStyle 類別顯示 展開的您應該使用 以下課程的 MessagingStyle 類別: 與訊息相關的通知您也可以使用 透過 addHistoricMessage() 方法提供對話的背景資訊: 傳送至訊息相關通知的歷來訊息。

自動填入架構

建立帳戶、登入帳戶和使用信用卡交易都需要時間,而且容易發生錯誤。如果應用程式需要這些類型,使用者很容易就會感到不悅 重複性任務

Android 8.0 (API 級別 26) 填寫表單,例如登入 以及信用卡表單和信用卡表單,因為「自動填入架構」引進了更容易。 使用者選擇啟用自動填入功能後,現有和新應用程式都會與自動填入架構搭配運作。

您可以採取一些步驟,藉此最佳化應用程式與該架構搭配使用的方式。詳情請參閱「自動填入架構總覽」。

可下載的字型

Android 8.0 (API 級別 26) 和 Android 支援資料庫 26 可讓您向供應程式應用程式要求字型,而不是將字型封裝至 APK 中,或是讓 APK 下載字型。這項功能可縮減 APK 大小、提高應用程式安裝成功率,並讓多個應用程式共用相同的字型。

如要進一步瞭解如何下載字型,請參閱 可下載的字型

XML 中的字型

Android 8.0 (API 級別 26) 導入了「XML 中的字型」這項新功能 可讓您將字型做為資源也就是說,您不需要組合字型 視為素材資源字型會編譯於 R 檔案中,並自動 這些資源會以資源的形式顯示在系統中然後,您可以透過新的資源類型 font 存取這些字型。

支援資料庫 26 針對搭載 API 14 以上版本的裝置,提供這項功能的完整支援。

如要進一步瞭解如何將字型做為資源,以及擷取系統字型,請參閱「XML 中的字型」。

自動調整 TextView 大小

在 Android 8.0 (API 級別 26) 中,您可以根據 TextView 的大小,設定文字自動展開或縮小的大小。也就是說 方便您針對不同螢幕或動態內容調整文字大小。 如要進一步瞭解如何在 Android 8.0 中自動調整 TextView 大小, 請參閱「Autosizing TextView」一文。

自動調整圖示

Android 8.0 (API 級別 26) 推出了自動調整啟動器圖示。自動調整圖示支援視覺效果,可在不同裝置型號上顯示多種形狀。如要瞭解如何建立自動調整圖示,請參閱「自動調整圖示」指南。

色彩管理

圖像應用程式的 Android 開發人員現在可以充分利用支援廣色域顯示器的新裝置。如要顯示廣色域圖片,應用程式必須在其資訊清單 (每個活動) 中啟用標記,並載入內嵌廣色配置檔 (AdobeRGB、Pro Photo RGB、DCI-P3 等) 的位圖。

WebView API

Android 8.0 提供多種 API 在應用程式中顯示網路內容的 WebView 物件。 這些 API 可改善應用程式的穩定性和安全性,包括 包括:

  • 版本 API
  • Google SafeBrowsing API
  • Termination Handle API
  • 轉譯器重要性 API

如要進一步瞭解如何使用這些 API,請參閱 管理 WebView

WebView 類別現在包含安全瀏覽 API,可強化網路瀏覽的安全性。若需更多資訊,請參閲 Google Safe Browsing API

固定捷徑和小工具

Android 8.0 (API 級別 26) 推出了應用程式內的捷徑和小工具固定功能。你可以在應用程式中建立固定的捷徑和小工具, 支援的啟動器 (取決於使用者授權)。

詳情請參閱 固定捷徑和小工具 功能指南

螢幕顯示比例上限

Android 8.0 (API 級別 26) 改變了設定應用程式最大顯示比例的方式。

首先,Android 8.0 推出了 maxAspectRatio 屬性,可用於設定應用程式的最大顯示比例。此外,在 Android 8.0 以上版本中,應用程式的預設最大顯示比例為應用程式執行裝置的原生顯示比例。

如要進一步瞭解如何宣告最大顯示比例,請參閱「支援多種螢幕」。

多螢幕支援功能

從 Android 8.0 (API 級別 26) 開始,平台提供對多螢幕的進階支援。如果活動支援多視窗模式,且在有多個螢幕的裝置上執行,使用者可以在螢幕之間移動活動。當應用程式啟動活動時,可以指定活動應在哪個螢幕上執行。

注意:如果活動支援多視窗模式,Android 8.0 會自動為該活動啟用多螢幕支援功能。您應該測試應用程式 以便在多顯示環境中正常運作。

即使應用程式有多個螢幕,一次也只能有一個活動處於已恢復狀態。焦點所在的活動會處於重新啟用狀態。 所有其他可見活動都會暫停,但不會停止。如要進一步瞭解 顯示多個活動時 請參閱「多視窗模式」 Lifecycle

當使用者將活動從一個螢幕移至另一個螢幕時,系統會調整活動大小,並視需要發布執行階段變更。你的活動 系統就能自動處理設定變更 請刪除包含活動的程序,並使用新的活動重新建立 維度。詳情請參閱「處理設定變更」。

ActivityOptions 提供兩種新方法來支援多螢幕:

setLaunchDisplayId()
指定活動在啟動時應顯示在哪個螢幕上。
getLaunchDisplayId()
傳回活動目前的啟動畫面。

擴充 ADB 殼層以支援多螢幕。shell start 指令現在可用來啟動活動。 和指定活動的目標顯示畫面:

adb shell start <activity_name> --display <display_id>

統一的版面配置邊界和邊框間距

在 Android 8.0 (API 級別 26) 中,您可以更輕鬆地指定 View 元素的兩側使用相同的邊界或邊框間距。具體來說,您現在可以在版面配置 XML 中使用下列屬性 檔案:

注意:如果您自訂應用程式邏輯來支援不同的語言和文化,包括文字方向,請注意,這些屬性不會影響 layout_marginStartlayout_marginEndpaddingStartpaddingEnd 的值。除了新的垂直和水平版面配置屬性外,您也可以自行設定這些值,以便建立取決於文字方向的版面配置行為。

指標擷取

在某些應用程式 (例如遊戲、遠端桌面和虛擬化用戶端) 上, 可以更全面地控制滑鼠遊標指標擷取是 Android 8.0 (API 級別 26) 的新功能,可將所有滑鼠事件傳送至應用程式中已聚焦的檢視畫面,進而提供這類控制項。

從 Android 8.0 開始,應用程式中的 View 可以要求 指標擷取並定義事件監聽器,用於處理擷取的指標事件。 在這個模式中,系統會隱藏滑鼠遊標。檢視畫面可以釋出指標擷取作業 不再需要滑鼠資訊時當檢視畫面失去焦點時,系統也可以釋放指標擷取,例如當使用者開啟其他應用程式時。

如要瞭解如何在應用程式中使用這項功能,請參閱「指標擷取」。

應用程式類別

Android 8.0 (API 級別 26) 可讓每個應用程式宣告適合自己的類別 適時提供相關內容這些類別可用來將用途或功能相似的應用程式分成不同的群組,以便向使用者顯示,例如在「數據用量」、「電池用量」或「儲存空間用量」中。您可以在 <application> 資訊清單標記中設定 android:appCategory 屬性,為應用程式定義類別。

Android TV 啟動器

Android 8.0 (API 級別 26) 包含以內容為中心的新。 Android TV 主畫面體驗, 適用於 Android 8.0 的 Android TV 模擬器和 Nexus Player 裝置映像檔。新版主畫面 頻道對應資料列中的影片內容,每個資料列都會由應用程式填入節目 以及系統應用程式可以發布多個頻道,使用者則可設定要透過哪些管道 從主畫面顯示的資訊Android TV 主畫面也提供「接下來請看」列, 能根據使用者的觀看習慣,顯示應用程式提供的程式。應用程式也能提供 影片預覽,會在使用者專注觀看節目時自動播放。用於填入頻道和節目的 API 是 TvProvider API 的一部分,這些 API 會以 Android 8.0 的 Android 支援資料庫模組形式發布。

AnimatorSet

從 Android 8.0 (API 級別 26) 開始,AnimatorSet API 現在支援在 反向播放。跳轉功能可讓你將動畫位置設為 最終點子如果應用程式含有動畫,反向播放功能就相當實用 列出可復原的動作而不是定義兩個獨立的動畫 可以反過來依序播放相同的

輸入和導覽

鍵盤導覽叢集

如果應用程式中的活動使用複雜的檢視區塊階層 (例如圖 2 中的檢視區塊階層),建議將 UI 元素群組分組,以便使用者透過鍵盤在各個區塊之間輕鬆移動。使用者可以按下 Meta + Tab 鍵或搜尋鍵 + Tab 鍵開啟 Chromebook 裝置,可切換叢集。適合建立叢集的元素包括:側邊面板、導覽列、主要內容區域,以及可能含有多個子項元素的元素。

包含五個導覽叢集的範例活動
  可以使用鍵盤瀏覽叢集快速鍵進行瀏覽叢集會以以下排列方式顯示:頂端面板、左側面板、主要內容區域、底部面板和浮動動作按鈕。
圖 2. 包含 5 項導覽的活動 叢集

如要將 ViewViewGroup 元素設為叢集,請在元素的版面配置 XML 檔案中,將 android:keyboardNavigationCluster 屬性設為 true,或是將 true 傳遞至應用程式 UI 邏輯中的 setKeyboardNavigationCluster()

注意:雖然巢狀叢集可能會出現在階層的不同層級,但叢集無法巢狀。如果您嘗試巢狀叢集,架構只會將最上層的 ViewGroup 元素視為叢集。

在配備觸控螢幕的裝置中,您可以設定叢集 ViewGroup 個物件的 將 android:touchscreenBlocksFocus 個元素設為「true」 允許僅叢集內進出該叢集如果您套用這個 使用者無法使用 Tab 鍵或方向鍵 可前往或退出叢集必須按下叢集導覽按鈕 鍵盤組合。

查看預設焦點

在 Android 8.0 (API 級別 26) 中,您可以指派 View,以便在 (重新) 建立的活動繼續執行,且使用者按下鍵盤導覽鍵 (例如 Tab 鍵) 後,接收焦點。如何套用「預設為聚焦」 設定 View 元素的 android:focusedByDefault 屬性設為 true 包含 UI 元素的版面配置 XML 檔案,或將 true 傳入 setFocusedByDefault()在您的 應用程式的 UI 邏輯。

語音輸出

活動和服務可以使用 TextToSpeech 例項來朗讀內容。截至 Android 8.0 (API 級別 26),應用程式可以取得更精確的時間資訊 文字轉語音引擎開始朗讀個別合成字詞時, 前提是引擎提供了這些資訊您可以使用這項功能,在文字轉語音引擎唸出特定字詞時,吸引使用者注意。

如要在應用程式中使用這些文字轉語音引擎改善功能,請註冊 UtteranceProgressListener 的例項。一部分 並在註冊過程中加入處理常式 onRangeStart() 方法。

文字轉語音引擎呼叫 rangeStart()即可錄音 系統預期音訊播放特定文字範圍的時間點 即可開始。當該文字範圍的音訊開始播放時,應用程式會執行 onRangeStart() 方法。接著,應用程式可以回應此回呼,例如醒目顯示與語音表達式相關聯的文字範圍。

進一步瞭解如何追蹤文字轉語音的播放進度 引擎,請參閱 UtteranceProgressListener 類別 參照。

系統

新的 StrictMode 偵測器

Android 8.0 (API 級別 26) 新增了三個 StrictMode 偵測器,可協助找出應用程式中的潛在錯誤:

快取資料

Android 8.0 (API 級別 26) 可針對快取資料提供更完善的指引和行為。每項 快取資料的磁碟空間配額,由應用程式傳回 getCacheQuotaBytes(UUID)

當系統需要釋出磁碟空間時,會從刪除快取檔案開始,這些檔案來自超出所分配配額的應用程式。因此,如果您將快取資料保留在分配配額的範圍內,系統在必要時會將快取檔案列為最後清除的項目。系統決定從應用程式中刪除哪些快取檔案時, (依修改時間判定) 優先考慮最舊檔案。

您也可以根據個別目錄啟用兩種新行為,控制系統釋出快取資料的方式:

  • StorageManager.setCacheBehaviorAtomic() 可用來表示 目錄和其中所有內容都應刪除為不可拆分的單一單位。
  • setCacheBehaviorTombstone(File, boolean) 可用來表示 不應刪除目錄內的檔案,而是將其截斷為 空白檔案則完整保留。

最後,如果您需要為大型檔案分配磁碟空間,請考慮使用新的 allocateBytes(FileDescriptor, long) API (會自動清除) 快取檔案 (視需要) 來回應要求。在決定 裝置的磁碟空間足以存放新資料,請撥打 使用 getAllocatableBytes(UUID),而非 getUsableSpace(),因為前者會考量任何快取 系統願意代表您清除的資料

內容供應器分頁

我們更新了內容供應器,支援載入大型 舉例來說,如果相片應用程式有數千張相片,可以查詢要顯示在網頁中的資料子集。內容供應器傳回的每個結果頁面都會以單一游標物件表示。如要使用這項功能,用戶端和供應器都必須實作分頁功能。

如要進一步瞭解內容供應器的變更,請參閱 ContentProviderContentProviderClient

內容重新整理要求

ContentProviderContentResolver 類別現在皆包含 refresh() 方法,方便用戶端判斷 使用者索取的資訊時就會有現況

您可以擴充 ContentProvider,新增自訂內容重新整理邏輯。請務必覆寫 要傳回 refresh() 種方法 true:用於向供應商的客戶說明你已嘗試過的 即可自行重新整理資料

您的用戶端應用程式可以呼叫 不同的方法 (也稱為 refresh()。呼叫此項目時 方法時,請傳入要重新整理的資料 URI。

注意:由於您可能是透過網路要求資料, 請叫用 refresh() 除非有明顯跡象顯示內容已過時,否則用戶端只會在用戶端顯示您的要求。 執行這類內容重新整理作業最常見的原因,是為了回應滑動重新整理手勢,明確要求目前的 UI 顯示最新內容。

JobScheduler 改善

Android 8.0 (API 級別 26) 為 JobScheduler 推出了許多改善項目。這些改善措施讓您的應用程式變得更加輕鬆 遵守新的背景 執行限制,因為您通常可以使用已排定的工作來替換 受限的背景服務或隱式廣播接收器。

JobScheduler 的更新內容包括:

  • 您現在可以將工作佇列與排定的工作相關聯。如何將作業項目新增至 工作的佇列、呼叫 JobScheduler.enqueue()。 工作執行時,可以從佇列中取出待處理的工作並進行處理。因為這項功能可以處理先前的許多用途 稱為啟動背景服務的特定服務 IntentService
  • Android 支援資料庫 26.0.0 版導入了新的 JobIntentService 類別,提供相同功能 IntentService,但會使用工作 服務。
  • 您現在可以打電話 JobInfo.Builder.setClipData()ClipData 與工作建立關聯。這個選項可讓您將 URI 權限授予與工作相關聯,類似於這些權限可傳播至 Context.startService() 的方式。您也可以將 URI 權限授權與意圖搭配使用 處理工作佇列
  • 已排定的工作現在支援幾項新的限制:
    JobInfo.isRequireStorageNotLow()
    如果裝置的可用儲存空間不足,工作就不會執行。
    JobInfo.isRequireBatteryNotLow()
    如果電池電量等於或低於關鍵電量,則工作不會執行 門檻;這是裝置顯示「低電量」的電量 警告系統對話方塊。
    NETWORK_TYPE_METERED
    工作需要使用計量付費網路連線,例如大部分的行動數據 規劃。

自訂資料儲存庫

Android 8.0 (API 級別 26) 可讓您為偏好設定提供自訂資料儲存區,如果應用程式會將偏好設定儲存在雲端或本機資料庫中,或是偏好設定因裝置而異,這項功能就很實用。如要進一步瞭解如何實作資料儲存區,請參閱「自訂資料儲存區」。

媒體強化功能

VolumeShaper

有新的 VolumeShaper 類別。可用於執行短暫的自動音量轉場效果,例如淡入、淡出和交叉淡出。詳情請參閱「使用 VolumeShaper 控制振幅」。

強化音訊焦點

音訊應用程式會要求及放棄音訊焦點,以便共用裝置上的音訊輸出內容。應用程式會透過開始或停止播放,或降低音量來處理焦點變更。有一個新的 AudioFocusRequest 類別。使用這個類別做為 requestAudioFocus() 的參數,應用程式在處理音訊焦點變更時,就會有新的功能:自動淡出延遲的焦點增益

媒體指標

新的 getMetrics() 方法會傳回 PersistableBundle 包含設定的物件 和成效資訊,以屬性和值的對應圖表示。 getMetrics() 方法是針對下列媒體類別定義:

系統會為每個執行個體分別收集指標,並在執行個體的整個生命週期中保留這些指標。如果沒有可用的指標,此方法會傳回 空值。實際傳回的指標取決於類別。

MediaPlayer

從 Android 8.0 (API 級別 26) 開始,MediaPlayer 可播放內容 受數位版權管理保護 以及 HLS 範例層級加密媒體

Android 8.0 推出了新的超載 seekTo() 指令,可在尋找影格時提供精細控管。其中包含指定搜尋模式的第二個參數:

  • SEEK_PREVIOUS_SYNC 會將媒體位置移至同步 (或按鍵) 影格 與資料來源在指定時間之前或時間點的資料來源相關聯。
  • SEEK_NEXT_SYNC 會將媒體位置移至與資料來源相關聯的同步 (或關鍵) 影格,該資料來源位於指定時間之後或當下。
  • SEEK_CLOSEST_SYNC 會將媒體位置移至與指定時間最接近或位於該時間的資料來源相關聯的同步 (或關鍵) 影格。
  • SEEK_CLOSEST 會將媒體位置移至與資料來源相關聯的框架 (不一定是同步或關鍵影格),該資料來源最接近或位於指定時間。

持續跳轉時,應用程式應使用任何 SEEK_ 模式,而非 SEEK_CLOSEST,這類模式的執行速度相對較慢,但準確度更高。

MediaRecorder

  • MediaRecorder 現已支援 MPEG2_TS 格式,這對串流很有幫助:

    Kotlin

    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS)

    Java

    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS);

    請參閱 MediaRecorder.OutputFormat

  • MediaMuxer 現在可以處理任意數量的音訊和影片串流。你不再受限於一條音軌和/或一條影像軌。使用「addTrack()」 盡情混音,沒有數量限制
  • MediaMuxer 也可以新增一或多個中繼資料軌跡,其中包含使用者定義的每個影格 可能不準確或不適當中繼資料的格式由應用程式定義。 中繼資料音軌僅適用於 MP4 容器。

在離線處理作業中,這些元資料可能會很實用。例如,陀螺儀信號 感應器可用來執行影片防震功能。

新增中繼資料音軌時,音軌的 mime 格式開頭必須為「application/」。寫入中繼資料的做法與寫入影片/音訊資料相同,只是資料並非來自 MediaCodec。不過,應用程式會將 將 ByteBufferwriteSampleData() 方法。 時間戳記必須與視訊軌和音軌的時間相符。

產生的 MP4 檔案會使用 ISOBMFF 12.3.3.2 節中定義的 TextMetaDataSampleEntry,用於標示中繼資料的 mime 格式。使用 MediaExtractor 擷取含有中繼資料音軌的檔案時,中繼資料的 mime 格式會擷取至 MediaFormat

改善媒體檔案存取權

儲存空間存取架構 (SAF) 可讓應用程式公開自訂 DocumentsProvider,讓其他應用程式存取資料來源中的檔案。事實上 文件供應程式甚至可將檔案存取權 這類執行個體會使用 媒體傳輸通訊協定 (MTP)

不過,從遠端資料來源存取大型媒體檔案會產生一些影響 挑戰:

  • 媒體播放器需要可從文件供應器尋找檔案的存取權。如果大型媒體檔案位於遠端資料來源中, 文件提供者必須預先擷取所有資料並建立快照 檔案描述元媒體播放器無法在沒有檔案描述元件的情況下播放檔案,因此必須等到文件提供者完成下載檔案後,才能開始播放。
  • 媒體集合管理工具 (例如相片應用程式) 必須遍歷一系列存取 URI,才能透過受限資料夾存取儲存在外部 SD 卡中的媒體。這種存取模式可大規模對媒體執行大規模作業,例如 移動、複製與刪除—速度較慢。
  • 媒體收藏管理員無法根據 URI 判斷文件的位置。導致這類應用程式難以讓使用者選擇 媒體檔案的儲存位置

Android 8.0 透過改善儲存空間存取架構,解決上述各項挑戰。

自訂文件供應程式

從 Android 8.0 開始,儲存空間存取架構允許 自訂文件 提供者為儲存在 即可產生來自遠端資料來源的叢集SAF 可以開啟檔案來取得原生搜尋檔案。 描述元接著,SAF 會將個別位元組要求傳送至文件提供者。這項功能可讓文件提供者傳回媒體播放器應用程式要求的確切位元組範圍,而非預先快取整個檔案。

若要使用此功能,您需要 StorageManager.openProxyFileDescriptor() 方法。 openProxyFileDescriptor() 方法接受 ProxyFileDescriptorCallback 物件做為回呼。SAF 叫用 每次用戶端應用程式在 檔案描述元。

直接存取文件

自 Android 8.0 (API 級別 26) 起,您可以使用 getDocumentUri() 方法取得 URI,該 URI 會參照與指定 mediaUri 相同的文件。不過,因為傳回的 URI 是由 DocumentsProvider,媒體集合管理員可以存取 而不必掃遍限定範圍目錄的樹狀結構。 因此,媒體管理員可以更快速地在文件上執行檔案作業。

注意:getDocumentUri() 方法只會尋找媒體檔案。不授予應用程式 有權存取這些檔案的權限。進一步瞭解如何取得存取權 請參閱參考說明文件。

文件路徑

在 Android 8.0 (API 級別 26) 中使用儲存空間存取架構時,您可以使用 findDocumentPath() 方法,適用於 DocumentsContractDocumentsProvider 類別,用於針對具有文件的檔案系統,判斷檔案系統的根目錄路徑 編號。此方法會在 DocumentsContract.Path 物件。如果檔案系統有多個定義路徑可連至相同文件,此方法會傳回最常用來連至指定 ID 文件的路徑。

這項功能在下列情況中特別實用:

  • 應用程式使用「另存新檔」對話方塊,其中顯示 以及特定文件
  • 您的應用程式會在搜尋結果檢視畫面中顯示資料夾,如果使用者選取特定資料夾,則必須載入該資料夾中的子文件。

注意:如果應用程式僅有權存取路徑中的部分文件,findDocumentPath() 的傳回值只會包含應用程式可存取的資料夾和文件。

監控音訊播放

AudioManager 系統服務會維護一組有效 AudioPlaybackConfiguration 物件清單,每個物件都包含特定音訊播放工作階段的相關資訊。應用程式可以呼叫 getActivePlaybackConfigurations(),擷取目前有效的設定組合。

自 Android 8.0 (API 級別 26) 起,您可以註冊回呼,在一個或多個 AudioPlaybackConfiguration 物件變更時通知應用程式。如要這麼做,請呼叫 registerAudioPlaybackCallback(),並傳入 AudioManager.AudioPlaybackCallback 的例項。 AudioManager.AudioPlaybackCallback 類別包含 onPlaybackConfigChanged() 方法,系統會在音訊音訊發生時呼叫這個方法 播放設定變更。

連線能力

Wi-Fi 偵測

Android 8.0 (API 級別 26) 新增對 Wi-Fi Aware 的支援,這項功能是根據鄰區感知網路 (NAN) 規格而設計。採用適當的裝置 Wi-Fi 感知硬體、應用程式和鄰近裝置都能探索及通訊 沒有網際網路存取點也能透過 Wi-Fi 網路下載。我們正與硬體合作夥伴合作,盡快將 Wi-Fi Aware 技術帶入裝置。如要瞭解如何將 Wi-Fi Aware 整合至應用程式,請參閱「Wi-Fi Aware」。

藍牙

Android 8.0 (API 級別 26) 新增了下列功能,進一步強化平台的藍牙支援:

  • 支援 AVRCP 1.4 標準,可讓使用者在音樂庫中瀏覽歌曲。
  • 支援藍牙低功耗 (BLE) 5.0 標準。
  • 將 Sony LDAC 轉碼器整合至藍牙堆疊。

配對裝置配對連線

Android 8.0 (API 級別 26) 提供的 API 可讓您自訂 配對要求對話方塊,指出嘗試與隨附裝置配對時 藍牙、BLE 和 Wi-Fi。若需更多資訊,請參閲 配對裝置 配對中

如要進一步瞭解如何在 Android 上使用藍牙,請參閱 藍牙指南。適用對象 對 Android 8.0 (API 級別 26) 專屬的藍牙變更,請參閱 Android 8.0 行為變更頁面。

分享

智慧分享

Android 8.0 (API 級別 26) 會瞭解使用者的個人分享偏好設定,並進一步瞭解每種內容類型應分享至哪些應用程式。舉例來說,如果使用者拍攝收據的相片 8.0 可以建議應用程式費用追蹤。當使用者自拍時 更能妥善處理圖片。Android 8.0 會根據使用者的個人化偏好設定,自動學習所有這些模式。

智慧分享功能適用於 image 以外的內容類型,例如 audiovideotextURL、 依此類推

如要啟用智慧分享功能,請在分享內容的意圖中新增 ArrayList,最多可新增三個字串註解。註解應該 描述內容的主要元素或主題以下程式碼範例 說明如何將註解新增至意圖:

Kotlin

val annotations: ArrayList<String> = arrayListOf(
        "topic1",
        "topic2",
        "topic3"
)

intent.putStringArrayListExtra(
        Intent.EXTRA_CONTENT_ANNOTATIONS,
        annotations
)

Java

ArrayList<String> annotations = new ArrayList<>();

annotations.add("topic1");
annotations.add("topic2");
annotations.add("topic3");

intent.putStringArrayListExtra(
    Intent.EXTRA_CONTENT_ANNOTATIONS,
    annotations
);

如要進一步瞭解智慧分享註解,請參閱 EXTRA_CONTENT_ANNOTATIONS

文字分類工具

在相容的裝置上,應用程式可以使用新的文字分類器,檢查字串是否符合已知的分類器實體類型,並取得建議的選項。系統可辨識實體包括地址、網址、電話號碼和電子郵件地址。詳情請參閱 TextClassifier

無障礙設定

Android 8.0 (API 級別 26) 支援多項新的 開發人員是自行設計無障礙服務的平台,包括:

如要進一步瞭解如何打造更符合無障礙需求的應用程式, 請參閱「無障礙功能」。

安全性和隱私權

權限

Android 8.0 (API 級別 26) 推出了幾項與電話相關的新權限:

這兩項權限都屬於危險權限,且都屬於 PHONE 權限群組。

新的帳戶存取和探索 API

Android 8.0 (API 級別 26) 推出了幾項改善,針對應用程式取得使用者帳戶存取權的方式進行改善。對於他們管理的帳戶 驗證者可以根據自己的政策 決定是否要隱藏帳戶 或向應用程式提供帳戶Android 系統會追蹤 存取特定帳戶

在舊版 Android 中,如果應用程式想追蹤使用者帳戶清單,就必須取得所有帳戶的更新內容,包括不相關類型的帳戶。Android 8.0 新增了 addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[]) 方法,讓應用程式指定帳戶類型清單。 應接收哪些帳戶變更

API 變更

AccountManager 提供六種新方法,讓驗證者 應用程式可以查看帳戶:

Android 8.0 (API 級別 26) 推出兩個特殊的套件名稱值,可為未使用 setAccountVisibility(android.accounts.Account, java.lang.String, int) 方法設定的應用程式指定可見度層級。PACKAGE_NAME_KEY_LEGACY_VISIBLE 瀏覽權限值會套用至具有 GET_ACCOUNTS 權限,且指定 Android 8.0 以下版本的應用程式,或是簽章與指定任何 Android 版本的驗證工具相符的應用程式。PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE 會為先前未設定且 PACKAGE_NAME_KEY_LEGACY_VISIBLE 不適用的應用程式提供預設可見度值。

如要進一步瞭解新的帳戶存取和探索 API,請參閱 AccountManagerOnAccountsUpdateListener 的參考資料。

測試

檢測設備測試

Android 8.0 (API 級別 26) 為應用程式的 檢測設備測試

針對非預設應用程式程序執行

您現在可以指定執行特定檢測設備測試時 應用程式預設程序以外的處理程序。如果應用程式包含在不同程序中執行的多個活動,這項設定就很實用。

如要定義非預設程序檢測,請前往資訊清單 檔案,然後瀏覽至 <instrumentation> 元素。將 android:targetProcess 屬性,並將值設為 包括:

  • 特定程序的名稱。
  • 程序名稱清單 (以半形逗號分隔)。
  • 萬用字元 ("*"),可執行檢測作業 針對執行 Pod 中指定套件中程式碼的啟動程序 android:targetPackage 屬性。

在檢測設備測試執行期間,您可以查看 呼叫 getProcessName() 就能進行測試

在測試期間回報結果

您現在可以在檢測設備測試執行期間報告結果。 而不是之後呼叫 addResults()

模擬測試意圖

為讓您更輕鬆地為應用程式的活動建立隔離的獨立 UI 測試,Android 8.0 (API 級別 26) 推出了 onStartActivity() 方法。您可以在 Instrumentation.ActivityMonitor 類別的自訂子類別中覆寫這個方法,以便處理測試類別叫用的特定意圖。

當測試類別叫用意圖時,方法會傳回一個輔助程式 Instrumentation.ActivityResult 物件,而不是執行意圖本身。在測試中使用這個模擬意圖邏輯,您就能專注於活動如何準備及處理傳遞至不同活動或完全不同的應用程式之意圖。

執行階段與工具

平台最佳化

Android 8.0 (API 級別 26) 為平台帶來執行階段和其他最佳化功能,進而改善許多效能。這些最佳化功能包括並行壓縮垃圾收集 更有效率地使用記憶體,以及程式碼位置

這些最佳化措施可縮短啟動時間,並提升 OS 和應用程式的效能。

更新 Java 語言支援

Android 8.0 (API 級別 26) 新增了對幾個其他 OpenJDK Java API 的支援:

如要進一步瞭解這些新增套件中的類別和方法,請參閱 API 參考資料說明文件。

如果您要 會在 Android Studio 中使用 Java 8 語言功能 下載最新的預先發布版

已更新 ICU4J Android 架構 API

Android 8.0 (API 級別 26) 擴充了 ICU4J Android 架構 API 是 ICU4J API 的子集,可讓應用程式開發人員 使用在 android.icu 套件下。這些 API 會使用裝置中顯示的本地化資料,因此您不必在 APK 中編譯 ICU4J 程式庫,便能縮減 APK 占用的空間。

表 1. Android 中使用的 ICU、CLDR 和 Unicode 版本。

Android API 級別 ICU 版本 CLDR 版本 萬國碼 (Unicode) 版本
Android 7.0 (API 級別 24)、Android 7.1 (API 級別 25) 56 28 8.0
Android 8.0 (API 級別 26) 58.2 30.0.3 9.0

如要進一步瞭解 Android 如何國際化 (包括 ICU4J 支援,請參閱 在 Android 上國際化

Android Enterprise

我們為搭載 Android 8.0 (API 級別 26) 的裝置推出了新的企業功能和 API。重點摘要包括:

  • 企業可透過完全受管理裝置上的工作資料夾,將工作資料和個人資料分開,同時管理這兩種資料。
  • API 委派可讓裝置擁有者和設定檔擁有者指派應用程式 管理其他應用程式
  • 改善佈建流程中的使用者體驗 (包括新的 自訂選項),縮短設定時間。
  • 全新藍牙、Wi-Fi、備份和安全性控制選項讓企業 以便管理更多裝置網路活動記錄可協助企業追蹤 也會帶來一些負面體驗

如要進一步瞭解這些和其他新的 Android Enterprise API 和功能,請參閱「企業中的 Android」。