禁用设备管理员
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了禁用设备管理员相关的知识,希望对你有一定的参考价值。
如果未卸载,则无法卸载设备管理应用禁用的。用户可以从设置中禁用“设备管理员”。当公司向员工提供android设备时,公司希望可以控制设备,其状态和策略,但是用户可以轻松摆脱这种控制。有人知道这怎么可能吗防止用户禁用设备管理员?谢谢。
[至少使用发布的API,无法阻止用户禁用设备管理员。您能做的最好的就是如果某些策略不到位,则不允许程序运行。
某些制造商(例如,三星)已经扩展了基本API以允许其他功能,但是这些都不属于标准Android平台的一部分。
在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;
}
}
存在一种解决方法,可以防止禁用设备管理员。当用户启动停用功能并且我们收到ACTION_DEVICE_ADMIN_DISABLE_REQUESTED回调时,我们将重新启动设置活动意图。OS允许显示一条消息,要求用户确认。根据Android操作系统规则,在大约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
以上是关于禁用设备管理员的主要内容,如果未能解决你的问题,请参考以下文章