网上的文章千奇百怪,有的已经失效了,只能自己写一份了
<uses-permission-sdk-23 android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission-sdk-23 android:name="android.permission.SYSTEM_OVERLAY_WINDOW"/>
// 检查有无悬浮窗权限
public boolean checkPermission(Activity activity) {
final int version = Build.VERSION.SDK_INT;
if (version >= 19) {
return checkOp(activity, 24);
}
return true;
}
@TargetApi(Build.VERSION_CODES.KITKAT)
private static boolean checkOp(Context context, int op) {
final int version = Build.VERSION.SDK_INT;
if (version >= 19) {
AppOpsManager manager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
try {
Class clazz = AppOpsManager.class;
Method method = clazz.getDeclaredMethod("checkOp", int.class, int.class, String.class);
return AppOpsManager.MODE_ALLOWED == (int) method.invoke(manager, op, Binder.getCallingUid(), context.getPackageName());
} catch (Exception e) {
Log.e(TAG, Log.getStackTraceString(e));
}
} else {
Log.e(TAG, "Below API 19 cannot invoke!");
}
return false;
}
//打开权限页面
public void applyPermission(Activity activity) {
if(activity ==null|| activity.isFinishing()){
return;
}
int sdkInt = Build.VERSION.SDK_INT;
if (sdkInt >= Build.VERSION_CODES.M) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + activity.getPackageName()));
activity.startActivityForResult(intent, IFloatWindowPermission.REQUEST_CODE);
} else {
//无需处理了
}
}