Android 8.0 (API 級別 26) 為使用者和開發人員推出了各種新功能。本文件將介紹開發人員新增的新功能。
請務必一併參閱「 Android 8.0 行為變更」,瞭解平台變更可能會對應用程式造成影響。
使用者體驗
子母畫面模式
Android 8.0 版的子母畫面。
Android 8.0 (API 級別 26) 可讓活動在子母畫面 (PIP) 模式中啟動。PIP 是一種特殊的多視窗模式,最常用於播放影片。PIP 模式最初僅適用於 Android TV;Android 8.0 提供這項功能。
當活動處於子母畫面模式時,會處於暫停狀態,但應繼續顯示內容。因此,您應確保應用程式不會在 onPause()
處理常式中暫停播放。請改為暫停 onStop()
中的影片,並在 onStart()
後繼續播放。詳情請參閱「多視窗生命週期」。
如要指定活動可以使用子母畫面模式,請在資訊清單中將 android:supportsPictureInPicture
設為 true。(從 Android 8.0 開始,PIP 不需要 android:resizeableActivity
資訊清單屬性,不過,如果您的活動支援其他多視窗模式,就必須將 android:resizeableActivity
設為「true」)。
Android 8.0 (API 級別 26) 導入了 PictureInPictureParams
這個新物件;您可以傳遞至 PIP 方法,指定活動處於 PIP 模式時應採取的行為。這個物件會指定活動偏好的顯示比例等屬性。
「新增子母畫面」一文所述的現有 PIP 方法現在可用於所有 Android 裝置,而不僅限於 Android TV。此外,Android 8.0 提供下列支援子母畫面模式的方法:
Activity.enterPictureInPictureMode(PictureInPictureParams args)
:將活動置於子母畫面模式。活動的顯示比例和其他配置設定是由 args 指定。如果 args 中的任何欄位為空白,系統會使用您上次呼叫Activity.setPictureInPictureParams()
時設定的值。指定的活動會顯示在畫面的角落;螢幕畫面的其餘部分會填入螢幕上先前的活動。進入子母畫面模式的活動會進入暫停狀態,但會繼續啟動。當使用者輕觸子母畫面活動時,系統會顯示選單供使用者進行互動,而活動處於 PIP 狀態時,則沒有任何觸控事件到達活動。
-
Activity.setPictureInPictureParams()
:更新活動的子母畫面配置設定。如果活動目前處於子母畫面模式,設定將會更新;如果活動的顯示比例有所變更,這項功能就相當實用。如果活動並非處於子母畫面模式,無論您呼叫的enterPictureInPictureMode()
方法為何,系統都會使用這些設定。
通知
在 Android 8.0 (API 級別 26) 中,我們重新設計了通知,讓您可以更輕鬆、更一致地管理通知行為和設定。這些異動包括:
- 通知管道:Android 8.0 推出了通知管道,可讓您為要顯示的每種通知類型,建立可供使用者自訂的管道。使用者介面將通知管道稱為「通知類別」。如要瞭解如何實作通知管道,請參閱「管理通知管道」。
- 通知圓點:Android 8.0 支援在應用程式啟動器圖示上顯示圓點或標記。通知圓點代表使用者尚未關閉或處理的通知。如要瞭解如何使用通知圓點,請參閱「通知標記」。
- 延後:使用者可以延後通知,進而讓通知在重新顯示前一段時間消失。通知會再次顯示通知的重要性程度與先後順序相同。應用程式可以移除或更新延後通知,但更新延後通知不會讓通知再次顯示。
- 通知逾時:您可以使用
setTimeoutAfter()
建立通知時設定逾時。您可以使用此方法指定通知在多久之後取消。如有需要,您可以在指定的逾時時間結束前取消通知。 - 通知設定:您可以利用
Notification.INTENT_CATEGORY_NOTIFICATION_PREFERENCES
意圖,呼叫setSettingsText()
設定在通知中建立應用程式通知設定的連結時,顯示的文字。系統可能會提供下列額外項目,意圖篩選應用程式必須向使用者顯示的設定:EXTRA_CHANNEL_ID
、NOTIFICATION_TAG
和NOTIFICATION_ID
。 - 關閉通知:使用者可以自行關閉通知,應用程式則可透過程式輔助方式移除通知。您可以實作
NotificationListenerService
類別中的onNotificationRemoved()
方法,決定通知的關閉時間和關閉原因。 - 背景顏色:您可以設定並啟用通知的背景顏色。此功能只應用於進行中工作,以便使用者一目瞭然。舉例來說,您可以為與行車路線相關的通知或進行中的通話設定背景顏色。您也可以使用
setColor()
設定所需的背景顏色。這樣您就能使用setColorized()
為通知啟用背景顏色。 - 訊息樣式:在 Android 8.0 中,使用
MessagingStyle
類別的通知會在收合表單中顯示更多內容。您應針對與訊息相關的通知使用MessagingStyle
類別。您也可以使用addHistoricMessage()
方法,將歷來訊息新增至訊息相關的通知,藉此提供對話的背景資訊。

