Android的自动锁屏、解锁

Android的自动锁屏、解锁

前言(容我吐槽一会儿…)

前一段时间做了一个大屏幕项目,有几个比较个性的需求,客户要求:定时自动锁屏、自动定时解锁、定时自动开关机,页面统一(同一时刻显示同一个页面)等,当时,感觉没什么,无非就是麻烦点,可真正动手的时候,才感觉到这里面的麻烦之处。关键是大屏幕显示与你真正的手机,完全是两码事,我在手机模拟器上程序都运行没有任何问题,但是,一旦将程序部署到大屏幕上时,崩溃、定时不准确、定时、蓝屏等一些列问题,接踵而至,当时的心情像是一万个草泥马跑过。。。

言归正传,项目中涉及到自动锁屏、解锁,开关机等功能,本人将自己的代码简要说明一下,望能够给大家一些帮助:

  • 自动锁屏的实现

  • 自动解锁的相关实现


1、自动锁屏的实现

手机锁屏需要相关的权限,在AndroidManifext.xml中加入权限:

uses-permission android:name=”android.permission.DISABLE_KEYGUARD”

private DevicePolicyManager policyManager;
    private ComponentName componentName;

    //获取设备管理服务
   policyManager = (DevicePolicyManager)  getApplicationContext().getSystemService(Context.DEVICE_POLICY_SERVICE);
   componentName = new ComponentName(this, AdminRecieve.class);

  /*
   * 假如先判断是否有权限,如果没有则调用activeManage(),然后立即锁屏。
   * 这样做是有问题的,因为activeManage()可能还在等待另一个Activity的结果,那么此时依然没有权限却
   * 执行了lockNow(),这样就出错了。
   * 处理方法有2个:
   * 1、是重写OnActivityResult()函数,在里面判断是否获取权限成功,是,则锁屏并finish()
   * 否则继续调用activeManage()获取权限(这样激活后立即锁屏,效果很好)
   * 2、不重写OnActivityResult()函数,第一次获取权限后不锁屏而立即finish(),这样从理论上说也可能
   * 失败,可能权限还没获取好就finish了(这样激活后就回到桌面,还得再按一次锁屏才能锁)
   * 综上推荐第一种方法。
   */

//判断是否有锁屏权限,若有则立即锁屏并结束自己,若没有则获取权限
       if (policyManager.isAdminActive(componentName)) {
            policyManager.lockNow();
        } else{
            activeManage();
        }

//获取权限
    private void activeManage(){
        // 启动设备管理(隐式Intent) - 在AndroidManifest.xml中设定相应过滤器
        Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);

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

        //描述(additional explanation)
        intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "激活后才能使用锁屏功能哦亲^^");

        startActivityForResult(intent, MY_REQUEST_CODE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data){
        //获取权限成功,立即锁屏并finish自己,否则继续获取权限
        if (requestCode == MY_REQUEST_CODE && resultCode == Activity.RESULT_OK){
            policyManager.lockNow();
        } else{
            activeManage(); //建议不要开启这个,要不然会一直请求权限
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

2、自动解锁的相关实现

手机解锁需要相关的权限,在AndroidManifext.xml中加入权限:

uses-permission android:name=”android.permission.WAKE_LOCK”

   /**
     *     唤醒屏幕并解锁权限 
     *     <uses-permission android:name="android.permission.WAKE_LOCK" />
     */
    @SuppressLint("Wakelock")
    @SuppressWarnings("deprecation")
    public static void wakeUpAndUnlock(Context context) {
        // 获取电源管理器对象
        PowerManager pm = (PowerManager) context
                .getSystemService(Context.POWER_SERVICE);
        // 获取PowerManager.WakeLock对象,后面的参数|表示同时传入两个值,最后的是调试用的Tag
        PowerManager.WakeLock wl = pm.newWakeLock(
                PowerManager.ACQUIRE_CAUSES_WAKEUP
                        | PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "bright");
        // 点亮屏幕
        wl.acquire();
        // 释放
        wl.release();
        // 得到键盘锁管理器对象
        KeyguardManager km = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
        KeyguardManager.KeyguardLock kl = km.newKeyguardLock("unLock");
        // 解锁
        kl.disableKeyguard();
    }
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页