背景
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()
返回的名册中。该方法返回 null
或 List
的 ComponentName
对象,您可以在 上调用
将其与您的目标包进行比较。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/