Android仿优酷视频的悬浮窗播放
之前接了需求要让视频播放时可以像优酷视频那样在悬浮窗里播放,并且悬浮窗和主播放页面之间要实现无缝切换,项目中使用的是自封装的ijkplayer
这个要求就代表不能在悬浮窗中新建视频控件,所以需要在悬浮窗中复用主页面的视频控件,以达到无缝衔接的效果。
主页面对应的视频控件的父view
<FrameLayout
android:id="@+id/vw_live"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true"/>
用FrameLayout作为添加视频控件的ParentView,通过addview方法将新建的播放器控件添加到父控件内部
vw_live = new IjkVideoView(this);
video_frame = findViewById(R.id.vw_live);
video_frame.addView(vw_live);
主播放界面的启动模式
播放主界面的activity的启动模式不能为默认,因为我们要保证播放主界面在显示悬浮窗的时候退到后台,但是整个的应用不能退到后台,所以activity的启动模式改为singleInstance
android:launchMode="singleInstance"
退到后台我们通过moveTaskToBack(true)方法;
moveTaskToBack(true);
可以让播放界面退到后台而整个应用不会退回后台
权限请求
要使用悬浮窗需要申请权限
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
if (!Settings.canDrawOverlays(this)) {
Toast.makeText(this, "当前无权限,请授权", Toast.LENGTH_SHORT);
startActivityForResult(new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())), 2);
}
悬浮窗
@SuppressLint("ClickableViewAccessibility")
public void showFloatingWindowView(IjkVideoView view) {
// 悬浮窗显示视图
LayoutInflater layoutInflater = LayoutInflater.from(activity);
mShowView = layoutInflater.inflate(R.layout.video_floating_window_layout, null);;
// 获取系统窗口管理服务
mWindowManager = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);
// 悬浮窗口参数设置及返回
mFloatParams = getParams();
//floatingWindow内部控件实例
init(view);
// 设置窗口触摸移动事件
mShowView.setOnTouchListener(new FloatViewMoveListener());