1. 程式人生 > >細數Android5.0到Android7.X 多媒體技術新特性

細數Android5.0到Android7.X 多媒體技術新特性

Android 5.0 行為變更

媒體播放

如果您要實現顯示媒體播放狀態或傳輸控制元件的通知,請考慮使用新的 Notification.MediaStyle 模板,而不是自定義 RemoteViews.RemoteView 物件。無論您選擇使用哪個方法,請務必將通知的可見性設為 VISIBILITY_PUBLIC,以便可通過鎖定螢幕訪問您的控制元件。請注意,從 Android 5.0 開始,系統不再將 RemoteControlClient 物件顯示在鎖定螢幕上。

媒體控制元件和 RemoteControlClient

RemoteControlClient 類現已棄用。請儘快切換到新的 MediaSession API。

Android 5.0 中的鎖定螢幕不會為 MediaSession 或 RemoteControlClient 顯示傳輸控制元件。不過,您的應用可以通過一個通知從鎖定螢幕提供媒體播放控制元件。這讓您的應用可以對媒體按鈕的顯示進行更多控制,同時為使用鎖定裝置和未鎖定裝置的使用者提供一致的體驗。

為實現此目的,Android 5.0 引入了一個新的 Notification.MediaStyle 模板。Notification.MediaStyle 將您使用 Notification.Builder.addAction() 新增的通知操作轉換為精簡按鈕,嵌入到應用的媒體播放通知中。將您的會話令牌傳遞到 setSession() 方法以告知系統該通知控制進行中的媒體會話。

請務必將通知的可見性設為 VISIBILITY_PUBLIC,以將通知標記為安全,從而顯示在任何鎖定螢幕上(以安全方式或其他方式)。

要讓應用在 Android TV 或 Wear 平臺上執行時顯示媒體播放控制元件,則實現 MediaSession 類。如果您的應用需要在 Android 裝置上接收媒體按鈕事件,您還應實現 MediaSession

螢幕採集和共享

Android 5.0 引入了新的 android.media.projection API,讓您可以為應用新增螢幕採集和螢幕共享功能。例如,如果您想在視訊會議應用中啟用螢幕共享,便可使用此功能。

新增的 createVirtualDisplay() 方法允許您的應用將主螢幕(預設顯示)的內容採集到一個 Surface 物件中,然後您的應用便可將其傳送至整個網路。該 API 只允許採集非安全螢幕內容,不允許採集系統音訊。要開始採集螢幕,您的應用必須先使用通過 createScreenCaptureIntent() 方法獲得的 Intent 啟動螢幕採集對話方塊,請求使用者授予許可權。

圖形
對 OpenGL ES 3.1 的支援

Android 5.0 添加了 Java 介面和對 OpenGLES 3.1 的原生支援。OpenGL ES 3.1 中提供的主要新功能包括:

計算著色器
單獨的著色器物件
間接繪製命令
多重取樣和模具紋理
著色語言改進
高階混合模式和除錯專用擴充套件
向後相容 OpenGL ES 2.0 和 3.0 

Android 上 OpenGL ES 3.1 的 Java 介面隨 GLES31 提供。使用 OpenGL ES 3.1 時,請務必在清單檔案中使用 標記和 android:glEsVersion 屬性對其進行宣告。例如:

<manifest>
    <uses-feature android:glEsVersion="0x00030001" />
    ...
</manifest>

媒體

用於高階相機功能的 Camera API

Android 5.0 引入了新的 android.hardware.camera2 API 來簡化精細照片採集和影象處理。您現在可以使用 getCameraIdList() 通過程式設計方式訪問可供系統使用的相機裝置,以及使用 openCamera() 通過程式設計方式連線特定裝置。要開始採集影象,請建立一個 CameraCaptureSession 並指定用於傳送已採集影象的 Surface 物件。可將 CameraCaptureSession 配置為進行單張拍攝或多張連拍。

要在採集新影象時得到通知,請實現 CameraCaptureSession.CaptureCallback 偵聽器,並在您的採集請求中進行設定。現在,當系統完成影象採集請求時,您的 CameraCaptureSession.CaptureCallback 偵聽器會收到對 onCaptureCompleted() 的呼叫,並在 CaptureResult 中為您提供影象採集元資料。

