Android中的关于MDM中的几个方法举例

Android中的关于MDM中的几个方法举例

首先介绍一下MDM是什么的缩写,MDM是什么?

MDM 是 (Mobile Device Management )的缩写,中文翻译过来就是移动设备管理。随着移动设备计算能力地增强,移动设备携带越来越方便,移动化办公已经成为一种潮流,一种趋势,企业对移动设备管理的需求越来越急切。MDM是企业IT 向移动互联网过渡的平台技术,帮助企业将IT管理能力从传统的 PC 延伸到移动设备甚至 移动应用APP 。 随着时间的发展, MDM 厂商逐渐扩展出 MAM (Mobile Application Management)移动设备的应用程序管理,MEM(Mobile Email Management)移动设备的邮件管理和 MCM (Mobile Content Management)移动设备的内容管理等更多功能,但是MDM是这些管理的基础。

移动设备的管理首先定义可以对移动设备进行哪些操作,操作列表定义在xml文档,文档的路径是project_name/res/xml/文件夹下面,如下面的mdms.xml:

<?xml version="1.0" encoding="UTF-8"?>
<device-admin xmlns:android="http://schemas.android.com/apk/res/android" >

<uses-policies>

<!-- 强行锁定 -->
        <force-lock />
        <!-- 清除所有数据(恢复出厂设置) -->
        <wipe-data />
        <!-- 重置密码 -->
        <reset-password />
        <!-- 限制密码选择 -->
        <limit-password />
        <!-- 监控登录尝试 -->
        <watch-login />

<disable-camera />
    </uses-policies>

</device-admin>

然后提供一个继承DeviceAdminReceiver的子类,并在Manifest中配置如下:xml/mdms就是上文中的mdms的xml文件。

<receiver
            android:name=".SUDeviceAdminReceiver"
            android:label="@string/app_name"
            android:permission="android.permission.BIND_DEVICE_ADMIN" >
            <meta-data
                android:name="android.app.device_admin"
                android:resource="@xml/mdms" />

<intent-filter>
                <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
            </intent-filter>
        </receiver>

SUDeviceAdminReceiver的代码如下:

public class SUDeviceAdminReceiver extends DeviceAdminReceiver {
    @Override  
    public DevicePolicyManager getManager(Context context) {  
     //   Logger.d("------" + "getManager" + "------");
    
        return super.getManager(context);  
    }  
    @Override  
    public ComponentName getWho(Context context) {  
      //  Logger.d("------" + "getWho" + "------");  
        return super.getWho(context);  
    }  
      
    /** 
     * 禁用 
     */  
    @Override  
    public void onDisabled(Context context, Intent intent) {  
       // Logger.d("------" + "onDisabled" + "------");  
          
        Toast.makeText(context, "禁用设备管理", Toast.LENGTH_SHORT).show();  
          
        super.onDisabled(context, intent);  
    }  
    @Override  
    public CharSequence onDisableRequested(Context context, Intent intent) {  
       // Logger.d("------" + "onDisableRequested" + "------");  
        return super.onDisableRequested(context, intent);  
    }  
      
    /** 
     * 激活 
     */  
    @Override  
    public void onEnabled(Context context, Intent intent) {  
       // Logger.d("------" + "onEnabled" + "------");  
          
        Toast.makeText(context, "启动设备管理", Toast.LENGTH_SHORT).show();  
          
        super.onEnabled(context, intent);  
    }  
    @Override  
    public void onPasswordChanged(Context context, Intent intent) {  
       // Logger.d("------" + "onPasswordChanged" + "------");  
        super.onPasswordChanged(context, intent);  
    }  
    @Override  
    public void onPasswordFailed(Context context, Intent intent) {  
       // Logger.d("------" + "onPasswordFailed" + "------");  
        super.onPasswordFailed(context, intent);  
    }  
    @Override  
    public void onPasswordSucceeded(Context context, Intent intent) {  
       // Logger.d("------" + "onPasswordSucceeded" + "------");  
        super.onPasswordSucceeded(context, intent);  
    }  
    @Override  
    public void onReceive(Context context, Intent intent) {  
       // Logger.d("------" + "onReceive" + "------");  
          
        super.onReceive(context, intent);  
    }  
    @Override  
    public IBinder peekService(Context myContext, Intent service) {  
       // Logger.d("------" + "peekService" + "------");  
        return super.peekService(myContext, service);  
    }

}

