设备管理员禁用

时间:2011-06-23 16:46:28

标签: android android-3.0-honeycomb

如果不是,则无法卸载设备管理应用程序 禁用。用户可以从设置中禁用“设备管理员”。 当公司向其员工提供Android设备时,公司希望如此 可以控制设备,状态和策略,但用户可以 容易摆脱那种控制。有人知道这是怎么可能的 防止用户禁用设备管理员? 感谢。

3 个答案:

答案 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