我正在开发一款家长可用于控制孩子设备的MDM应用程序,它使用权限SYSTEM_ALERT_WINDOW
在设备上显示警告,如果执行了禁止操作。
在SDK 23+(Android 6.0)的设备上,在安装过程中,该应用程序使用以下方法检查权限:
Settings.canDrawOverlays(getApplicationContext())
如果此方法返回false
,应用程序将打开系统对话框,用户可以在其中授予权限:
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, REQUEST_CODE);
但是在使用SDK 26(Android 8.0)的设备上,当用户成功授予权限并通过按下返回按钮返回到应用程序时,方法
canDrawOverlays()
仍然返回false
,直到用户关闭应用程序并重新启动它或仅在最近的应用程序对话框中选择它。我在Android Studio中使用最新版本的虚拟设备测试了它,因为我没有真实设备。我进行了一些研究,并使用AppOpsManager检查了权限。
AppOpsManager appOpsMgr = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
int mode = appOpsMgr.checkOpNoThrow("android:system_alert_window", android.os.Process.myUid(), getPackageName());
Log.d(TAG, "android:system_alert_window: mode=" + mode);
因此:
- 当应用程序没有此权限时,模式为“2”(MODE_ERRORED)(
canDrawOverlays()
返回false
),当用户 - 授予权限并返回应用程序时,模式为“1”(MODE_IGNORED)(
canDrawOverlays()
返回false
) - 如果您现在重新启动应用程序,则模式为“0”(MODE_ALLOWED)(
canDrawOverlays()
返回true
)
请问,有人能解释一下这种行为吗?我能依赖于操作"android:system_alert_window"
的mode == 1
并假设用户已经授予权限吗?
Settings.canDrawOverlays
,因为据说 Google 在十月份修复了这个 bug。由于 Android 8.1 的发布时间比那更晚,所以它应该包含这个修复。如果没有,请将 >= 改为 >,然后您就可以继续使用了。 - Ch4t4r