禁用设备管理员

问题描述 投票:2回答:3

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

android android-3.0-honeycomb
3个回答
3
投票

[至少使用发布的API,无法阻止用户禁用设备管理员。您能做的最好的就是如果某些策略不到位,则不允许程序运行。

某些制造商(例如,三星)已经扩展了基本API以允许其他功能,但是这些都不属于标准Android平台的一部分。


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

0
投票

存在一种解决方法,可以防止禁用设备管理员。当用户启动停用功能并且我们收到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

© www.soinside.com 2019 - 2024. All rights reserved.