在进行移动设备(Android移动设备)管理之前,首先要激活设备管理器,管理器激活的代码如下:

/**
     * 激活设备管理权限 成功执行激活时,DeviceAdminReceiver中的 onEnabled 会响应
     */
    private void activeManage() {
        // 启动设备管理(隐式Intent) - 在AndroidManifest.xml中设定相应过滤器
        Intent intents = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);

// 权限列表
        intents.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName);

// 描述(additional explanation)
        intents.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
                "------ 其他描述 ------");

startActivityForResult(intents, 0);
    }

点击下图中的激活按钮就可以对设备进行管理了。

关闭屏幕的方法:

public void closeScreen() {
                boolean active = policyManager.isAdminActive(componentName);
        if (active) {
            policyManager.lockNow();
            lockScreen(getWindow());

}
    }

public void lockScreen(Window wind) {
        wind.clearFlags(LayoutParams.FLAG_DISMISS_KEYGUARD);
        wind.clearFlags(LayoutParams.FLAG_SHOW_WHEN_LOCKED);
        wind.clearFlags(LayoutParams.FLAG_TURN_SCREEN_ON);
    }

屏幕由黑变亮,跳过滑动解锁,回到Launcher的方法:

public void unlockScreen() {
        wakeLock = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP
                | PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "My Tag");
        wakeLock.acquire();

// 得到键盘锁管理器对象
        keyguradLock = km.newKeyguardLock("unLock");
        // 参数是LogCat里用的Tag
        keyguradLock.disableKeyguard();
    }

允许摄像机使用的方法:

public void enableCamera() {
        policyManager.setCameraDisabled(componentName, true);
    }

禁止摄像机使用的方法:

public void disableCamera() {
        policyManager.setCameraDisabled(componentName, false);
    }

设置移动设备密码的方法:

public void encrptionDevice(String password) {

//首先关闭屏幕,加密码的操作才会立即生效

closeScreen();
        policyManager.resetPassword(password, 0);

}

去除移动设备密码的方法:

public void decrptionDevice() {
        lockScreen(this.getWindow());

//把原来设备的密码设置为空,也就相当于去除了设备的密码
        policyManager.resetPassword("", 0);
        unlockScreen();
    }

上面方法中用到的变量定义和赋值如下:

private ComponentName componentName = null;
    public static DevicePolicyManager policyManager = null;
    private PowerManager pm;
    KeyguardManager km;
    KeyguardLock keyguradLock;

private PowerManager.WakeLock wakeLock;

// AdminReceiver 继承自 DeviceAdminReceiver
        componentName = new ComponentName(this, SUDeviceAdminReceiver.class);
        // 获取设备管理服务
        policyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
        km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
        // 获取电源的服务
        pm = (PowerManager) getSystemService(Context.POWER_SERVICE);

还需要使用一些权限如下:

<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />

MDM的管理大概就讲到这里了,希望对大家能有所帮助。

时间: 2024-08-08 13:27:29

Android中的关于MDM中的几个方法举例的相关文章

第三十九讲:Android之AndroidManifest.xml文件中注册权限

积土而为山,积水而为海.--<荀子·儒效> 本讲内容:android权限详细 1 访问登记属性 android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据库属性表的权限 2 获取错略位置 android.permission.ACCESS_COARSE_LOCATION,通过WiFi或移动基站的方式获取用户错略的经纬度信息,定位精度大概误差在30~1500米 3 获取精确位置 android.permission.ACCESS

Android学习之解决ListView中item点击事件和item中Button点击事件冲突问题

