Android 8.0 中如何實現視訊通話的畫中畫模式

聲網Agora發表於2017-11-15

Android 8.0 當中允許 Activiy 以畫中畫模式展現。這是一種多視窗模式的改進加強,在視訊類應用中用處非常大,有了這種模式,就可以在視訊通話或者觀看直播的過程當中開啟另外的應用而不用退出當前視訊。更詳細的就不再累述了,大家去閱讀 官方文件 就行

這裡以 Agora SDK 為例來給大家展示下該特性,實際上不用 Agora SDK 做任何修改。

如果你在參考、開發時,遇到問題,歡迎訪問聲網 Agora問答版塊與聲網的工程師交流。

準備環境

  • Android 8.0 或以上版本手機

  • Agora SDK 1.14.0以上 版本

  • Android Studio 3.0 或以上版本(非必需)

如何實現畫中畫模式

預設應用是不支援畫中畫模式的,需要給視訊所在的 Activity 做些配置,如下在 AndroidManifest.xml 加上屬性 resizeableActivity/supportsPictureInPicture 並均設定為 true

android:resizeableActivity="true"
android:supportsPictureInPicture="true"
android:configChanges=
  "screenSize|smallestScreenSize|screenLayout|orientation"
複製程式碼

為了進入畫中畫模式,Activty 必需要用 enterPictureInPictureMode(PictureInPictureParams params) 方法,非常的簡單,但是為了告訴系統進入畫中畫模式之後,Activity 介面在整個螢幕當中的佈局,我們需要設定一些引數。我們這裡簡單設定下,具體在使用的時候需要根據螢幕的解析度動態取設定,更多資訊參考 官方文件

PictureInPictureParams params = new PictureInPictureParams.Builder()
     .setAspectRatio(new Rational(10, 16))
     .build();
複製程式碼

當然需要在程式當中控制 Acticity 介面當中的內容,比如我們可以隱藏自己本地的預覽畫面,隱藏不需要的按鈕資訊等等,這個實現也非常簡單。

@Override
public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode, Configuration newConfig) {
    super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig);
    FrameLayout container = findViewById(R.id.local_video_view_container);
    SurfaceView surfaceView = (SurfaceView) container.getChildAt(0);
    surfaceView.setZOrderMediaOverlay(!isInPictureInPictureMode);
    surfaceView.setVisibility(isInPictureInPictureMode ? View.GONE : View.VISIBLE);
    container.setVisibility(isInPictureInPictureMode ? View.GONE : View.VISIBLE);
}
複製程式碼

另外值得一說的是,進入畫中畫模式,系統會觸發生命週期的方法 onPause/onResume 方法,我們需要根據需要適當的做些操作,比如是畫中畫模式的話,就不做任何操作,音視訊流繼續,否則的話,就關閉視訊流,反正在後臺也看不見視訊。

執行截圖

Android 8.0 中如何實現視訊通話的畫中畫模式

開始行動吧

還等什麼,瞭解了這些之後,快給自己的應用加上這個功能吧。我們也提供了 示例程式碼 供參考。

本文作者:郭海複製程式碼

相關文章