题记:
这个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路径