现在的位置: 首页 > 综合 > 正文

Android 设备管理员-android 一键锁屏

2018年04月07日 ⁄ 综合 ⁄ 共 13159字 ⁄ 字号 评论关闭

Android 2.2 SDK提供了一个可管理和操作设备的API叫DevicePolicyManager,使用这个API你可以接管手机的应用权限,对手机做出很多大胆的操作,比如锁屏,恢复出厂设置(这么和谐的东西要是在中国是不大可能提供给你的),还有设置密码、强制清除密码,修改密码、设置屏幕灯光渐暗时间间隔等操作。这个API可谓是直接可以将你做的应用程序变成系统的老大哥了。虽说是这样,但应用程序可做老大只是对于你本身应用程序有效,别人也可以做类似的应用程序,这个与别人的权限是不起冲突的。

具体的编写代码的流程:

1.因为这个API是用的2.2提供的API,所以必须将sdkVersion设置为8,像这样<uses-sdk android:minSdkVersion="8" />,这是必须的。

2.注册一个广播服务类,用以监听权限的变化:

 

<receiver android:name=".deviceAdminReceiver" android:label="@string/app_name"
            android:description="@string/description" android:permission="android.permission.BIND_DEVICE_ADMIN">

            <meta-data android:name="android.app.device_admin"
                android:resource="@xml/device_admin" />

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

        </receiver>

 

android:permission 表示此功能需要的权限,android:name="android.app.action.DEVICE_ADMIN_ENABLED" 表示此动作的跳转界面

<meta-data android:name="android.app.device_admin"
                android:resource="@xml/device_admin" />
表示这个应用可以管理的权限清单,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 />
    </uses-policies>
</device-admin>


 

 

 

广播服务类的JAVA代码,重写一些必要的实现函数:

 

package com.terry.device;

import android.app.admin.DeviceAdminReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.widget.Toast;

public class deviceAdminReceiver extends DeviceAdminReceiver {


    
/**
     * 获取设备存储的数值

     * 

     * 
@param context

     * 
@return
     */
    public static SharedPreferences getDevicePreference(Context context) {

        
return context.getSharedPreferences(

                DeviceAdminReceiver.
class.getName(), 0);

    }


    
// 密码的特点
    public static String PREF_PASSWORD_QUALITY = "password_quality";

    
// 密码的长度
    public static String PREF_PASSWORD_LENGTH = "password_length";


    
public static String PREF_MAX_FAILED_PW = "max_failed_pw";


    
void showToast(Context context, CharSequence text) {

        Toast.makeText(context, text, Toast.LENGTH_SHORT).show();

    }


    @Override

    
public void onEnabled(Context context, Intent intent) {

        
// TODO Auto-generated method stub
        showToast(context, "设备管理:可用");

    }


    @Override

    
public void onDisabled(Context context, Intent intent) {

        
// TODO Auto-generated method stub
        showToast(context, "设备管理:不可用");

    }


    @Override

    
public CharSequence onDisableRequested(Context context, Intent intent) {

        
// TODO Auto-generated method stub
        return "这是一个可选的消息,警告有关禁止用户的请求";

    }


    @Override

    
public void onPasswordChanged(Context context, Intent intent) {

        
// TODO Auto-generated method stub
        showToast(context, "设备管理:密码己经改变");

    }


    @Override

    
public void onPasswordFailed(Context context, Intent intent) {

        
// TODO Auto-generated method stub
        showToast(context, "设备管理:改变密码失败");

    }


    @Override

    
public void onPasswordSucceeded(Context context, Intent intent) {

        
// TODO Auto-generated method stub
        showToast(context, "设备管理:改变密码成功");

    }


}

 

 

DeviceAdminReceiver是扩展于BroadcastReceiver。

 

下面先来看看操作效果,点击启用管理:

数据显示不完全 ,往下拉将看到:

中间有一句话叫做:“设备管理可以对系统的一些安全进行设置”,这句话来源于上面的广播receiver中的description:android:description="@string/description",点击激活会触发广播类响应上面广播类弹出Toast。启用管理代码:

 

