相关疑难解决方法(0)

为什么在Android O方法中当用户授予绘制叠加层并返回我的应用程序的权限时,Settings.canDrawOverlays()会返回"false"?

我有父母的MDM应用程序来控制孩子的设备,它使用权限SYSTEM_ALERT_WINDOW在禁止的动作执行时在孩子的设备上显示警告.在安装期间的设备M +上,应用程序使用以下方法检查权限:

Settings.canDrawOverlays(getApplicationContext()) 
Run Code Online (Sandbox Code Playgroud)

如果此方法返回false应用程序打开系统对话框,用户可以在其中授予权限:

Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                    Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, REQUEST_CODE);
Run Code Online (Sandbox Code Playgroud)

Android O中,当用户成功授予权限并通过按返回按钮返回应用程序时,方法canDrawOverlays()仍会返回false,直到用户不关闭应用程序并再次打开它或在最近的应用程序对话框中选择它.我在Android Studio中使用Android O在最新版本的虚拟设备上进行了测试,因为我没有真正的设备.

我做了一些研究,另外用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);
Run Code Online (Sandbox Code Playgroud)

所以:

  • 当应用程序没有此权限时,模式为"2"(MODE_ERRORED)(canDrawOverlays()返回false)当用户
  • 授予权限并返回给应用程序,模式为"1"(MODE_IGNORED)(canDrawOverlays()返回false)
  • 如果您现在重新打开应用程序,模式为"0"(MODE_ALLOWED)(canDrawOverlays()返回true)

拜托,有人能向我解释这种行为吗?我可以依赖mode == 1操作"android:system_alert_window"并假设用户已授予权限吗?

permissions android

24
推荐指数
4
解决办法
7884
查看次数

标签 统计

android ×1

permissions ×1