zoukankan      html  css  js  c++  java
  • Android一键锁屏APP

    题记:

    这个app完全是拾人牙慧,作为练手用的,其实没有什么原创的东西。当然,博客还是我自己写的,记录下来,对自己也算是一种成长吧。

    转载请注明原文地址:

    http://www.cnblogs.com/yanyojun/p/6479686.html

    这篇博客很多部分参看了 http://blog.csdn.net/chencaishengsic/article/details/50765355

    1、一键锁屏功能介绍

     物理按键总是容易损坏的,在Android系统上,大家通常习惯按电源键来锁定屏幕;那有没有像IOS系统上悬浮按钮式的点击下锁定屏幕呢?下面实现这么一个功能。

    上图中,有一个一键锁屏的应用图标,点击下,手机就可以锁定屏幕了。

    2、源码

    先创建一个继承自DeviceAdminReceiver的子类,这个只需要有一个实例就可以了,用来接收静态广播,里面不需要任何的逻辑实现,代码如下:

     1 package com.plbear.qlock;
     2 
     3 import android.app.admin.DeviceAdminReceiver;
     4 
     5 /**
     6  * Created by Yanyongjun on 2017/1/16.
     7  */
     8 
     9 public class AdminManageReceiver extends DeviceAdminReceiver {
    10 }

    先建立一个Activity,在onCreate方法中获取DevicePolicyManager设备管理器实例。如下

     1     @Override
     2     protected void onCreate(Bundle savedInstanceState) {
     3         super.onCreate(savedInstanceState);
     4         mAdminName = new ComponentName(this, AdminManageReceiver.class);
     5         //获取设备管理器
     6         DevicePolicyManager mDPM = (DevicePolicyManager) this.getSystemService(Context.DEVICE_POLICY_SERVICE);
     7         //如果还没有激活设备管理器,则直接进入到设备管理器界面
     8         if (!mDPM.isAdminActive(mAdminName)) {
     9             showAdminManage();
    10         }
    11         //如果已经有了设备管理器的权限,则锁定屏幕
    12         if (mDPM.isAdminActive(mAdminName)) {
    13             mDPM.lockNow();
    14         }
    15         finish();
    16     }

    可以看到上面的Activity其实是非常简单的,并没有什么界面。

    其中,showAdminManage方法这么去实现。

    1     private void showAdminManage() {
    2         Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
    3         intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,mAdminName);
    4         intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,R.string.app_name);
    5         startActivityForResult(intent,-1);
    6     }

    走到这里大部分的业务逻辑已经实现了,但是其实还是不能工作的,有以下几个问题:

    2.1 点击图标之后app出现闪烁下灭屏

    这个app虽然没有前台界面,但是加载的时候还是会闪一下,这个时候需要在AndroidManifest.xml中定义下style就可以了,如下

    1         <activity android:name=".MainActivity"
    2             android:label="@string/app_name"
    3             android:theme="@android:style/Theme.NoDisplay" //将主题设置为NoDisplay之后就可以不闪烁了
    4             android:excludeFromRecents="true"
    5             >

    2.2 设备管理器中怎么之后申请什么权限呢?

     我们可以看到在设备管理器中申请权限的界面如下:

    那设备管理器怎么之后要申请的是“锁屏”呢?

    在AndroidManfiest.xml中这么写

     1         <receiver
     2             android:name=".AdminManageReceiver"
     3             android:label="@string/app_name"
     4             android:permission="android.permission.BIND_DEVICE_ADMIN" >
     5             <meta-data
     6                 android:name="android.app.device_admin"
     7                 android:resource="@xml/device_admin">
     8             </meta-data>
     9             <intent-filter>
    10                 <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
    11             </intent-filter>
    12         </receiver>

    如上面所示,这个静态广播中,定义一个

    <meta-data>

    </meta-data>

    则设备管理器就会根据里面的name字段自动去查找resource字段,其中,device_admin.xml这么写:

    1 <device-admin xmlns:android="http://schemas.android.com/apk/res/android">
    2     <uses-policies>
    3         <force-lock />
    4     </uses-policies>
    5 </device-admin>

    这个地方申明下我需要申请的“锁屏”权限。

    好了,按照上面就可以简单的实现了,源码可以看我的github:

    https://github.com/YanYoJun/QLock

    这里遗留一个有趣的问题,其实meta-data这个字段是很神奇的,后面有时间写一篇文章申请下。

    3、设备管理器的使用

    如果只是上面的内容,那这篇博客实在是乏善可陈,既然用到了设备管理器,那就顺带学习下设备管理器怎么使用吧。

    设备管理器总的介绍见 https://developer.android.google.cn/guide/topics/admin/device-admin.html

    DevicePolicyManager介绍见:https://developer.android.google.cn/reference/android/app/admin/DevicePolicyManager.html

    DeviceAdminreceiver介绍见:https://developer.android.google.cn/reference/android/app/admin/DeviceAdminReceiver.html

    总的来说,设备管理器主要可以来做以下七个方面的事情,为了形象,我们写 一个简单的测试apk来依次实现以下功能:

    3.1 手机密码相关

    3.2 锁屏

    3.3 擦除数据

    3.4 禁止相机使用

    3.5 数据加密存储

    3.6 提高其他app的签名权限

    3.7 其他有用的api

    4、为什么设备管理器会有这么强悍的功能?他是怎么实现的?

    4、github路径

  • 相关阅读:
    bootstrap 模态框日期控件datepicker被遮住问题的解决
    (转)Jetty实战之 安装 运行 部署
    (转)Redis研究(一)—简介
    在jboss上部署web应用
    webSphere
    Weblogic部署项目三种方式
    js构造函数详解
    范仁义js课程---51、作用域实例
    javascript疑难问题---7、使用var和不使用var声明变量的区别
    范仁义js课程---50、函数作用域
  • 原文地址:https://www.cnblogs.com/yanyojun/p/6479686.html
Copyright © 2011-2022 走看看