悬浮窗相信都会用到,配合背景透明以及webview-js注入可以做很多事情。
1、判断权限
public static boolean checkFloatPermission(Context context) {
if (!hasPermission(context, "android.permission.SYSTEM_ALERT_WINDOW")) {
return false;
}
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
return true;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
try {
Class cls = Class.forName("android.content.Context");
Field declaredField = cls.getDeclaredField("APP_OPS_SERVICE");
declaredField.setAccessible(true);
Object obj = declaredField.get(cls);
if (!(obj instanceof String)) {
return false;
}
String str2 = (String) obj;
obj = cls.getMethod("getSystemService", String.class).invoke(context, str2);
cls = Class.forName("android.app.AppOpsManager");
Field declaredField2 = cls.getDeclaredField("MODE_ALLOWED");
declaredField2.setAccessible(true);
Method checkOp = cls.getMethod("checkOp", Integer.TYPE, Integer.TYPE, String.class);
int result = (Integer) checkOp.invoke(obj, 24, Binder.getCallingUid(), context.getPackageName());
return result == declaredField2.getInt(cls);
} catch (Exception e) {
return false;
}
} else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
AppOpsManager appOpsMgr = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
if (appOpsMgr == null)
return false;
int mode = appOpsMgr.checkOpNoThrow("android:system_alert_window", android.os.Process.myUid(), context
.getPackageName());
return Settings.canDrawOverlays(context) || mode == AppOpsManager.MODE_ALLOWED || mode == AppOpsManager.MODE_IGNORED;
} else {
return Settings.canDrawOverlays(context);
}
}
}
public static boolean hasPermission(Context context, String permission) {
if (context == null) {
return false;
}
try {
PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_PERMISSIONS);
if (info.requestedPermissions != null) {
for (String p : info.requestedPermissions) {
if (p.equals(permission)) {
return true;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
package com.add.cf.util;
import android.content.Context;
import android.view.WindowManager;
public class WindowManage {
private static WindowManager.LayoutParams wmParams;
private static WindowManager mWindowManager;
public static WindowManager getWindowManager(Context context) {
if (mWindowManager == null) {
mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
}
return mWindowManager;
}
/**
* @param context
* @return
*/
public static WindowManager.LayoutParams getWindowManagerParams() {
if (wmParams == null) {
wmParams = new WindowManager.LayoutParams();
}
return wmParams;
}
}
配置悬浮窗
if (wmParams == null) {
wmParams = WindowManage.getWindowManagerParams();
}
int layout_flag;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
layout_flag = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
} else {
layout_flag = WindowManager.LayoutParams.TYPE_PHONE;
}
initWebView();
wmParams.type = layout_flag;
wmParams.format = PixelFormat.RGBA_8888;
//背景透明
wmParams.alpha = 0.0f;
wmParams.screenOrientation = 1;
wmParams.flags =
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
//LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
// FLAG_FULLSCREEN |
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
// wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
wmParams.width = WindowManager.LayoutParams.MATCH_PARENT;
wmParams.height = WindowManager.LayoutParams.MATCH_PARENT;
windowManager.addView(llRoot, wmParams);
这样就ok了