CameraCharacteristics 類可讓您的應用檢測到裝置上可用的相機功能。該物件的 INFO_SUPPORTED_HARDWARE_LEVEL 屬性代表相機的功能級別。

所有裝置都至少支援 INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY 硬體級別,該級別具有的能力大致與棄用的 Camera API 相當。
支援 INFO_SUPPORTED_HARDWARE_LEVEL_FULL 硬體級別的裝置可手動控制採集和後期處理,以及以高幀速率採集高解析度影象。

音訊回放

此版本加入了對 AudioTrack 的下列更改:

您的應用現在可以提供浮點格式 (ENCODING_PCM_FLOAT) 的音訊資料。這可以實現更大的動態範圍、更一致的精度和更多的動態餘量。浮點演算法在進行中間計算時特別有用。回放端點為音訊資料使用位深度更低的整型格式。(在Android 5.0中,部分內部管道尚未採用浮點格式。)
您的應用現在可以提供音訊資料作為 ByteBuffer,資料使用的格式與 MediaCodec 提供的格式相同。
WRITE_NON_BLOCKING 選項可簡化某些應用的緩衝和多執行緒處理。 

媒體回放控制

使用新增的通知和媒體 API 可確保系統 UI 瞭解您的媒體回放情況,並可提取和顯示專輯封面。現在,可以利用新增的 MediaSession 類和 MediaController 類更輕鬆地在整個 UI 和服務範圍內控制媒體回放。

新增的 MediaSession 類替代了棄用的 RemoteControlClient 類,僅提供一套回撥方法來處理傳輸控制和媒體按鈕。如果您的應用提供媒體回放,並執行在 Android TV 或 Wear 平臺上,請使用 MediaSession 類,通過同樣的回撥方法來處理您的傳輸控制。

現在,您可以使用新增的 MediaController 類開發自己的媒體控制器應用。該類可通過您的應用的 UI 程序,以執行緒安全方式監控和控制媒體回放。請在建立控制器時指定一個 MediaSession.Token 物件,以便您的應用可與給定 MediaSession 互動。您可以利用 MediaController.TransportControls 方法,通過傳送 play()、stop()、skipToNext() 和 setRating() 等命令來控制該會話上的媒體回放。對於控制器,您還可以註冊一個 MediaController.Callback 物件來偵聽該會話上的元資料和狀態變化。

此外,您還可以利用新增的 Notification.MediaStyle 類建立允許將回放控制與媒體會話繫結的豐富通知。
媒體瀏覽

Android 5.0 引入了通過新增的 android.media.browse API 讓應用能夠瀏覽其他應用媒體內容庫的功能。要公開您應用內的媒體內容,請擴充套件 MediaBrowserService 類。您實現的 MediaBrowserService 應提供對 MediaSession.Token 的訪問許可權,以便應用能播放通過您的服務提供的媒體內容。

要與媒體瀏覽器服務互動,請使用 MediaBrowser 類。在您建立 MediaBrowser 例項時為 MediaSession 指定元件名稱。然後,您的應用便可利用該瀏覽器例項連線到關聯的服務並獲得 MediaSession.Token 物件,以播放通過該服務公開的內容。

Android 6.0 變更

音訊管理器變更

不再支援通過 AudioManager 類直接設定音量或將特定音訊流靜音。setStreamSolo() 方法已棄用,您應該改為呼叫 requestAudioFocus() 方法。類似地,setStreamMute() 方法也已棄用,請改為呼叫 adjustStreamVolume() 方法並傳入方向值 ADJUST_MUTE 或 ADJUST_UNMUTE。

音訊功能

此版本增強了 Android 上的音訊處理功能,包括:

