如何获取启用了 SYSTEM_ALERT_WINDOW 权限的已安装应用程序?

How to get installed apps which have SYSTEM_ALERT_WINDOW permission enabled?

我想查找设备上安装的所有具有启用SYSTEM_ALERT_WINDOW权限的应用程序。

首先,我找到了所有具有 SYSTEM_ALERT_WINDOW 权限的应用程序,并验证了列表是否正确:在我的 phone 上,我转到设置 -> 特殊应用程序访问权限 -> 在其他应用程序上显示. 然后我在 "Display over other apps" 菜单下禁用了 所有 应用程序的 "Allow display over other apps" 选项。 接下来,我再次启动我的应用程序,我发现具有 SYSTEM_ALERT_WINDOW 权限的应用程序列表仍然相同。

我决定检查是否获得许可。我使用了以下内容:

PackageManager.checkPermission(SYSTEM_ALERT_WINDOW, package name) == PackageManager.PERMISSION_GRANTED

但是此检查为所有具有 SYSTEM_ALERT_WINDOW 权限的包返回了 true!此外,此检查 returns true 即使包根本没有 SYSTEM_ALERT_WINDOW 权限。

我的代码如下:

public ArrayList<String> getAppsWhichHaveOverlaySettingEnabled() {
    ArrayList<String> apps = new ArrayList<>();

    PackageManager pm = getPackageManager();
    List<PackageInfo> installedPackages = pm.getInstalledPackages(PackageManager.GET_PERMISSIONS | PackageManager.GET_PROVIDERS);

    for (PackageInfo packageInfo : installedPackages) {
        String[] requestedPermissions = packageInfo.requestedPermissions;

        if (requestedPermissions != null) {
            for (String requestedPermission : requestedPermissions) {
                if (requestedPermission.equals(SYSTEM_ALERT_WINDOW)) {
                    if (pm.checkPermission(SYSTEM_ALERT_WINDOW, packageInfo.packageName) == PackageManager.PERMISSION_GRANTED) {
                        String name = pm.getApplicationLabel(packageInfo.applicationInfo).toString();
                        apps.add(name + " (" + packageInfo.packageName + ")");
                    }
                }
            }
        }
    }
    return apps;
}

我做错了什么?或者根本不可能得到这样的信息?

我在几个 Android 设备上检查了我的方法和另一个使用类似方法的应用程序,看起来无法获得 当前启用的应用程序列表 SYSTEM_ALERT_WINDOW许可。

如果 SYSTEM_ALERT_WINDOW 权限被授予应用程序一次,那么检查方法将 return true 无论当前是否启用此权限。

不过,检查此类权限的更准确方法是:

public ArrayList<String> getAppsWhichHaveOverlaySettingEnabled() {
    ArrayList<String> apps = new ArrayList<>();

    PackageManager pm = getPackageManager();
    List<PackageInfo> installedPackages = pm.getInstalledPackages(PackageManager.GET_PERMISSIONS);

    for (PackageInfo packageInfo : installedPackages) {
        String[] requestedPermissions = packageInfo.requestedPermissions;

        if (requestedPermissions != null) {
            for (int i = 0; i < requestedPermissions.length; i++) {
                String requestedPermission = requestedPermissions[i];
                if (requestedPermission.equals(SYSTEM_ALERT_WINDOW)) {
                    if ((packageInfo.requestedPermissionsFlags[i] & REQUESTED_PERMISSION_GRANTED) == REQUESTED_PERMISSION_GRANTED) {
                        String name = pm.getApplicationLabel(packageInfo.applicationInfo).toString();
                        apps.add(name + " (" + packageInfo.packageName + ")");
                    }
                }
            }
        }
    }
    return apps;
}

阅读更多here