背景
android应用程序可以使用管理策略获得一些特殊权限,比如打开锁屏。
因此,在用户取消其管理权限之前,无法卸载这些应用程序。
我希望有一个功能,可以检查给定的应用程序(给定的应用程序包名称)是否具有管理权限,如果是,我将打开此应用程序的“管理设置”页,以允许用户撤消其权限。
问题
事实证明,已经有一个函数可以做到这一点。
首先,您将获得设备策略管理器的一个实例:

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

然后您应该调用isAdminActive,并得到true/false的结果。
但是,这个函数的参数是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);

不过,这两种方式似乎都有点老套,因为它们不使用Android的官方API,这可能会在Android版本和ROM上发生变化。
这个问题
检查给定应用程序(包名称)是否具有管理权限的最佳方法是什么?
进入管理页面的最佳方式是什么?有没有更安全的方法去那里?也许是一种从我对安全屏幕意图所做的操作中退回来的机制(出于某种原因,我在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应用程序可以使用管理策略获得一些特殊权限,比如打开/关闭屏幕。
aDevicePolicyManager可以用lockNow()锁定屏幕,并通过setMaximumTimeToLock()设置锁定超时(如果这是您的意思)。
检查给定应用程序(包名称)是否具有管理权限的最佳方法是什么?
看看他们是否在getActiveAdmins()返回的名册中。该方法返回null对象的ListComponentName,您可以在getPackageName()上调用ComponentName以将其与目标包进行比较。
进入管理页面的最佳方式是什么?
没有文档和支持的方法可以访问设置应用程序的此部分。最接近的是is ACTION_SECURITY_SETTINGS

09-11 20:18
查看更多