andriod使用超級播放器懸浮窗播不能正常使用
- 2019 年 10 月 4 日
- 筆記
我使用播放器的時候,有時候需要使用其它的應用,這時候又想播放器繼續播放影片,又不想應用被殺掉,這個時候會懸浮窗功能。
使用過程中會遇到不能播播放的問題,建議按照以下的方式排查
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
}
原理:懸浮窗本質手機原生的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