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

时间:2014-01-07 21:46:57

标签: android android-intent settings admin

背景

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

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

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

问题

事实证明,已有一个功能可以实现它。

首先,您将获得DevicePolicyManager的实例:

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

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

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

另一种方法是使用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版本和roms。

问题

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

进入管理页面的最佳方式是什么?有更安全的方式去那里吗?也许是从我所做的安全屏幕意图的回退机制(由于某些原因我在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)
    {}

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

1 个答案:

答案 0 :(得分:3)

  

Android应用可以使用管理员政策获得一些特殊权利,例如打开/关闭屏幕。

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

  

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

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

  

进入管理页面的最佳方式是什么?

没有记录和支持的方式来访问“设置”应用的这一部分。最接近的事情is ACTION_SECURITY_SETTINGS