android - 如何检查特定应用程序是否具有管理员权限,并转到其管理屏幕?

标签 android android-intent settings admin

背景

Android 应用可以使用管理策略获得一些特殊权限,例如打开锁定屏幕。

因此,在用户撤销其管理权限之前,无法卸载这些应用。

我希望有一个功能来检查给定的应用程序(给定应用程序的包名称)是否具有管理员权限,如果有,我将打开该应用程序的管理员设置页面,以允许用户撤销它的权利。

问题

事实证明,已经有一个函数可以做到这一点。

首先你得到一个 DevicePolicyManager 的实例:

DevicePolicyManager dpm=(DevicePolicyManager)context.getSystemService(Context.DEVICE_POLICY_SERVICE);

然后你应该调用isAdminActive , 并得到 true/false 的结果。

但是,这个函数的参数是ComponentName,这意味着它不仅需要包名,还需要应用程序特定类的路径。

另一种方法是查询所有 Activity 的管理应用程序,使用 getActiveAdmins .

稍后,我可以使用以下方式转到管理页面:

final Intent intent=new Intent();
intent.setComponent(new ComponentName("com.android.settings","com.android.settings.DeviceAdminSettings"));
startActivity(intent);

或者更具体地说,启用/禁用应用程序管理员权限:

final Intent intent=new Intent();
intent.setComponent(new ComponentName("com.android.settings","com.android.settings.DeviceAdminAdd"));
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,componentName);
activity.startActivity(intent);

然而,这两种方式似乎都有些 hacky,因为它们没有使用 android 的官方 API,这可能会随着 android 版本和 rom 的变化而变化。

问题

检查给定应用(程序包名称)是否具有管理员权限的最佳方法是什么?

进入管理页面的最佳方式是什么?有没有更安全的方式去那里?也许是我对安全屏幕 Intent 所做的回退机制(由于某种原因我无法在 API 中找到)?


答案

阅读这篇文章的答案后,我决定分享我的发现:

如果你希望安全,你可以告诉用户自己去管理界面,只引导他到安全界面:

intent=new Intent(Settings.ACTION_SECURITY_SETTINGS);
context.startActivity(intent);

但是,我认为下一种方式应该适用于所有设备:

Intent intent=new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
final PackageManager packageManager=context.getPackageManager();
final List<ResolveInfo> resolveInfos=packageManager.queryIntentActivities(intent,0);
if(resolveInfos!=null&&!resolveInfos.isEmpty())
  try
    {
    final ResolveInfo resolveInfo=resolveInfos.get(0);
    intent=new Intent();
    intent.setComponent(new ComponentName(resolveInfo.activityInfo.packageName,resolveInfo.activityInfo.name));
    intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,componentNameResult);
    context.startActivity(intent);
    return true;
    }
  catch(final Exception e)
    {}

如果失败,您可以随时使用我编写的任何方法,最后调用安全方法。

最佳答案

Android apps can gain some special rights using admin policies, like turning on/off the screen.

DevicePolicyManager 可以使用 lockNow() 锁定屏幕并通过 setMaximumTimeToLock() 设置锁定超时,如果这就是您的意思。

What's the best way to check if a given app (package name) has admin rights?

查看他们是否在 getActiveAdmins() 返回的名册中。该方法返回 nullListComponentName 对象,您可以在 上调用 getPackageName() ComponentName 将其与您的目标包进行比较。

What's the best way to go to the admin page ?

没有记录和支持的方法来访问“设置”应用程序的这一部分。最近的东西is ACTION_SECURITY_SETTINGS .

关于android - 如何检查特定应用程序是否具有管理员权限,并转到其管理屏幕?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20982604/

相关文章:

android - 如何访问 Android 下载管理器的百分比?

android - 强制 Android 应用程序使用特定 Intent ,而不是显示 Intent 菜单

android - 如何在android中以全屏模式显示电池图标和Wifi图标?

C# Properties.Settings 属性不设置任何值

java - 加载设置 - 最佳实践

android - 华为 Mate 9 的预发布报告问题

android - 更改 Samsung Galaxy Camera 上的默认 BOOT_COMPLETED Activity

android - 持续运行应用程序

android - 如何添加适用于移动和非移动友好 URLS 的 Android WebView 设置?

java - 属性“rippleColor”已被定义