/**
     * 设备管理可用的点击事件

     * 

     * 
@author terry

     * 

     
*/
    class enableAdminClickEvent implements OnClickListener {


        @Override

        
public void onClick(View v) {

            
// TODO Auto-generated method stub
            Intent intent = new Intent(

                    DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);

            intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,

                    mDeviceComponentName);

            intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,

                    
"这里可以输入一些额外的说明,比如提示用户什么的");

            startActivityForResult(intent, RESULT_ENABLE);

        }


    }

 

 

 

锁屏操作,由于是模拟器不能做到真正错屏,只能停到初始模拟器进来需要解锁的状态,屏幕不会变暗。锁屏代码:

 

/**
     * 锁屏

     * 

     * 
@author terry

     * 

     
*/
    class force_lock implements OnClickListener {


        @Override

        
public void onClick(View v) {

            
// TODO Auto-generated method stub
            if (mAM.isUserAMonkey()) {

                AlertDialog.Builder builder 
= new AlertDialog.Builder(

                        deviceActivity.
this);

                builder.setMessage(
"你不能对此屏幕进行操作,因为你不是管理员");

                builder.setPositiveButton(
"I admit defeat"null);

                builder.show();

                
return;

            }

            
boolean active = mDPM.isAdminActive(mDeviceComponentName);

            
if (active) {

                mDPM.lockNow();

            }

        }

    }

 

 

屏幕在设置相应时间后灯光变暗效果:

 

/**
     * 屏幕自动变暗

     * 

     * 
@author terry

     * 

     
*/
    class timeoutClickEvent implements OnClickListener {


        @Override

        
public void onClick(View v) {

            
// TODO Auto-generated method stub
            if (mAM.isUserAMonkey()) {

                AlertDialog.Builder builder 
= new AlertDialog.Builder(

                        deviceActivity.
this);

                builder.setMessage(
"你不能对我的屏幕进行操作,因为你不是管理员");

                builder.setPositiveButton(
"I admit defeat"null);

                builder.show();

                
return;

            }

            
boolean active = mDPM.isAdminActive(mDeviceComponentName);

            
if (active) {

                
long timeout = 1000L * Long.parseLong(et.getText().toString());

                mDPM.setMaximumTimeToLock(mDeviceComponentName, timeout);

            }

        }

    }

 

 

由于是模拟器,恢复出厂设置清除数据后,将无法重新开机,必须重新启动机子,在真机上是没有问题的,测试的时候必须小心,以免将你的数据清除掉。恢复出厂设置代码:

 

/**
     * 恢复出厂设置

     * 

     * 
@author terry

     * 

     
*/
    class resetClickEvent implements OnClickListener {


        @Override

        
public void onClick(View v) {

            
// TODO Auto-generated method stub
            if (mAM.isUserAMonkey()) {

                
// Don't trust monkeys to do the right thing!
                AlertDialog.Builder builder = new AlertDialog.Builder(

                        deviceActivity.
this);

                builder

                        .setMessage(
"You can't wipe my data because you are a monkey!");

                builder.setPositiveButton(
"I admit defeat"null);

                builder.show();

                
return;

            }


            AlertDialog.Builder builder 
= new Builder(deviceActivity.this);

            builder.setMessage(
"将重置数据,你确定此操作吗?");

            builder.setPositiveButton(android.R.string.ok,

                    
new DialogInterface.OnClickListener() {


                        @Override

                        
public void onClick(DialogInterface dialog, int which) {

                            
// TODO Auto-generated method stub
                            AlertDialog.Builder aler = new AlertDialog.Builder(

                                    deviceActivity.
this);

                            aler.setMessage(
"删除数据后,系统将会重新启动.确定吗?");

                            aler.setPositiveButton(android.R.string.ok,

                                    
new DialogInterface.OnClickListener() {


                                        @Override

                                        
public void onClick(

                                                DialogInterface dialog,

                                                
int which) {

                                            
// TODO Auto-generated method stub
                                            boolean active = mDPM

                                                    .isAdminActive(mDeviceComponentName);

                                            
if (active) {

                                                mDPM.wipeData(
0);

                                            }

                                        }

                                    });

                            aler

                                    .setNeutralButton(android.R.string.cancel,

                                            
null);

                            aler.show();

                        }

                    });

            builder.setNeutralButton(android.R.string.cancel, 
null);

            builder.show();

        }

    }

 

API的提供简化了很多烦琐的操作,就上面那些代码就可以实现了,完整代码如下:

 

