Android 设备管理员禁用

Android 设备管理员禁用,android,android-3.0-honeycomb,Android,Android 3.0 Honeycomb,如果未安装设备管理应用程序,则无法将其卸载 残废用户可以从设置中禁用“设备管理员”。 当公司向员工提供安卓设备时,公司希望 可以控制设备及其状态和策略,但用户可以 很容易摆脱这种控制。有人知道怎么可能吗 防止用户禁用设备管理员? 谢谢。没有办法阻止用户禁用设备管理员,至少使用已发布的API。您所能做的最好的事情是,如果某些策略不到位,则不允许程序运行 一些制造商(如三星)已经扩展了基本API以允许附加功能,但这些功能不是标准Android平台的一部分。在DeviceAdminReceiver.j

如果未安装设备管理应用程序,则无法将其卸载 残废用户可以从设置中禁用“设备管理员”。 当公司向员工提供安卓设备时,公司希望 可以控制设备及其状态和策略,但用户可以 很容易摆脱这种控制。有人知道怎么可能吗 防止用户禁用设备管理员?
谢谢。

没有办法阻止用户禁用设备管理员,至少使用已发布的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\u DEVICE\u ADMIN\u DISABLE\u请求的回调时,我们将重新启动设置活动意图。

操作系统允许显示一条消息,请求用户确认。根据安卓操作系统的规定,在大约5秒钟内,不允许在此确认对话框上启动任何应用程序。因此,我们尝试打开的设置活动基本上只会在5秒后启动。

要在不允许用户确认停用的情况下度过这5秒钟,设备管理员会在后台线程中反复锁定手机。用户解锁设备5秒后,“设置”活动将重新启动

下面的Device Admin Broadcast Receiver类代码说明了上述方法

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();
            }
        }
    };


}

公共类DevAdminReceiver扩展了DeviceAdminReceiver{
DevicePolicyManager dpm;
长电流时间;
定时器读取;
@凌驾
public void onEnabled(@NonNull上下文,@NonNull意图){
super.onEnabled(上下文、意图);
Log.d(“根”,“设备所有者已启用”);
}
@可空
@凌驾
公共字符序列onDisableRequested(@NonNull上下文上下文,@NonNull意图){
Log.d(“设备管理”、“请求禁用”);
Intent startMain=新的Intent(android.provider.Settings.ACTION\u设置);
startMain.setFlags(意图、标志、活动、新任务);
背景。起始触觉(startMain);
dpm=(DevicePolicyManager)context.getSystemService(context.DEVICE\u POLICY\u SERVICE);
myThread=新计时器();
current_time=System.currentTimeMillis();
myThread.进度计划(锁定任务,01000);
返回“警告”;
}
公共void onReceive(上下文、意图){
String action=intent.getAction();
如果(操作\设备\管理\禁用\请求。等于(操作)){
CharSequence res=onDisableRequested(上下文、意图);
如果(res!=null){
dpm.lockNow();
Bundle extras=getResultTextras(true);
额外putCharSequence(额外禁用警告,res);
}
}else if(操作\设备\管理\禁用。等于(操作)){
Log.d(“设备管理”、“禁用”);
}
}
//每秒重复锁定手机5秒钟
TimerTask lock_task=new TimerTask(){
@凌驾
公开募捐{
long diff=System.currentTimeMillis()-当前时间;

如果(Diff)我确实发生了其他事情,因为我正在思考某些应用程序(例如WaveSecure)的功能。因为请求禁用设备管理员的用户本身就是一个操作(请参阅),所以您可能可以在收到此操作时锁定设备(假设应用程序安装了此功能)。我很确定WaveSecure就是这么做的。谢谢你的例子,我看了WaveSecure。它们确实可以防止用户禁用管理器,实际上它会被禁用,但在输入密码之前保持锁定活动。重新启动管理器后启用。嘿,马克,在WareSecure中,它们会弹出“屏幕锁定”每次用户尝试运行任何应用程序时的活动?他们如何处理其他应用程序启动事件的想法?嗯…不是即时的。这里有一个关于这个主题的讨论-,马克·墨菲表示没有这个意图,所以可能没有:-)当用户在“设备管理”部分单击“停用”时,如果应用程序内设置设置为“停用”,它将开始显示主屏幕,并且不会停用deviceadmin,但我想用户可以清除GetSharedReferences,所以最好将该信息保存到其他地方。这在Android 4.1.2上不起作用。“哎呀!”将弹出,然后过一段时间主屏幕。