在ListView中添加Button后,如果只是单纯的加入而不加限制的话,ListView的onClick点击事件没有响应,因为Button获取了item的焦点,想要两者都可点击,需要加上如下限制: 在ListView的适配器中的布局文件中添加: (1)在布局文件的根元素上中添加属性android:descendantFocusability="blocksDescendants" (2)在Button中添加属性android:focusable="false"和a

Android重难点解析——面试中可能被问到的那些问题

这篇项目主要介绍Android中的一些重难点概念,也包括面试中可能被问到的经典问题. 因为这些知识点比较琐碎,不太适合写成一篇文章,所以采用Github管理,内容会首先在Github更新,这里不定时同步,如果你想第一时间收到通知,请关注Github中的该项目. 项目地址 Android重难点解析,欢迎star,follow,将持续分享Android开发知识 文章列表 谈谈你对Application类的理解 Android为什么要设计出Bundle而不是直接使用HashMap来进行数据传递? 谈谈

【Android 应用开发】 Android 相关代码规范 更新中 ...

. 简介 : Android 常用的代码结构, 包括包的规范, 测试用例规范, 数据库模块常用编写规范; 参考 : 之前写的一篇博客 [Android 应用开发] Application 使用分析 ; -- Application 分析 : Application 概念, 声明周期, 组件间传递数据作用, 数据缓存作用; -- 源码分析 : 分析 Application 结构接口源码; -- 使用示例 : 自定义 Application 注册, 保存崩溃日志到文件, 监听Activity声明周期

Android如何在java代码中设置margin

习惯了直接在xml里设置margin(距离上下左右都是10dip),如: <ImageView android:layout_margin="10dip" android:src="@drawable/image" /> 只是有些情况下,需要在java代码里来写. API中,android.view.ViewGroup.MarginLayoutParams有个方法setMargins(left, top, right, bottom).可是View本身没

Android 使用ContentProvider扫描手机中的图片,仿微信显示本地图片效果

首先我们先看第一个界面吧,使用将手机中的图片扫描出来,然后根据图片的所在的文件夹将其分类出来,并显示所在文件夹里面的一张图片和文件夹中图片个数,我们根据界面元素(文件夹名, 文件夹图片个数,文件夹中的一张图片)使用一个实体对象ImageBean来封装这三个属性 package com.example.imagescan; /** * GridView的每个item的数据对象 * * @author len * */ public class ImageBean{ /** * 文件夹的第一张图片路

iOS/Android 浏览器(h5)及微信中唤起本地APP

在移动互联网,链接是比较重要的传播媒质,但很多时候我们又希望用户能够回到APP中,这就要求APP可以通过浏览器或在微信中被方便地唤起. 这是一个既直观又很好的用户体验,但在实现过程中会遇到各种问题: 如何解决未安装APP时的做好引导页 如何在微信中唤醒APP 在iOS9中如何处理universal link被用户误关的情况 如何解决Android各种机型.各种第三方浏览器导致的兼容问题等 在APP未安装情况下,引导用户下载后打开APP后,如何进入之前唤起时指定的页面或内容,即如何实现场景还原 在

Android中8种异步处理与计算的方法

注:该文章翻译自Ali Muzaffar的文章<8 ways to do asynchronous processing in Android and counting>  Android提供了许多API来支持异步处理的功能,结合着Java提供的方法和你手上拥有的,估计目前已经有数十种进行异步任务的方法. 目前的趋势是仅使用Java的threads或者Android的AsyncTask来处理各种问题.虽然上述两种方法拥有较高的知名度,但是并非所有的API都适合,为你的需求选择最合适的方法能够使

【Android布局】在程序中设置android:gravity 和 android:layout_Gravity属性

在进行UI布局的时候,可能常常会用到 android:gravity  和 android:layout_Gravity 这两个属性. 关于这两个属性的差别,网上已经有许多人进行了说明,这边再简单说一下. (资料来自网络) LinearLayout有两个很类似的属性: android:gravity与android:layout_gravity. 他们的差别在于: android:gravity 属性是对该view中内容的限定.比方一个button 上面的text. 你能够设置该text 相对于