问题描述
我的android应用需要显示在其他应用权限之上,即屏幕覆盖权限。
- Settings.ACTION_MANAGE_OVERLAY_PERMISSION
- SYstem_ALERT_WINDOW
在普通的Android OS设备中,我可以使用此代码轻松地授予权限。
if (!Settings.canDrawOverlays(this) && !Constant.IsOverlayPermissionGiven) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,Uri.parse("package:" + getPackageName()));
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
startActivityForResult(intent,REQUEST_CODE);
handler.postDelayed(checkSettingOn,200);
return false;
} else {
return true;
}
但是在Android Go Edition设备权限屏幕中,显示“此功能不可用”消息,并警告“此功能已关闭,因为它会降低手机速度”
如何获取有关该功能的信息是否可用(以编程方式)? 如何绕过权限屏幕,哪些设备没有屏幕覆盖功能?
解决方法
如果您阅读Android 11源代码,则可以看到它仅使用ActivityManager.isLowRamDevice()
来检查SYSTEM_ALERT_WINDOW
功能是否可用
packages \ apps \ Settings \ src \ com \ android \ settings \ Utils.java
/**
* Returns true if SYSTEM_ALERT_WINDOW permission is available.
* Starting from Q,SYSTEM_ALERT_WINDOW is disabled on low ram phones.
*/
public static boolean isSystemAlertWindowEnabled(Context context) {
// SYSTEM_ALERT_WINDOW is disabled on on low ram devices starting from Q
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
return !(am.isLowRamDevice() && (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q));
}