使用者可以長按應用程式啟動器圖示,查看 Android 8.0 中的通知。
自動填入架構
建立帳戶、登入和信用卡交易需要時間,且容易發生錯誤。如果應用程式需要這些重複性工作,使用者可能會因此感到不悅。
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 大小,請參閱「自動調整 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
- 終止帳號代碼 API
- Renderer Importance API
如要進一步瞭解如何使用這些 API,請參閱管理 WebView。
WebView
類別現在包含 Safe Browse 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 會自動為該活動啟用多螢幕支援功能。建議您測試應用程式,確保應用程式在多螢幕環境中能正常運作。
即使應用程式有多個螢幕,一次只有一個活動有可能處於已恢復狀態。焦點的活動會處於已重新啟用狀態;所有其他顯示活動都會暫停,但不會停止。如要進一步瞭解顯示數個活動時的活動生命週期,請參閱「多視窗生命週期」。
當使用者將活動移至另一個螢幕時,系統會調整活動的大小,並視需要發出執行階段變更。活動可以自行處理設定變更,也可以允許系統刪除包含活動的程序,並使用新維度重新建立該活動。詳情請參閱「處理設定變更」。
ActivityOptions
提供兩種支援多個螢幕的新方法:
setLaunchDisplayId()
- 指定活動啟動時要顯示的顯示畫面。
getLaunchDisplayId()
- 傳回活動目前的啟動顯示畫面。
ADB 殼層是擴充以支援多個螢幕。shell start
指令現在可用來啟動活動,以及指定活動的目標顯示螢幕:
adb shell start <activity_name> --display <display_id>
統一版面配置邊界和邊框間距
Android 8.0 (API 級別 26) 可讓您指定 View
元素的對面具有相同邊界或邊框間距的情況。具體來說,您現在可以在版面配置 XML 檔案中使用下列屬性:
-
layout_marginVertical
,其定義了layout_marginTop
和layout_marginBottom
。 -
layout_marginHorizontal
,其定義了layout_marginLeft
和layout_marginRight
。 -
paddingVertical
,其定義了paddingTop
和paddingBottom
。 -
paddingHorizontal
,其定義了paddingLeft
和paddingRight
。
注意:如果您自訂應用程式的邏輯來支援不同的語言和文化 (包括文字方向),請注意,這些屬性不會影響
layout_marginStart
、
layout_marginEnd
、
paddingStart
或
paddingEnd
的值。除了新的垂直和水平版面配置屬性外,您也可以自行設定這些值,以建立根據文字方向顯示的版面配置行為。
指標擷取
部分應用程式 (例如遊戲、遠端桌面和虛擬化用戶端) 可以透過控制滑鼠遊標而獲得顯著優勢。指標擷取是 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 TV 模擬器和 Android 8.0 的 Nexus Player 裝置映像檔使用。新的主畫面會在與頻道對應的資料列中整理影片內容,每個頻道都有一個應用程式所填入的節目。應用程式可以發布多個頻道,使用者也能設定自己想要在主畫面上看到哪些頻道。Android TV 主畫面也包含「接下來請看」列,系統會根據使用者的觀看習慣填入應用程式的節目。應用程式也可以提供影片預覽,當使用者聚焦某個節目時,應用程式就會自動播放。填入管道和程式的 API 屬於 TvProvider API 的一部分,以 Android 8.0 的 Android 支援資料庫模組發布。
動畫集
從 Android 8.0 (API 級別 26) 開始,AnimatorSet
API 現在支援跳轉和播放功能。跳轉功能可用來將動畫的位置設為特定時間點。如果應用程式包含可復原動作的動畫,則反向播放是非常實用的做法。您可以反向播放相同的動畫集,不必定義兩個獨立的動畫集。
輸入與導覽
鍵盤導覽叢集
如果應用程式中的活動使用複雜的檢視區塊階層 (例如圖 2 中的階層),請考慮將 UI 元素群組整理成叢集,以便使用鍵盤進行瀏覽。使用者只要在 Chromebook 裝置上按下 Meta + Tab 鍵或搜尋鍵 + Tab 鍵,即可切換叢集。叢集的例子包括側邊面板、導覽列、主要內容區域,以及可包含許多子項元素的元素。

