我使用播放器的时候,有时候需要使用其它的应用,这时候又想播放器继续播放视频,又不想应用被杀掉,这个时候会悬浮窗功能。

使用过程中会遇到不能播播放的问题,建议按照以下的方式排查

1.手机本地悬浮窗权限开启

检查手机设置里悬浮窗权限有没有开启,各个手机开启悬浮窗口权限都不同,可以自己网上查下

2.检查代码的中的悬浮窗权限

2.1如果是在Android4.x的情况,只用在AndroidManifest.xml中添加权限:

2.2andriod6.0需要申请悬浮窗权限 api>23 demo中对应悬浮窗的权限说明

不同的手机对应不同的api 会出现不同的悬浮窗问题,这是由于andriod系统导致的,看下你手机对应下图中的api等级

2.3 andriod8.0以上手机报错

android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootlmpl$W@40ec8528 -- permission denied for this window

Android O 系统,针对 Android 8.0 或更高平台版本进行编译,或将 targetSdkVersion 设为 Android 8.0 或更高版本的应用开发是,只要区别设置即可

if (Build.VERSION.SDK_INT>=26) {//8.0新特性

mWindowParams.type= WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;

}else{

mWindowParams.type= WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;

}

3.是否启用了悬浮窗格式

你使用的超级播放器中的SuperPlayerGlobalConfig中是否启用了悬浮窗格式

4.关闭悬浮窗

使用demo在你的机型能否支持,如果demo也不能在你的手机使用悬浮窗播放,由于andriod系统不支持悬浮功能

,这时候想关闭悬浮窗能力怎么办?办法如下

SuperPlayerView类 第792行的方法最前面增加

public void onRequestPlayMode(int requestPlayMode) {

// 屏蔽悬浮窗模式代码

if (requestPlayMode == SuperPlayerConst.PLAYMODE_FLOAT) {

Context viewContext = SuperPlayerView.this.getContext();

if (viewContext instanceof Activity) {

((Activity) viewContext).finish();

return;

}

}

//......

}

SuperPlayerActivity 这个类第726行 showFloatWindow 改为如下实现

private void showFloatWindow() {

finish(); // 结束当前activity

}

5.原理引入

悬浮窗本质手机原生的WindowManager来实现的,悬浮窗需要在别的应用之上显示窗口控件,需要某些权限才可以,API Level>=23 需要在AndriodManefest.xml文件中声明权限SYSTEM_ALERT_WINDOW才能在其他应用上绘制控件。除了在其他应用上设置悬浮窗还需要对本应用进行设置悬浮窗权限,该权限在应用中手动设置如图中的new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION)

注意的是andriod8.0之前,悬浮窗口设置可以为TYPE_PHONE,这种类型是用于用户交互操作的非应用窗口,

andriod8.0对系统和api行为做了修改,要实现在其他应用和窗口上方显示提醒窗口,必须为TYPE_APPLICATION_OVERLAY

文章来源于腾讯云开发者社区,点击查看原文