Android 设备管理概览-DevicePolicyManager

背景

Android 通过提供 Android Device Administration API 来支持企业应用。该 Device Administration API 在系统级别提供设备管理功能。借助这些 API,您能够创建在企业环境中非常实用的注重安全性的应用;
在企业环境中,IT 专业人员需要有力地对员工设备进行控制。例如,内置的 Android 电子邮件应用利用这些 API 改善了对 Exchange 的支持。通过电子邮件应用,Exchange 管理员可以跨设备强制执行密码政策(包括字母数字密码或数字 PIN 码)。
管理员还可以远程清除(即恢复出厂默认设置)丢失或被盗手机上的数据。Exchange 用户可以同步他们的电子邮件和日历数据。
什么是设备管理员?
设备管理员是 Android 企业框架下的一个功能,提供了免 root 冻结解冻任意 app 的能力。一台手机仅能同时设置一个管理员。

工作原理

系统管理员会编写一个能够强制执行远程/本地设备安全政策的设备管理应用。这些政策可以硬编码到应用中,或者应用可以从第三方服务器动态获取这些政策。
该应用已安装在用户的设备上。Android 目前没有自动配置解决方案。系统管理员向用户分发应用的一些方式如下:

  • Google Play。
  • 从其他商店启用安装。
  • 通过其他方式分发应用,例如电子邮件或网站。

系统提示用户启用设备管理应用。此类情况发生的方式和时间取决于应用的实现方式。
用户启用该设备管理应用后,便要受到其政策的约束。遵守这些政策通常可带来诸多优势,例如访问敏感系统和数据。
要卸载现有的设备管理应用,用户需要先以管理员的身份取消注册该应用。

开发设备管理应用

要使用 Device Administration API,该应用的清单必须包含以下内容及功能:

- 包含以下内容的 DeviceAdminReceiver 的子类:BIND_DEVICE_ADMIN 权限。
- 能够响应 ACTION_DEVICE_ADMIN_ENABLED Intent,在清单中表示为 Intent 过滤器。
- 元数据中使用的安全政策声明。

以下代码摘录自设备管理示例清单:

<activity android:name=".app.DeviceAdminSample"
                android:label="@string/activity_sample_device_admin">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.SAMPLE_CODE" />
        </intent-filter>
    </activity>
    <receiver android:name=".app.DeviceAdminSample$DeviceAdminSampleReceiver"
            android:label="@string/sample_device_admin"
            android:description="@string/sample_device_admin_description"
            android:permission="android.permission.BIND_DEVICE_ADMIN">
        <meta-data android:name="android.app.device_admin"
                android:resource="@xml/device_admin_sample" />
        <intent-filter>
            <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
        </intent-filter>
    </receiver>

请注意:
- android:permission=“android.permission.BIND_DEVICE_ADMIN” 是 DeviceAdminReceiver 子类必须具有的权限,用于确保仅系统可以与接收者互动(不应向任何应用授予此权限)。该权限可防止其他应用滥用您的设备管理应用。
- android.app.action.DEVICE_ADMIN_ENABLED 是 DeviceAdminReceiver 子类必须处理才能获准管理设备的主要操作。当用户启用设备管理应用后,系统会针对接收者设置此操作。您的代码通常会在 onEnabled() 中处理此操作。要获得支持,接收者还必须请求 BIND_DEVICE_ADMIN 权限,以防止其他应用滥用。
- 当用户启用设备管理应用后,接收者便会获权执行操作以响应特定系统事件的广播。当发生相应的事件时,应用便可以施加某项政策。例如,如果用户尝试设置不符合政策要求的新密码,应用可以提示用户选择其他符合相应要求的密码。

- android:resource="@xml/device_admin_sample" 可声明元数据中使用的安全政策。元数据提供了特定于设备管理员的其他信息,由 DeviceAdminInfo 类进行解析。下面显示了 device_admin_sample.xml 的内容:
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
      <uses-policies>
        <limit-password />
        <watch-login />
        <reset-password />
        <force-lock />
        <wipe-data />
        <expire-password />
        <encrypted-storage />
        <disable-camera />
      </uses-policies>
    </device-admin>

在设计您的设备管理应用时,您无需添加所有政策,只需添加与您的应用相关的政策即可。

DevicePolicyManager Demo

android.app.admin.DevicePolicyManager
Public interface for managing policies enforced on a device. Most clients of this class must be registered with the system as a device administrator. Additionally, a device administrator may be registered as either a profile or device owner. A given method is accessible to all device administrators unless the documentation for that method specifies that it is restricted to either device or profile owners. Any application calling an api may only pass as an argument a device administrator component it owns. Otherwise, a SecurityException will be thrown.

Demo

    // Prepare to work with the DPM
    DevicePolicyManager mDPM =
        (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);
       /**
         * Update the summaries of each item to show the local setting and the global setting.
         */
        @Override
        protected void reloadSummaries() {
            super.reloadSummaries();
            // Show numeric settings for each policy API
            int local, global;
            local = mDPM.getPasswordQuality(mDeviceAdminSample);
            global = mDPM.getPasswordQuality(null);
            mPasswordQuality.setSummary(
                    localGlobalSummary(qualityValueToString(local), qualityValueToString(global)));
            local = mDPM.getPasswordMinimumLength(mDeviceAdminSample);
            global = mDPM.getPasswordMinimumLength(null);
            mMinLength.setSummary(localGlobalSummary(local, global));
            local = mDPM.getPasswordMinimumLetters(mDeviceAdminSample);
            global = mDPM.getPasswordMinimumLetters(null);
            mMinLetters.setSummary(localGlobalSummary(local, global));
            local = mDPM.getPasswordMinimumNumeric(mDeviceAdminSample);
            global = mDPM.getPasswordMinimumNumeric(null);
            mMinNumeric.setSummary(localGlobalSummary(local, global));
            local = mDPM.getPasswordMinimumLowerCase(mDeviceAdminSample);
            global = mDPM.getPasswordMinimumLowerCase(null);
            mMinLowerCase.setSummary(localGlobalSummary(local, global));
            local = mDPM.getPasswordMinimumUpperCase(mDeviceAdminSample);
            global = mDPM.getPasswordMinimumUpperCase(null);
            mMinUpperCase.setSummary(localGlobalSummary(local, global));
            local = mDPM.getPasswordMinimumSymbols(mDeviceAdminSample);
            global = mDPM.getPasswordMinimumSymbols(null);
            mMinSymbols.setSummary(localGlobalSummary(local, global));
            local = mDPM.getPasswordMinimumNonLetter(mDeviceAdminSample);
            global = mDPM.getPasswordMinimumNonLetter(null);
            mMinNonLetter.setSummary(localGlobalSummary(local, global));
        }
      
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值