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

and*_*per 5 settings android admin android-intent

背景

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

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

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

问题

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

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

DevicePolicyManager dpm=(DevicePolicyManager)context.getSystemService(Context.DEVICE_POLICY_SERVICE);
Run Code Online (Sandbox Code Playgroud)

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

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

另一种方法是使用getActiveAdmins查询所有活动的管理应用程序。

稍后,您可以使用以下命令进入管理页面:

final Intent intent=new Intent();
intent.setComponent(new ComponentName("com.android.settings","com.android.settings.DeviceAdminSettings"));
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

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

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);
Run Code Online (Sandbox Code Playgroud)

然而,这两种方式似乎有点hacky,因为它们不使用android的官方API,这可能会改变android版本和roms。

问题

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

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


答案

阅读这篇文章的答案后,我决定分享调查结果:

如果你想安全,你可以告诉用户自己去管理屏幕,只引导他到安全屏幕:

intent=new Intent(Settings.ACTION_SECURITY_SETTINGS);
context.startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

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

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)
    {}
Run Code Online (Sandbox Code Playgroud)

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

Com*_*are 5

Android 应用程序可以使用管理策略获得一些特殊权限,例如打开/关闭屏幕。

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

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

看看他们是否在 返回的名单中getActiveAdmins()。该方法会返回null或List的ComponentName对象,你可以调用getPackageName()一个ComponentName比较它的目标包。

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

没有记录和支持的方式来访问设置应用程序的这一部分。最接近的是ACTION_SECURITY_SETTINGS。