[mobilesafe] 01_Administration API——一键锁屏

Android 4.0

Administration 一键锁屏

注意:非Activity激活不了系统设备界面

Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
ComponentName who = new ComponentName(context, AdminDeviceReceiver.class);
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,who);
intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,context.getResources().getString(R.string.screen_off_device_admin_description));
// intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);// 不要加上这句,否则激活不成功
context.startActivity(intent);
使用该Administration API两种方式:
1、APIs Demo

2、参考官方文档说明 Developing a Device Administration Application
http://developer.android.com/guide/topics/admin/device-admin.html 
android:resource="@xml/device_admin_sample"  declares the security policies used in metadata
声明安全策略
1、写一个类MyAdmin继承 DeviceAdminReceiver  
public class MyAdmin extends DeviceAdminReceiver   
2、  DeviceAdminReceiver就是一个广播接收者,是一个回调, 类似BroadcastReceiver.onReceive()  
public class DeviceAdminReceiver extends BroadcastReceiver  
3、由于是一个广播接收者,所以需要在清单文件中进行配置
<receiver
            android:name="cn.zengfansheng.administration.MyAdmin"
            android:description="@string/sample_device_admin_description"
            android:label="@string/sample_device_admin"
            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>
4、其中
android:permission使用的一个安全声明策略,是一个xml文件\res\xml\device_admin_sample.xml
<?xml version="1.0" encoding="UTF-8"?>
<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>
5、在系统设置→安全→设备管理器→将√勾上

然后出现激活的界面:(如果不激活,那么一键锁屏一运行就会报错)


6、一键锁屏正常运行
细节:
1、如果一键锁屏应用,一开始没有获取设备管理员权限,那么会报错
2、让用户去设置开启设备管理员权限,愚蠢——一键开启设置管理员权限
public void activeAdmin(View view) {
    Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
    ComponentName who = new ComponentName(this, MyAdmin.class);
    intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, who);//要激活的应用的全路径名
    intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,"激活设备管理权限,那么你就可以立马看到美眉了哦!");
    //激活时,提示的描述信息
    startActivity(intent);
}  

3、软件卸载不了,必须先将设备管理员权限关闭,系统设置→安全→设备管理器,取消激活。


系统卸载应用:
<activity android:name=".UninstallerActivity"
                android:configChanges="orientation|keyboardHidden|screenSize"
                android:excludeFromRecents="true"
                android:theme="@android:style/Theme.DeviceDefault.Dialog.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.DELETE" />
                <action android:name="android.intent.action.UNINSTALL_PACKAGE" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:scheme="package" />
            </intent-filter>
</activity>
4、为了用户体验好,提供一键卸载的方式,利用系统的PackageInstaller卸载_一键卸载
/**
 * 3、一键卸载
 * 
 * @param view
 */
@SuppressLint("InlinedApi")
public void uninstall(View view) {
    // 1、利用代码先将该应用的设备管理员权限给去掉
    DevicePolicyManager manager = (DevicePolicyManager) this
            .getSystemService(Context.DEVICE_POLICY_SERVICE);
    ComponentName who = new ComponentName(this, MyAdmin.class);
    manager.removeActiveAdmin(who);
    Log.i(TAG"取消激活了设备管理员权限");
    // 2、利用系统PackageInstaller卸载掉应用
    /*
     * <intent-filter> <action android:name="android.intent.action.DELETE"
     * /> <action android:name="android.intent.action.UNINSTALL_PACKAGE" />
     * <category android:name="android.intent.category.DEFAULT" /> <data
     * android:scheme="package" /> </intent-filter>
     */
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_UNINSTALL_PACKAGE);
    intent.addCategory(Intent.CATEGORY_DEFAULT);
    // intent.setData(Uri.parse("package://+ getPackageName()"));//不要加//
    intent.setData(Uri.parse("package:" + getPackageName()));
    startActivity(intent);
}
5、在取消激活后,如果再点击一键锁屏,会报错,因为没有设备管理员权限,所以必须先判断

Enabling the application

Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
                        intent
.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mDeviceAdminSample);
                        intent
.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
                                mActivity
.getString(R.string.add_admin_extra_app_text));
                        startActivityForResult
(intent, REQUEST_CODE_ENABLE_ADMIN);

/**
 * 1、一键锁屏
 * 
 * @param view
 */
public void lockScreen(View view) {
    // 1、获取设备隐私管理器
    DevicePolicyManager devicePolicyManager = (DevicePolicyManager) this.getSystemService(DEVICE_POLICY_SERVICE);
    // 2、进行判断,是否激活了设备管理员权限
    ComponentName who = new ComponentName(this, MyAdmin.class);
    if (devicePolicyManager.isAdminActive(who)) {//2-1激活了设备管理员权限,那么直接锁屏
        devicePolicyManager.lockNow();
    }else {//2-2 没有激活,那么先激活,再锁屏
        activeAdmin(view);
    }
    //devicePolicyManager.wipeData(0);
    // currently 0 and WIPE_EXTERNAL_STORAGE are supported.设备会重启,在下次重启的时候将设备数据全部清除掉
}
/**
 * 2、一键获取设备管理员权限(参考官方文档)
 * @ param view
 */
public void activeAdmin(View view) {
    Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
    ComponentName who = new ComponentName(this, MyAdmin.class);
    intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, who);//要激活的应用的全路径名
    intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,"激活设备管理权限,那么你就可以立马看到美眉了哦!");
    //激活时,提示的描述信息
    startActivity(intent);
}
6、如果需要在桌面上,点击图标就锁屏,那么就锁屏的代码放在Activity的onCreate()里面
7、设置密码锁屏
/**
 * 4、设置锁屏密码
 * @param view
 */
public void setLockScreenPwd(View view) {
    DevicePolicyManager manager = (DevicePolicyManager) this.getSystemService(Context.DEVICE_POLICY_SERVICE);
    ComponentName who = new ComponentName(this, MyAdmin.class);
    if (manager.isAdminActive(who)) {
        manager.resetPassword("123", 0);
        manager.lockNow();
    } else {
        activeAdmin(view);
    }
}  
8、清除密码锁屏
/**
 * 5、清除锁屏密码
 * @param view
 */
public void clearLockScreenPwd(View view){
    DevicePolicyManager manager = (DevicePolicyManager) this.getSystemService(Context.DEVICE_POLICY_SERVICE);
    ComponentName who = new ComponentName(this, MyAdmin.class);
    if (manager.isAdminActive(who)) {
        manager.resetPassword("", 0);
    } else {
        activeAdmin(view);
    }
}

开发一个自己的锁屏软件——保护开关机按钮
锁屏:一键锁屏
开锁:摇晃