如何获取启用了 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。
我想查找设备上安装的所有具有启用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。