通過新增的 android.media.midi API 提供了對 MIDI 協議的支援。使用這些 API 可傳送和接收 MIDI 事件。
新增了 AudioRecord.Builder 類和 AudioTrack.Builder 類,分別用於建立數字音訊採集和回放物件,還可用於配置音訊源和接收器屬性來替換系統預設值。
用於關聯音訊和輸入裝置的 API 鉤子。如果您的應用允許使用者通過與 Android TV 相連的遊戲控制器或遙控器啟動語音搜尋,此功能尤為有用。系統會在使用者啟動搜尋時呼叫新增的 onSearchRequested() 回撥。要確定使用者的輸入裝置是否內建麥克風,請從該回調檢索 InputDevice 物件,然後呼叫新的 hasMicrophone() 方法。
新增了 getDevices() 方法,讓您可以檢索系統當前連線的所有音訊裝置的列表。如果您想讓系統在音訊裝置連線或斷開時通知應用,還可以註冊一個 AudioDeviceCallback 物件。

視訊功能

此版本為視訊處理 API 添加了新功能,包括:

新增了 MediaSync 類,可幫助應用同步渲染音訊流和視訊流。音訊緩衝區以非鎖定方式提交,並通過回撥返回。此外,它還支援動態回放速率。
新增了 EVENT_SESSION_RECLAIMED 事件,它表示應用開啟的會話已被資源管理器收回。如果您的應用使用 DRM 會話,則應處理此事件,並確保不使用收回的會話。
新增了 ERROR_RECLAIMED 錯誤程式碼,它表示資源管理器收回了編解碼器使用的媒體資源。出現此異常時,必須釋放編解碼器,因為它已轉入終止狀態。
新增了 getMaxSupportedInstances() 介面,用於獲取有關支援的編解碼器例項最大併發數量的提示。
新增了 setPlaybackParams() 方法,用於設定快動作回放或慢動作回放的媒體回放速率。此外,它還會隨視訊一起自動拉長或加速音訊回放。

相機功能

此版本提供了下列用於訪問相機閃光燈和相機影象再處理的新 API:
Flashlight API

如果相機裝置帶有閃光燈,您可以通過呼叫 setTorchMode() 方法,在不開啟相機裝置的情況下開啟或關閉閃光燈的火炬模式。應用對閃光燈或相機裝置不享有獨佔所有權。每當相機裝置不可用,或者開啟火炬的其他相機資源不可用時,火炬模式即會被關閉並變為不可用狀態。其他應用也可呼叫 setTorchMode() 來關閉火炬模式。當最後一個開啟火炬模式的應用關閉時,火炬模式就會被關閉。

您可以註冊一個回撥,通過呼叫 registerTorchCallback() 方法接收有關火炬模式狀態的通知。第一次註冊回撥時,系統會立即呼叫它,並返回所有當前已知配備閃光燈的相機裝置的火炬模式狀態。如果成功開啟或關閉火炬模式,系統會呼叫 onTorchModeChanged() 方法。
Reprocessing API

Android 7.0 行為變更

OpenGL™ ES 3.2 API

Android 7.0 添加了框架介面和對 OpenGL ES 3.2 的平臺支援,包括:

來自 Android 擴充套件包 (AEP) 的所有擴充套件(EXT_texture_sRGB_decode 除外)。
針對 HDR 的浮點幀緩衝和延遲著色。
BaseVertex 繪圖呼叫可實現更好的批處理和流媒體服務。
強大的緩衝區訪問控制可減少 WebGL 開銷。 

Android 7.0 上適用於 OpenGL ES 3.2 的框架 API 與 GLES32 類一起提供。使用 OpenGL ES 3.2 時,請務必通過 標記和 android:glEsVersion 屬性在您的清單檔案中宣告要求。

Android 7.0 通過新的錄製 API 添加了從 Android TV 輸入服務錄製和播放內容的功能。構建在現有時移 API 之上,TV 輸入服務可以控制能夠錄製的渠道資料、保存錄制的會話的方式,同時可通過錄制的內容管理使用者互動。

VR 支援

Android 7.0 添加了新的 VR 模式的平臺支援和優化,以使開發者能為使用者打造高質量移動 VR 體驗。增加了一些效能增強特性,包括允許 VR 應用訪問某個專屬的 CPU 核心。在您的應用中,您可以充分利用到專為 VR 設計的智慧頭部跟蹤和立體聲通知功能。最重要的是,Android 7.0 的圖形延時非常低