在Service中使用系统dialog弹框,但是无法覆盖全部,底部菜单依然可以被点击,在某些场景下是不符合需求的

getDialog().getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR);

显然是 dialog 的层级不够高导致的,很多时候会直接修改层级,但是如果修改的层级涉及到系统权限,运行就会直接报错

getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR)

WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@e94bee9 — permission denied for window type 2010

这种情况一般有两种方案

1、manifest 中添加android:sharedUserId=”android.uid.system”

直接将整个项目变成系统级应用,这样就能随意使用权限不被限制

2、manifest 中添加INTERNAL_SYSTEM_WINDOWpermission

<uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW" />

在次运行后弹框已经是系统级,并且下方菜单已经无法被点击,大部分使用第二种方案,系统及应用基本一开始就已经定性,不会也不能随意更改