如果不是,则无法卸载设备管理应用程序 禁用。用户可以从设置中禁用“设备管理员”。 当公司向其员工提供Android设备时,公司希望如此 可以控制设备,状态和策略,但用户可以 容易摆脱那种控制。有人知道这是怎么可能的 防止用户禁用设备管理员? 感谢。
答案 0 :(得分:3)
无法阻止用户禁用设备管理员,至少使用已发布的API。如果没有某些策略,您可以做的最好是禁止程序运行。
一些制造商(例如三星)扩展了基础API以允许其他功能,但这些不属于标准Android平台。
答案 1 :(得分:2)
在DeviceAdminReceiver.java中,您可以执行类似onDisableRequested的操作:
public CharSequence onDisableRequested(Context context, Intent intent) {
SharedPreferences settings = context.getSharedPreferences(MainActivity.class.getName(), 0);
String DEVICE_ADMIN_CAN_DEACTIVATE = settings.getString("DEVICE_ADMIN_CAN_DEACTIVATE", null);
if(DEVICE_ADMIN_CAN_DEACTIVATE.equals("ON")){
Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(startMain);
return "OOPS!";
}else{
String msg_char_onDisable = context.getResources().getString(R.string.msg_char_onDisable);
return msg_char_onDisable;
}
}
答案 2 :(得分:1)
有一个解决方法,可以防止禁用设备管理员。
当用户启动停用功能并且我们收到ACTION_DEVICE_ADMIN_DISABLE_REQUESTED回调时,我们将重新启动设置活动意图。
OS允许显示一条消息,要求用户确认。根据Android OS规则,在大约5秒钟内,不允许在此确认对话框顶部启动任何应用程序。因此,基本上,我们尝试打开的设置活动只会在5秒钟后启动。
要在不允许用户确认停用的情况下经过这5秒钟,设备管理员会在后台线程中反复将电话锁定。用户解锁设备5秒钟后,“设置”活动将重新开始。
下面的“设备管理广播接收器类”代码说明了上述方法。
DevAdminReceiver.java
public class DevAdminReceiver extends DeviceAdminReceiver {
DevicePolicyManager dpm;
long current_time;
Timer myThread;
@Override
public void onEnabled(@NonNull Context context, @NonNull Intent intent) {
super.onEnabled(context, intent);
Log.d("Root", "Device Owner Enabled");
}
@Nullable
@Override
public CharSequence onDisableRequested(@NonNull Context context, @NonNull Intent intent) {
Log.d("Device Admin","Disable Requested");
Intent startMain = new Intent(android.provider.Settings.ACTION_SETTINGS);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(startMain);
dpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
myThread = new Timer();
current_time = System.currentTimeMillis();
myThread.schedule(lock_task,0,1000);
return "Warning";
}
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (ACTION_DEVICE_ADMIN_DISABLE_REQUESTED.equals(action)) {
CharSequence res = onDisableRequested(context, intent);
if (res != null) {
dpm.lockNow();
Bundle extras = getResultExtras(true);
extras.putCharSequence(EXTRA_DISABLE_WARNING, res);
}
}else if (ACTION_DEVICE_ADMIN_DISABLED.equals(action)) {
Log.d("Device Admin","Disabled");
}
}
// Repeatedly lock the phone every second for 5 seconds
TimerTask lock_task = new TimerTask() {
@Override
public void run() {
long diff = System.currentTimeMillis() - current_time;
if (diff<5000) {
Log.d("Timer","1 second");
dpm.lockNow();
}
else{
myThread.cancel();
}
}
};
}
确保在资源文件中为设备管理员设置了force lock
策略。
这纯粹是一种解决方法,并不是开发人员的预期解决方案。暴露了设备管理权限的应用通常会从Google Play商店中删除。
以下回购中包含具有所需清单声明和资源xml文件的完整示例代码
https://github.com/abinpaul1/Android-Snippets/tree/master/PermanentDeviceAdministrator