Программно деактивировать администратора устройства в Android?

Можно ли программно деактивировать (стороннего) администратора устройства приложение?

Мне удалось получить все приложения с активированным Администратором устройств с помощью DevicePolicyManager и getActiveAdmins():

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(...), так как он не удалит компонент, который не является моим собственным приложением.

Я думал использовать Intent и startActivity(), чтобы открыть страницу деактивации администратора устройства того конкретного компонента, который я хочу деактивировать. Является ли это возможным?


person Paolo Rovelli    schedule 11.11.2013    source источник


Ответы (3)


Можно ли программно деактивировать (стороннее) приложение администратора устройства?

Нет. Программно активировать тоже нельзя.

Я думал использовать Intent и startActivity(), чтобы открыть страницу деактивации администратора устройства того конкретного компонента, который я хочу деактивировать.

В приложении «Настройки» нет точки входа для прямого перехода к экрану удаления администратора устройства, не говоря уже о задокументированном Intent действии для него. Таким образом вы можете добавить администраторов устройств, но не удалить их.

person CommonsWare    schedule 11.11.2013
comment
android. googlesource.com/platform/frameworks/base/+/master/core/ @Commonsware, можете ли вы проверить приведенную выше ссылку? У него есть один способ удалить администратора других приложений. Метод находится в скрытом режиме. Хотя я использую шаблон Reflection для использования этого метода, но он дает NoSuchMethodException. - person Himanshu Mori; 09.05.2017
comment
У него есть один способ удалить администратора других приложений - это не то, что я вижу. но это дает NoSuchMethodException - возможно, вы работаете на более старом устройстве, так как ваша ссылка ведет на ветку master. Я ожидаю, что вы получите SecurityException, если метод существует. - person CommonsWare; 09.05.2017

на самом деле можно перейти прямо к экрану администратора, но я не уверен, насколько это безопасно, так как сам API недоступен, а пути могут меняться в разных версиях Android и ромах.

вот что я тестировал:

это перейдет непосредственно к экрану активации/деактивации выбранного вами приложения:

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);
person android developer    schedule 07.01.2014
comment
Спасибо за ваш ответ. Как вы уже сказали, использование фиксированных путей не очень хорошая практика. Однако, как вы предложили, я могу использовать блоки try-catch для перехвата возможных исключений ActivityNotFoundException. - person Paolo Rovelli; 08.01.2014
comment
О.. Я только что обнаружил, что в некоторых случаях также может не существовать действие Settings.ACTION_SECURITY_SETTINGS. developer.android.com/reference/android/provider/ - person Paolo Rovelli; 08.01.2014
comment
@PaoloRovelli, теперь я добавил более безопасный способ сделать это. - person android developer; 08.01.2014
comment
@PaoloRovelli правда? странный. значит должен быть еще один запасной вариант, чтобы зайти в настройки устройства? - person android developer; 08.01.2014
comment
Не уверена. Может его нет только на старых устройствах. В любом случае вам нужно использовать блок try-catch (ActivityNotFoundException) также для Settings.ACTION_SECURITY_SETTINGS. - person Paolo Rovelli; 08.01.2014
comment
@PaoloRovelli хорошо, спасибо за предупреждение. угадайте, что у вас может быть много попыток для этого... - person android developer; 08.01.2014
comment
@PaoloRovelli, какова цель настроек устройства? - person android developer; 08.01.2014
comment
неважно. это Settings.ACTION_SETTINGS: developer.android.com/reference/android/provider / - person android developer; 08.01.2014

Это должно работать:

   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" />
person nithinreddy    schedule 21.01.2015
comment
Согласно документации Android, вы можете деактивировать только компонент вашего приложения, а не компоненты сторонних приложений. developer.android.com/reference /android/app/admin/ Удалить текущий компонент администрирования. Это может быть вызвано только приложением, которому принадлежит административный компонент; если вы попытаетесь удалить чужой компонент, будет выдано исключение безопасности. - person RDT2; 19.04.2016