在Android中,当应用需要在其他应用或系统界面上方绘制悬浮窗或全局视图时,需要获得canDrawOverlays权限。然而,某些设备和Android版本可能会出现canDrawOverlays权限检查失效的问题,导致无法正确获取此权限。
为解决此问题,我们可以使用反射来访问canDrawOverlays权限标志位。下面是示例代码:
public static boolean checkCanDrawOverlays(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
AppOpsManager appOpsMgr = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
int mode = appOpsMgr.checkOpNoThrow(AppOpsManager.OPSTR_SYSTEM_ALERT_WINDOW, android.os.Process.myUid(), context.getPackageName());
return mode == AppOpsManager.MODE_ALLOWED;
} else {
return Settings.canDrawOverlays(context);
}
}
在使用canDrawOverlays权限时,需要在AndroidManifest.xml中添加以下代码:
在应用运行时,可以使用以下代码请求此权限:
if (checkCanDrawOverlays(this)) {
// 视图绘制
} else {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, PERMISSION_REQUEST_CODE);
}
其中,PERMISSION_REQUEST_CODE是自定义请求码。
通过以上方法,我们可以正确获取canDrawOverlays权限。