欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android设备管理器,DeviceAdmin应用设置(代码方式,无需跳转系统界面用户点击激活)

程序员文章站 2022-11-02 11:01:34
我们有时候会用到DeviceAdmin权限,一般来说,需要用户手动到设备管理器里面激活应用,也可以APP通过startActivity的方式跳转到激活页面,这两个都需要用户手动点击激活,其实DevicePolicyManager本身有提供setActiveAdmin这个方法设置设备管理器应用的,不过这个方法是隐藏方法,并且需要system权限下面提供一种代码方式直接激活设备管理器的方式必要条件1.系统签名2.uid设置成android.uid.system代码如下 priva.....

我们有时候会用到DeviceAdmin权限,一般来说,需要用户手动到设备管理器里面激活应用,也可以APP通过startActivity的方式跳转到激活页面,这两个都需要用户手动点击激活,其实DevicePolicyManager本身有提供setActiveAdmin这个方法设置设备管理器应用的,不过这个方法是隐藏方法并且需要system权限

下面提供一种代码方式直接激活设备管理器的方式

必要条件

1.系统签名

2.uid 设置成 android.uid.system

代码如下

  private void mRefSetActiveAdmin(ComponentName policyReceiver, boolean refreshing) {
        DevicePolicyManager dpm  = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE)
        Class<?> refDPM = dpm.getClass();
        try {
            Method[] methods = refDPM.getDeclaredMethods();
            Method refSetActiveAdmin  = null;
            for (Method method : methods) {
                if(method.getName().equals("setActiveAdmin")){
                    if(method.getParameterTypes().length == 2){
                        refSetActiveAdmin = method;//Tips 为什么要用遍历的方式获取,因为用普通的参数类型方式无法获取到,这个情况遇到很多次了,明明包含该方法但就是无法获取到,有大神可以解释一下么。
                        break;
                    }

                }
            }

            refSetActiveAdmin.setAccessible(true);
            refSetActiveAdmin.invoke(dpm, policyReceiver, refreshing);
        }  catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }

使用方式

        ComponentName componentName = new ComponentName(this, DeviceReceiver.class);//DeviceReceiver是admin类继承了DeviceAdminReceiver
        mRefSetActiveAdmin(componentName, false);

以上就可以激活指定的设备管理器Admin

本文地址:https://blog.csdn.net/OneT1me/article/details/107319531