前序
按项目交互要求,需要把视频通话界面,缩小至悬浮窗显示,基本实现思路这个比较好想,就是启用一个service,在里面用WindowManager去addView来展示悬浮窗画面。基本效果是有了,但填坑之路才刚开始。。
坑一:WindowManager.LayoutParam.type的选取
选择TYPE_TOAST,如果期间有toast弹出,在android7.1.1会崩溃
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
wmParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
} else {
wmParams.type = WindowManager.LayoutParams.TYPE_PHONE;
}
注意:在android9.0以上就算按照上面方法设置,如果不提前授予悬浮窗权限,也会崩溃
坑二:SingleInstance和onActivityResult搭配问题
当处于悬浮窗口时,此时通话界面会推到后台,要调用moveTaskToBack(true),如果通话的Activity的启动模式不设置为SingleInstance,就会导致整个应用退到后台,不是我们想要的效果,为了只把VIdeoCallActivity(通话界面)退到后台,那么此界面就必须得在单独的一个栈里,所以要设置为SingleInstance。
用一个启动模式为SingleInstance的Activity去打开一个界面,在onActivityResult是拿不到结果的,所以只能用startActivity,然后再VIdeoCallActivity判断悬浮是否已打开,如果打开,则悬浮显示。
坑三:跳转开启悬浮窗设置界面的机型适配问题
适配了市面上大部分厂商机型,小米、华为、魅族、oppo、vivo、360、锤子
跳转开启权限工具类
悬浮窗服务FloatVideoWindowService
FloatVideoWindowService extends Service {
private static final String TAG = "FloatVideoWindowService";
private WindowManager mWindowManager;
private WindowManag