我使用播放器的时候,有时候需要使用其它的应用,这时候又想播放器继续播放视频,又不想应用被杀掉,这个时候会悬浮窗功能。
使用过程中会遇到不能播播放的问题,建议按照以下的方式排查
1.手机本地悬浮窗权限开启
检查手机设置里悬浮窗权限有没有开启,各个手机开启悬浮窗口权限都不同,可以自己网上查下
2.检查代码的中的悬浮窗权限
2.1如果是在Android4.x的情况,只用在AndroidManifest.xml中添加权限:
<!-- 显示系统窗口权限 -->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<!-- 在 屏幕最顶部显示addview-->
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
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