Android 8.0 中如何实现视频通话的画中画模式的示例
Android8.0当中允许Activiy以画中画模式展现。这是一种多窗口模式的改进加强,在视频类应用中用处非常大,有了这种模式,就可以在视频通话或者观看直播的过程当中打开另外的应用而不用退出当前视频。更详细的就不再累述了,大家去阅读官方文档就行
这里以AgoraSDK为例来给大家展示下该特性,实际上不用AgoraSDK做任何修改。
准备环境
- Android8.0或以上版本手机
- AgoraSDK1.14.0或以上版本
- AndroidStudio3.0或以上版本(非必需)
如何实现画中画模式
默认应用是不支持画中画模式的,需要给视频所在的Activity做些配置,如下在AndroidManifest.xml加上属性resizeableActivity/supportsPictureInPicture并均设置为true
android:resizeableActivity="true" android:supportsPictureInPicture="true" android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
为了进入画中画模式,Activty必需要用enterPictureInPictureMode(PictureInPictureParamsparams)方法,非常的简单,但是为了告诉系统进入画中画模式之后,Activity界面在整个屏幕当中的布局,我们需要设置一些参数。我们这里简单设置下,具体在使用的时候需要根据屏幕的分辨率动态取设置,更多信息参考官方文档。
PictureInPictureParamsparams=newPictureInPictureParams.Builder() .setAspectRatio(newRational(10,16)) .build();
当然需要在程序当中控制Acticity界面当中的内容,比如我们可以隐藏自己本地的预览画面,隐藏不需要的按钮信息等等,这个实现也非常简单。
@Override
publicvoidonPictureInPictureModeChanged(booleanisInPictureInPictureMode,ConfigurationnewConfig){
super.onPictureInPictureModeChanged(isInPictureInPictureMode,newConfig);
FrameLayoutcontainer=findViewById(R.id.local_video_view_container);
SurfaceViewsurfaceView=(SurfaceView)container.getChildAt(0);
surfaceView.setZOrderMediaOverlay(!isInPictureInPictureMode);
surfaceView.setVisibility(isInPictureInPictureMode?View.GONE:View.VISIBLE);
container.setVisibility(isInPictureInPictureMode?View.GONE:View.VISIBLE);
}
另外值得一说的是,进入画中画模式,系统会触发生命周期的方法onPause/onResume方法,我们需要根据需要适当的做些操作,比如是画中画模式的话,就不做任何操作,音视频流继续,否则的话,就关闭视频流,反正在后台也看不见视频。
另外Android8.0画中画demo
记录一下简单的demo,方便以后用到:
packagecom.example.myapplication;
importandroid.annotation.TargetApi;
importandroid.app.PictureInPictureParams;
importandroid.content.res.Configuration;
importandroid.os.Build;
importandroid.os.Bundle;
importandroid.support.annotation.Nullable;
importandroid.support.v7.app.AppCompatActivity;
importandroid.util.Log;
importandroid.util.Rational;
importandroid.view.Gravity;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.FrameLayout;
importandroid.widget.TextView;
/**
*画中画
*/
publicclassTestPIPActivityextendsAppCompatActivity{
privatestaticfinalStringTAG="TestPIPActivity";
privatePictureInPictureParams.BuildermPictureInPictureParamsBuilder;
@TargetApi(Build.VERSION_CODES.O)
@Override
protectedvoidonCreate(@NullableBundlesavedInstanceState){
super.onCreate(savedInstanceState);
FrameLayoutcontent=newFrameLayout(this);
setContentView(content,newViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT));
if(Build.VERSION.SDK_INT==Build.VERSION_CODES.O){
mPictureInPictureParamsBuilder=newPictureInPictureParams.Builder();
finalTextViewtextView=newTextView(this);
textView.setText("testPIP");
textView.setTextSize(20);
FrameLayout.LayoutParamsfl=newFrameLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
fl.gravity=Gravity.CENTER;
textView.setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){//主要操作
RationalaspectRatio=newRational(10,10);
mPictureInPictureParamsBuilder.setAspectRatio(aspectRatio).build();
enterPictureInPictureMode(mPictureInPictureParamsBuilder.build());
}
});
content.addView(textView,fl);
}else{
TextViewdescTv=newTextView(this);
descTv.setText("当前版本不支持...");
descTv.setTextSize(20);
FrameLayout.LayoutParamsTvfl=newFrameLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
Tvfl.gravity=Gravity.CENTER;
content.addView(descTv,Tvfl);
}
}
@Override
publicvoidonPictureInPictureModeChanged(booleanisInPictureInPictureMode,ConfigurationnewConfig){
super.onPictureInPictureModeChanged(isInPictureInPictureMode,newConfig);
Log.d(TAG,String.valueOf(isInPictureInPictureMode));
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。