通過Android SDK接入流程這篇文檔,您已經瞭解了Android SDK匯入、配置、解析IP、應用到網路程式庫和接入驗證的完整流程,本文主要介紹如何在 ExoPlayer 中通過 OkHttp 接入 HTTPDN的具體方案。
1. 背景說明
Media3是Google官方推薦的用於打造音頻和視頻體驗的解決方案,它提供一個簡單的架構,可基於裝置功能進行強大的自訂、可靠性和最佳化,以消除片段帶來的複雜性,可讓 Android 應用顯示豐富的視聽體驗。ExoPlayer 是 Media3 中 Player 介面的預設實現。
ExoPlayer是使用DataSource來讀取URI定義的資源資料,從網路讀取資源預設是由DefaultHttpDataSource來完成,其內部是使用HttpURLConnection來處理網路請求。此外,ExoPlayer也提供了OkHttp網路程式庫對應的OkHttpDataSource來處理網路請求。
由於OkHttp暴露了自訂DNS服務的介面,通過該介面我們可以優雅地使用HTTPDNS,所以推薦使用OkHttpDataSource。
2. 添加OkHttp擴充SDK
您需要根據您使用的ExoPlayer版本來選擇對應的OkHttp擴充SDK。
如果您使用的ExoPlayer版本是androix下的media,需要添加下面的依賴項:
implementation "androidx.media3:media3-datasource-okhttp:x.x.x"OkHttp擴充庫的版本請和ExoPlayer SDK的版本保持一致。
如果您使用的ExoPlayer版本是ExoPlayer2,需要添加下面的依賴項:
implementation "com.google.android.exoplayer:extension-okhttp:x.x.x"OkHttp擴充庫的版本請和ExoPlayer SDK的版本保持一致。
3. 使用OkHttp擴充SDK
在初始化ExoPlayer時,使用OkHttp擴充庫。
上一部分介紹的兩個版本的ExoPlayer,使用OkHttp擴充庫的代碼是一樣的。
val player: ExoPlayer = ExoPlayer.Builder(context)
.setMediaSourceFactory(
DefaultMediaSourceFactory(
OkHttpDataSource.Factory(
Call.Factory {
//此處clent是OkHttpClient執行個體,請替換成您專案中的OkHttpClient執行個體
request -> client.newCall(request)
})
)
)
.build()ExoPlayer player = new ExoPlayer.Builder(context)
.setMediaSourceFactory(new DefaultMediaSourceFactory(new OkHttpDataSource.Factory(new Call.Factory() {
@NonNull
@Override
public Call newCall(@NonNull Request request) {
//此處clent是OkHttpClient執行個體,請替換成您專案中的OkHttpClient執行個體
return client.newCall(request);
}
})))
.build();4. 基於OkHttp使用HTTPDNS
最後就是在OkHttp網路程式庫中整合HTTPDNS,具體整合步驟請參考Android端HTTPDNS+OkHttp最佳實務。