悬浮窗权限:
悬浮窗权限是Android系统中非常高级的权限,可以实现如下功能
1、app外弹框
2、app外开启其他权限引导
3、app外护眼模式开发
4、配合ACC权限实现系统设置
5、app外视频悬浮等
一、悬浮窗兼容方案
1、如果有权限,使用type_overlay或者type_phone
2,如果没有权限使用type_toast方案
二、代码实现
权限注册
悬浮窗管理
public class OverlayWindowManager {
private static final String TAG = "OverlayWindowManager";
private static boolean DEBUG = BuildConfig.DEBUG;
private static Object getLock() {
WindowManagerGlobal managerGlobal;
managerGlobal = WindowManagerGlobal.getInstance();
try {
return new Hack(WindowManagerGlobal.class, "mLock").getField(managerGlobal);
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 当前是否可显示Toast
* @return
*/
public static boolean canShowToast() {
if (Build.VERSION.SDK_INT < 25) {
return true;
}
WindowManagerGlobal managerGlobal = WindowManagerGlobal.getInstance();
try {
synchronized (getLock()) {
ArrayList mParams = new Hack>(WindowManagerGlobal.class, "mParams").getField(managerGlobal);
if (null != mParams) {
int size = mParams.size();
for (int i = size - 1; i >= 0 && i < size; i--) {
if (i < mParams.size()) {
WindowManager.LayoutParams p = mParams.get(i);
if (null == p) {
continue;
}
if (p.type == WindowManager.LayoutParams.TYPE_TOAST) {
return false;
}
}
}
}
}
}
catch (Exception e) {
if (DEBUG) {
e.printStackTrace();
L(e.getMessage());
}
else {
throwException(e);
}
}
return true;
}
/**
* 暂不提供Remove方法 因为该方法remove后 功能程序调用remove
* 后 findViewLocked 会抛出 IllegalArgumentException异常
*/
private static void forceRemoveAll() {
// WindowManagerGlobal managerGlobal = WindowManagerGlobal.getInstance();
// try {
// synchronized (getLock()) {
// ArrayList mParams = new Hack>(WindowManagerGlobal.class, "mParams").getField(managerGlobal);
// ArrayList views = new Hack>(WindowManagerGlobal.class, "mViews").getField(managerGlobal);
// if (null != mParams && null != views) {
// int size = mParams.size();
// for (int i = size - 1; i >= 0 && i < size; i--) {
// if (i < mParams.size()) {
// WindowManager.LayoutParams p = mParams.get(i);
// if (null == p) {
// continue;
// }
// if (p.type == WindowManager.LayoutParams.TYPE_TOAST) {
// int index = mParams.indexOf(p);
// if (index < views.size() && index >= 0) {
/