如果未禁用设备管理应用程序,则无法将其卸载。用户可以从设置中禁用“设备管理员”。当公司将android设备提供给员工时,公司希望能够控制设备、他们的状态和策略,但用户可以很容易地摆脱这种控制。有人知道如何防止用户禁用设备管理员吗?谢谢。
发布于 2011-06-24 00:50:18
没有办法阻止用户禁用设备管理员,至少是使用已发布的API。如果某些策略没有到位,您可以做的最好的事情就是禁止程序运行。
一些制造商(例如,三星)已经扩展了基础API以允许额外的功能,但这些不是标准Android平台的一部分。
发布于 2013-02-03 22:54:24
在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;
}
}发布于 2020-04-25 02:17:56
有一种解决方法可以防止禁用设备管理员。当用户启动停用并且我们收到ACTION_DEVICE_ADMIN_DISABLE_REQUESTED回调时,我们重新启动设置activity intent。
OS允许显示要求用户确认的消息。根据安卓操作系统的规定,在大约5秒的时间内,任何应用程序都不能在此确认对话框上方启动。所以基本上,我们试图打开的设置活动只会在5秒后启动。
要在不允许用户确认停用的情况下通过这5秒,设备管理员会在后台线程中反复锁定电话。5秒后,当用户解锁设备时,“设置”活动将重新启动。
以下Device Admin Broadcast Receiver Class代码说明了上述方法。
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 Store中删除。
以下存储库中提供了包含所需清单声明和资源xml文件的完整示例代码
https://github.com/abinpaul1/Android-Snippets/tree/master/PermanentDeviceAdministrator
https://stackoverflow.com/questions/6457690
复制相似问题