支持原著:http://www.cnblogs.com/KennyXia/p/4332642.htmlhtml
針對目前市面上存在大量的MIUI、EMUI的手機,做爲開發人員,有時須要查看應用的懸浮窗是否開啓,可是沒有一個好的方法獲取這個值,我和公司同事想到這個方法:app
/** * 判斷懸浮窗權限 * * @param context 上下文 */ public static boolean isFloatWindowOpAllowed(Context context) { final int version = Build.VERSION.SDK_INT; if (version >= 19) { return checkOp(context, 24);//24表示懸浮窗權限在AppOpsManager中 } else { //0x8000000表示1000000000000000000000000000若是&第28位所得值爲1則該位置被置爲1,懸浮窗打開 return (context.getApplicationInfo().flags & 0x8000000) == 1<<27; } } protected static boolean checkOp(Context context, int op) { final int version = Build.VERSION.SDK_INT; if (version >= 19) { AppOpsManager manager = (AppOpsManager) context.getSystemService("appops"); try { Object object = invokeMethod(manager, "checkOp", op, Binder.getCallingUid(), getPackageName(context)); return AppOpsManager.MODE_ALLOWED == (Integer) object; } catch (Exception e) { LogTool.e("CheckMIUI", e.toString()); } } else { LogTool.e("CheckMIUI", "Below API 19 cannot invoke!"); } return false; } public static String getPackageName(Context context) throws PackageManager.NameNotFoundException { PackageInfo pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); return pInfo.packageName; } public static Object invokeMethod(AppOpsManager manager, String method, int op, int uid, String packageName){ Class c = manager.getClass(); try { Class[] classes = new Class[] {int.class, int.class, String.class}; Object[] x2 = {op, uid, packageName}; Method m = c.getDeclaredMethod(method, classes); return m.invoke(manager, x2); } catch (Exception e) { e.printStackTrace(); } return -1; }