DeviceActivity

package com.terry.device;

import android.app.Activity;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class deviceActivity extends Activity {

    
static final int RESULT_ENABLE = 1;

    DevicePolicyManager mDPM;

    ActivityManager mAM;

    ComponentName mDeviceComponentName;

    Button enableAdmin, disableAdmin, force_lock, btn_time_out, reset;

    EditText et;


    
/** Called when the activity is first created. */
    @Override

    
public void onCreate(Bundle savedInstanceState) {

        
super.onCreate(savedInstanceState);


        mDPM 
= (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);

        mAM 
= (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);

        mDeviceComponentName 
= new ComponentName(deviceActivity.this,

                deviceAdminReceiver.
class);

        setContentView(R.layout.main);


        findView();


        init();


    }


    
void findView() {

        enableAdmin 
= (Button) findViewById(R.id.enable_admin);

        disableAdmin 
= (Button) findViewById(R.id.disable_admin);

        force_lock 
= (Button) findViewById(R.id.force_lock);

        btn_time_out 
= (Button) findViewById(R.id.time_out);

        et 
= (EditText) findViewById(R.id.et_time_out);

        reset 
= (Button) findViewById(R.id.reset);

    }


    
void init() {

        enableAdmin.setOnClickListener(
new enableAdminClickEvent());

        disableAdmin.setOnClickListener(
new disableAdminClickEvent());

        force_lock.setOnClickListener(
new force_lock());

        btn_time_out.setOnClickListener(
new timeoutClickEvent());

        reset.setOnClickListener(
new resetClickEvent());

    }


    
void updateButtonState() {

        
boolean active = mDPM.isAdminActive(mDeviceComponentName);

        
if (active) {

            enableAdmin.setEnabled(
false);

            disableAdmin.setEnabled(
true);

            force_lock.setEnabled(
true);

            btn_time_out.setEnabled(
true);

            reset.setEnabled(
true);

        } 
else {

            enableAdmin.setEnabled(
true);

            disableAdmin.setEnabled(
false);

            force_lock.setEnabled(
false);

            btn_time_out.setEnabled(
false);

            reset.setEnabled(
false);

        }

    }


    @Override

    
protected void onResume() {

        
// TODO Auto-generated method stub
        super.onResume();

        updateButtonState();

    }


    @Override

    
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        
// TODO Auto-generated method stub
        switch (requestCode) {

        
case RESULT_ENABLE:

            
if (resultCode == Activity.RESULT_OK) {

                Log.v(
"DeviceEnable""deviceAdmin:enable");

            } 
else {

                Log.v(
"DeviceEnable""deviceAdmin:disable");

            }

            
break;


        }


        
super.onActivityResult(requestCode, resultCode, data);

    }


    
/**
     * 设备管理可用的点击事件

     * 

     * 
@author terry

     * 

     
*/
    class enableAdminClickEvent implements OnClickListener {


        @Override

        
public void onClick(View v) {

            
// TODO Auto-generated method stub
            Intent intent = new Intent(

                    DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);

            intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,

                    mDeviceComponentName);

            intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,

                    
"这里可以输入一些额外的说明,比如提示用户什么的");

            startActivityForResult(intent, RESULT_ENABLE);

        }


    }


    
/**
     * 设备管理不可用的点击事件

     * 

     * 
@author terry

     * 

     
*/
    class disableAdminClickEvent implements OnClickListener {


        @Override

        
public void onClick(View v) {

            
// TODO Auto-generated method stub
            mDPM.removeActiveAdmin(mDeviceComponentName);

            updateButtonState();

        }


    }


    
/**
     * 锁屏

     * 

     * 
@author terry

     * 

     
*/
    class force_lock implements OnClickListener {


        @Override

        
public void onClick(View v) {

            
// TODO Auto-generated method stub
            if (mAM.isUserAMonkey()) {

                AlertDialog.Builder builder 
= new AlertDialog.Builder(

                        deviceActivity.
this);

                builder.setMessage(
"你不能对此屏幕进行操作,因为你不是管理员");

                builder.setPositiveButton(
"I admit defeat"null);

                builder.show();

                
return;

            }

            
boolean active = mDPM.isAdminActive(mDeviceComponentName);

            
if (active) {

                mDPM.lockNow();

            }

抱歉!评论已关闭.