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路径

原文地址:https://www.cnblogs.com/yanyojun/p/6479686.html