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)
{}
如果失败了,你可以随时使用我编写的任何方法,最后调用安全方法。
答案 0 :(得分:3)
Android应用可以使用管理员政策获得一些特殊权利,例如打开/关闭屏幕。
DevicePolicyManager
可以使用lockNow()
锁定屏幕,并通过setMaximumTimeToLock()
设置锁定超时,如果这是你的意思。
检查给定应用(包名称)是否具有管理员权限的最佳方法是什么?
查看他们是否在getActiveAdmins()
返回的名单中。该方法会返回null
个List
个ComponentName
个对象,您可以在getPackageName()
上调用ComponentName
将其与目标包进行比较。
进入管理页面的最佳方式是什么?
没有记录和支持的方式来访问“设置”应用的这一部分。最接近的事情is ACTION_SECURITY_SETTINGS
。