Android 8.0 (API 級別 26) 為使用者和開發人員導入了多種新功能。本文件將重點介紹開發人員適用的新功能。
請務必查看 Android 8.0 行為變更,瞭解平台變更可能影響應用程式的哪些部分。
使用者體驗
子母畫面模式
Android 8.0 中的子母畫面。
Android 8.0 (API 級別 26) 允許活動以子母畫面 (PIP) 模式啟動。子母畫面是特殊類型的多視窗模式,主要用於影片播放。PIP 模式原本僅適用於 Android TV,Android 8.0 則開放其他 Android 裝置使用這項功能。
活動處於子母畫面模式時,會處於暫停狀態,但應該繼續顯示內容。因此,您應確保應用程式不會在 onPause()
處理常式中暫停播放。請改為在 onStop()
中暫停影片,並在 onStart()
中繼續播放。詳情請參閱「多視窗生命週期」。
如要指定活動可使用子母畫面模式,請在資訊清單中將 android:supportsPictureInPicture
設為 true。(從 Android 8.0 開始,子母畫面不需要 android:resizeableActivity
資訊清單屬性。不過,如果活動支援其他多視窗模式,則必須將 android:resizeableActivity
設為「true」)。
Android 8.0 (API 級別 26) 導入了新物件 PictureInPictureParams
,這個物件會傳送至子母畫面方法,指定活動處於子母畫面模式時的行為。這個物件會指定活動偏好顯示比例等屬性。
「新增子母畫面」一文所述的現有 PIP 方法現在可供所有 Android 裝置使用,而不只是在 Android TV 上。此外,Android 8.0 還提供下列支援子母畫面模式的方法:
Activity.enterPictureInPictureMode(PictureInPictureParams args)
:在子母畫面模式中放置活動。活動的顯示比例和其他配置設定是由 args 指定。如果 args 中的任何欄位為空白,系統會使用您上次呼叫Activity.setPictureInPictureParams()
時設定的值。指定的活動會放在畫面的角落,畫面的其餘部分會填滿螢幕上先前的活動。進入子母畫面模式的活動會進入暫停狀態,但會仍處於暫停狀態。當使用者輕觸子母畫面活動時,系統會顯示選單供使用者進行互動;當活動處於子母畫面狀態時,系統就不會觸及任何觸控事件。
-
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 (API 級別 26) 中的通知長按選單。](https://developer.android.com/static/images/about/versions/oreo/notification-long-press.png?authuser=9&hl=zh-tw)
使用者只要長按應用程式啟動器圖示,即可在 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 Browsing 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 支援資料庫模組形式發布。
AnimatorSet
從 Android 8.0 (API 級別 26) 開始,AnimatorSet
API 現已支援反向搜尋和播放功能。跳轉功能可讓您將動畫位置設為特定時間點。如果應用程式包含可復原動作的動畫,反向播放會非常實用。您可以反向播放相同的動畫集,而不用定義兩個不同的動畫集。
輸入和瀏覽
鍵盤瀏覽叢集
如果應用程式中的活動使用複雜的檢視區塊階層 (如圖 2 中的階層),請考慮將 UI 元素群組整理成多個叢集,方便在叢集之間使用鍵盤瀏覽。使用者只要按下 Chromebook 裝置上的 Meta + Tab 或搜尋鍵 + Tab 鍵,即可瀏覽各個叢集。叢集的範例包括:側邊面板、導覽列、主要內容區域,以及可能包含許多子元素的元素。
![此活動範例包含五個導覽叢集,使用者可以使用鍵盤導覽叢集捷徑進行瀏覽。叢集會以下列排列方式顯示:頂端面板、左側面板、主要內容區域、底部面板和懸浮動作按鈕。](https://developer.android.com/static/images/about/versions/oreo/keyboard-navigation-clusters.png?authuser=9&hl=zh-tw)
如要將 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
。
改善媒體檔案存取功能
Storage Access Framework (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) 中使用 Storage Access Framework 時,您可以使用 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 的支援,這是根據 Neighbor Awareness Networking (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
權限可授權應用程式讀取裝置上儲存的電話號碼。
新的帳戶存取權和探索 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[])
:在AccountManager
物件中新增OnAccountsUpdateListener
事件監聽器。每當裝置上的帳戶清單有所變更時,系統就會呼叫這個事件監聽器。
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 支援:
- 來自 OpenJDK 8 的
java.time
。 - 來自 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 Enterprise 企業版。