如要將 View
或 ViewGroup
元素建立為叢集,請在元素的版面配置 XML 檔案中將
android:keyboardNavigationCluster
屬性設為 true
,或將 true
傳遞至應用程式 UI 邏輯中的 setKeyboardNavigationCluster()
。
注意:叢集不可包含巢狀結構,但非巢狀叢集可能會顯示在階層的不同層級。如果您嘗試建立巢狀叢集結構,則架構只會將最頂層的 ViewGroup
元素視為叢集。
在配備觸控螢幕的裝置上,您可以將叢集指定的 ViewGroup
物件的 android:touchscreenBlocksFocus
元素設為 true
,允許僅叢集進出該叢集。如果您將這個設定套用至叢集,使用者無法使用 Tab 鍵或方向鍵前往叢集或離開叢集,必須改為按下叢集瀏覽鍵盤組合。
查看預設焦點
在 Android 8.0 (API 級別 26) 中,您可以指派 View
,以便在 (重新建立) 活動、使用者按下鍵盤瀏覽鍵 (例如 Tab 鍵) 後接收焦點。如要套用這項「預設為聚焦」設定,請在包含 UI 元素的版面配置 XML 檔案中,將 View
元素的
android:focusedByDefault
屬性設為 true
,或將 true
傳入應用程式 UI 邏輯中的 setFocusedByDefault()
。
語音輸出
活動和服務可以使用 TextToSpeech
的執行個體來語音輸入及發音。自 Android 8.0 (API 級別 26) 起,只要引擎提供這項資訊,文字轉語音引擎開始說出個別合成字詞的時機,您的應用程式就能取得更精確的時間資訊。您可以使用這項功能,讓文字轉語音引擎朗讀特定字詞。
如要在應用程式中使用這些文字轉語音引擎改善項目,請註冊 UtteranceProgressListener
的執行個體。在註冊過程中,加入 onRangeStart()
方法的處理常式。
文字轉語音引擎會呼叫 rangeStart()
來記錄預期音訊播放特定範圍文字的時間點。該文字範圍的音訊開始播放時,系統會執行應用程式的 onRangeStart()
方法。然後,應用程式就可以回應此回呼,例如醒目顯示與語音內容相關聯的文字範圍。
如要進一步瞭解如何追蹤文字轉語音引擎的播放進度,請參閱 UtteranceProgressListener
類別參考資料。
系統
新的 StrictMode 偵測工具
Android 8.0 (API 級別 26) 新增了三個 StrictMode 偵測工具,有助於找出應用程式中的潛在錯誤:
detectUnbufferedIo()
會偵測應用程式在沒有緩衝處理的情況下讀取或寫入資料的時機,進而大幅影響效能。- 在應用程式外啟動活動時,
detectContentUriWithoutPermission()
會偵測應用程式是否不小心忘記將權限授予其他應用程式。 detectUntaggedSockets()
會偵測應用程式執行網路流量的時機,而不使用setThreadStatsTag(int)
標記流量以便進行偵錯。
快取資料
Android 8.0 (API 級別 26) 可針對快取資料提供更完善的指示和行為。每個應用程式現在都會獲得快取資料的磁碟空間配額,與 getCacheQuotaBytes(UUID)
傳回的資料相同。
系統需要釋出磁碟空間時,會先從超出分配配額的應用程式刪除快取檔案。因此,如果您將快取資料保存在分配的配額內,快取檔案會成為系統上最後的部分會在必要時清除。系統決定要在應用程式中刪除哪些快取檔案時,會先考慮最舊的檔案 (由修改時間決定)。
您也可以針對個別目錄啟用兩種新行為,以控制系統釋出快取資料的方式:
StorageManager.setCacheBehaviorAtomic()
可用來表示目錄及其所有內容都應刪除為單一不可分割單元。setCacheBehaviorTombstone(File, boolean)
可用來表示不應刪除目錄中的檔案,而不需要刪除目錄中的檔案,而是要完整保留為 0 個位元組,完整保留空白檔案。
最後,如果您需要為大型檔案分配磁碟空間,請考慮使用新的 allocateBytes(FileDescriptor, long)
API,這個 API 可視需要自動清除屬於其他應用程式的快取檔案,以滿足您的要求。在判斷裝置是否有足夠的磁碟空間可保存新資料時,請呼叫 getAllocatableBytes(UUID)
而非使用 getUsableSpace()
,因為前者會考慮系統願意代表您清除的任何快取資料。
內容供應器分頁
我們已更新內容供應器,以支援一次載入大型資料集 (一頁) 的支援功能。舉例來說,如果相片應用程式有數千張圖片,就能查詢網頁中要呈現的部分資料。內容供應器傳回的每個結果頁面都以單一遊標物件表示。用戶端和供應商都必須實作分頁,才能使用這項功能。
如要進一步瞭解內容供應器的變更,請參閱 ContentProvider
和 ContentProviderClient
。
內容更新要求
ContentProvider
和 ContentResolver
類別現在皆包含 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
相同的功能,但會在 Android 8.0 (API 級別 26) 以上版本中執行時會使用工作,而非服務。 -
您現在可以呼叫
JobInfo.Builder.setClipData()
,將ClipData
與工作建立關聯。這個選項可讓您將 URI 權限授予工作與工作建立關聯,類似於向Context.startService()
取得這些權限的方式。您也可以在工作佇列中搭配意圖使用 URI 權限授權。 -
排定的工作現在支援多項新的限制:
JobInfo.isRequireStorageNotLow()
- 如果裝置的可用儲存空間不足,工作就無法執行。
JobInfo.isRequireBatteryNotLow()
- 如果電池電量等於或低於重要門檻,本工作就不會執行;這是裝置顯示「低電量警示」系統對話方塊的等級。
NETWORK_TYPE_METERED
- 工作需要計量付費網路連線,與大多數的行動數據方案一樣。
自訂資料儲存庫
Android 8.0 (API 級別 26) 可讓您按照自己的偏好提供自訂資料儲存庫,如果應用程式將偏好設定儲存在雲端或本機資料庫,或是偏好設定因裝置而異,就能派上用場。如要進一步瞭解如何實作資料儲存庫,請參閱「自訂資料儲存庫」。
媒體強化功能
VolumeShaper
有新的 VolumeShaper
類別。可用來執行簡短的自動音量轉換,例如淡入、淡出和交叉淡出。詳情請參閱「使用 VolumeShaper 控制 Amplitude」一文。
強化音訊焦點
音訊應用程式會要求及捨棄音訊焦點,藉此在裝置上共用音訊輸出。應用程式會啟動或停止播放,或是降低音量,藉此處理焦點變更。有新的 AudioFocusRequest
類別。使用這個類別做為 requestAudioFocus()
的參數,應用程式在處理音訊焦點的異動時,可以使用新的功能:自動降低其他應用程式音量和延遲對焦增益。
媒體指標
新的 getMetrics()
方法會傳回包含設定和效能資訊的 PersistableBundle
物件,並以屬性和值的對應方式表示。您為以下媒體類別定義了 getMetrics()
方法:
MediaPlayer.getMetrics()
MediaRecorder.getMetrics()
MediaCodec.getMetrics()
MediaExtractor.getMetrics()
系統會針對每個執行個體分別收集指標,並在執行個體的生命週期中保留指標。如果沒有可用的指標,這個方法會傳回空值。實際傳回的指標取決於類別。
媒體播放器
從 Android 8.0 (API 級別 26) 開始,MediaPlayer 可播放 DRM 保護素材和 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);
MediaMuxer
現在可以處理任意數量的音訊和視訊串流。不再只侷限於單一音軌和/或一個視訊軌。使用addTrack()
即可隨意混音,數量不限。MediaMuxer
也可以新增一或多個中繼資料軌,包含使用者定義的每個影格資訊。中繼資料的格式是由應用程式定義。中繼資料音軌僅適用於 MP4 容器。
中繼資料有助於離線處理。例如,感應器的陀螺儀訊號可用於執行影像穩定度。
新增中繼資料軌時,曲目的 MIME 格式開頭必須加上「application/」前置字串。寫入中繼資料與寫入影片/音訊資料相同,但資料並非來自 MediaCodec
。反之,應用程式會將含有相關聯時間戳記的 ByteBuffer
傳遞至 writeSampleData()
方法。時間戳記必須與影片和音軌相同。
產生的 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()
方法取得參照與指定 mediaUri
所參照文件的 URI。不過,由於傳回的 URI 由 DocumentsProvider
支援,因此媒體集合管理工具可以直接存取文件,不必掃遍範圍目錄的樹狀結構。因此,媒體管理員可以大幅更快地對文件執行檔案作業。
注意:getDocumentUri()
方法只會尋找媒體檔案,不會授予應用程式存取這些檔案的權限。如要進一步瞭解如何取得媒體檔案的存取權,請參閱參考說明文件。
文件路徑
在 Android 8.0 (API 級別 26) 中使用儲存空間存取架構時,您可以使用 DocumentsContract
和 DocumentsProvider
類別提供的 findDocumentPath()
方法,根據指定的文件 ID,從檔案系統的根目錄中決定路徑。這個方法會在 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 Aware 硬體的裝置上,應用程式和鄰近裝置可以在沒有網際網路存取點時,透過 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) 會瞭解使用者的個人化共用偏好設定,並進一步瞭解適合用來分享的各類內容。舉例來說,如果使用者拍下收據的相片,Android 8.0 可以推薦費用追蹤應用程式;如果使用者自拍,社群媒體應用程式就能更妥善地處理圖片。Android 8.0 會根據使用者的個人化偏好自動學習所有模式。
智慧分享功能適用於 image
以外的內容類型,例如 audio
、video
、text
、URL
等。
如要啟用智慧分享功能,請在共用內容的意圖中加入 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) 推出了幾項與電話通訊相關的新權限:
-
ANSWER_PHONE_CALLS
權限可讓應用程式透過程式輔助方式接聽來電。如要在應用程式中處理來電,可以使用acceptRingingCall()
方法。 -
READ_PHONE_NUMBERS
權限可讓應用程式讀取裝置上儲存的電話號碼。
上述權限皆歸類為危險,並且都是 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 提供六種新方法,可協助驗證器管理哪些應用程式可查看帳戶:
setAccountVisibility(android.accounts.Account, java.lang.String, int)
:設定特定使用者帳戶和套件組合的瀏覽權限層級。-
getAccountVisibility(android.accounts.Account, java.lang.String)
:取得特定使用者帳戶和套件組合的瀏覽權限層級。 -
getAccountsAndVisibilityForPackage(java.lang.String, java.lang.String)
:允許驗證器取得特定套件的帳戶和瀏覽權限層級。 -
getPackagesAndVisibilityForAccount(android.accounts.Account)
:允許驗證器取得特定帳戶儲存的瀏覽權限值。 -
addAccountExplicitly(android.accounts.Account, java.lang.String, android.os.Bundle, java.util.Map<java.lang.String, java.lang.Integer>)
:允許驗證器初始化帳戶的瀏覽權限值。 -
addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[])
:將OnAccountsUpdateListener
事件監聽器新增至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,請參閱 AccountManager
和 OnAccountsUpdateListener
的參考資料。
測試
檢測設備測試
Android 8.0 (API 級別 26) 針對應用程式的檢測設備測試提供以下額外支援功能。
針對非預設應用程式程序執行
現在,您可以指定特定檢測設備測試應針對應用程式預設程序以外的程序執行。如果應用程式含有在不同程序中執行的多個活動,這項設定就非常實用。
如要定義非預設的程序檢測作業,請前往資訊清單檔案,然後前往所需的
<instrumentation>
元素。新增 android:targetProcess
屬性,並將值設為下列其中一個值:
- 特定程序的名稱。
- 以半形逗號分隔的程序名稱清單。
- 萬用字元 (
"*"
),允許檢測作業針對任何會執行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:
java.time
來自 OpenJDK 8。- 從 OpenJDK 7 中的
java.nio.file
和java.lang.invoke
。
如要進一步瞭解這些新增套件中的類別和方法,請參閱 API 參考說明文件。
如果您想在 Android Studio 中 使用 Java 8 語言功能,請下載最新的預先發布版。
更新了 ICU4J Android Framework API
Android 8.0 (API 級別 26) 會擴充 ICU4J Android Framework 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 企業 API 與功能,請參閱「Android 企業版」。