3

是否可以以编程方式停用(第三方)设备管理员应用程序?

我能够使用DevicePolicyManagergetActiveAdmins()激活设备管理员来检索所有应用程序:

final DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
final List<ComponentName> adminList = dpm.getActiveAdmins();

for ( ComponentName app : adminList ) {
    Log.d(TAG, "App: ", app.getPackageName());
}

但是,为了停用它们,我不能使用removeActiveAdmin(...),因为它不会删除不是我自己的应用程序的组件。

我正在考虑使用IntentstartActivity()来打开我要停用的特定组件的设备管理员停用页面。是否可以?

4

3 回答 3

4

实际上,可以直接进入管理屏幕,但我不确定它有多安全,因为 API 本身不可用,并且路径可能会随着不同的 android 版本和 rom 而变化。

这是我测试过的:

这将直接进入您选择的应用程序的激活/停用屏幕:

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);

这将进入管理应用程序列表:

final Intent intent=new Intent();
intent.setComponent(new ComponentName("com.android.settings","com.android.settings.DeviceAdminSettings"));
activity.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)
    {}

您可以为每个方法添加 try-catch,如果全部失败,请使用:

final Intent intent=new Intent(Settings.ACTION_SECURITY_SETTINGS);
activity.startActivity(intent);
于 2014-01-07T21:39:44.313 回答
2

这应该有效:

   ComponentName devAdminReceiver = new ComponentName(context, deviceAdminReceiver.class);
   DevicePolicyManager dpm = (DevicePolicyManager)context.getSystemService(Context.DEVICE_POLICY_SERVICE);
   dpm.removeActiveAdmin(devAdminReceiver);

您需要在活动意图过滤器的清单中添加它:

<action android:name="android.app.action.DEVICE_ADMIN_DISABLED" />
于 2015-01-21T11:36:14.320 回答
1

是否可以以编程方式停用(第三方)设备管理员应用程序?

不,也不可能以编程方式激活一个。

我正在考虑使用 Intent 和 startActivity() 来打开我要停用的特定组件的设备管理员停用页面。

设置应用程序中没有直接进入删除设备管理屏幕的入口点,更不用说记录在案的Intent操作了。您可以通过这种方式添加设备管理员,但不能将其删除。

于 2013-11-11T14:09:04.917 回答