首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设备管理员禁用

设备管理员禁用
EN

Stack Overflow用户
提问于 2011-06-24 00:46:28
回答 3查看 10.4K关注 0票数 2

如果未禁用设备管理应用程序,则无法将其卸载。用户可以从设置中禁用“设备管理员”。当公司将android设备提供给员工时,公司希望能够控制设备、他们的状态和策略,但用户可以很容易地摆脱这种控制。有人知道如何防止用户禁用设备管理员吗?谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-24 00:50:18

没有办法阻止用户禁用设备管理员,至少是使用已发布的API。如果某些策略没有到位,您可以做的最好的事情就是禁止程序运行。

一些制造商(例如,三星)已经扩展了基础API以允许额外的功能,但这些不是标准Android平台的一部分。

票数 4
EN

Stack Overflow用户

发布于 2013-02-03 22:54:24

在DeviceAdminReceiver.java中,你可以这样做onDisableRequested:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 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

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6457690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档