2013-11-11 2 views
2

Возможно ли программное деактивация приложения (стороннего) Device Administrator?Программно деактивировать Device Admininstrator в 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() для того, чтобы открыть страницу деактивации администратора устройства этого конкретного компонента Я хочу, чтобы отключить. Является ли это возможным?

ответ

1

Возможно ли программное деактивация приложения-администратора устройства (стороннего производителя)?

№. Невозможно также программно активировать его.

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

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

+0

Я боялся этого ... спасибо в любом случае за ответ! –

+0

https: //android.googlesource.com/platform/frameworks/base/+/master/core/java/android/app/admin/DevicePolicyManager.java # 6556 @Commonsware можно проверить ссылку выше? У него есть один способ удалить Admin из других приложений. Метод находится в скрытом режиме. Хотя я использую шаблон Reflection для использования этого метода, но он дает NoSuchMethodException. –

+0

«У него есть один способ удалить Admin из других приложений» - это не то, что я вижу. «но это дает NoSuchMethodException» - вы можете работать на более старом устройстве, так как ваша ссылка связана с ветвью 'master'. Я ожидаю, что вы получите «SecurityException», если этот метод существует. – CommonsWare

3

Фактически, можно перейти непосредственно к экрану администратора, но я не уверен, насколько это безопасно, поскольку сам 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-фиксатор для каждого из методов, и если все не удалось, используйте:

final Intent intent=new Intent(Settings.ACTION_SECURITY_SETTINGS); 
activity.startActivity(intent); 
+0

Спасибо за ваш ответ. Как вы уже сказали, использование фиксированных путей на самом деле не является хорошей практикой. Однако, как вы предположили, я могу использовать блоки try-catch, чтобы поймать возможные исключения ActivityNotFoundException. –

+0

Ох .. Я только что обнаружил, что в некоторых случаях также может быть установлено действие Settings.ACTION_SECURITY_SETTINGS. http://developer.android.com/reference/android/provider/Settings.html#ACTION_SECURITY_SETTINGS –

+0

@PaoloRovelli Теперь я добавил немного более безопасный способ сделать это. –

1

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

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" /> 
+0

В соответствии с документацией на Android вы можете дезактивировать компонент, который находится из вашего приложения, а не компоненты от стороннего производителя Приложения. http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#removeActiveAdmin(android.content.ComponentName) Удалить текущий административный компонент. Это может быть вызвано только приложением, которое владеет компонентом администрирования; если вы попытаетесь удалить чужой компонент, будет выведено исключение безопасности. – RDT2

Смежные вопросы