在最近的开发中,需要用到息屏和亮屏的操作,应用距离传感器感应到有人靠近时息屏防止误触,人离开时亮屏。这时候需要用到PowerManager和DevicePolicyManager类。使用PowerManager类进行屏幕在息屏状态下的唤醒,使用DevicePolicyManager类进行强制息屏。和各种Manager类相似,两个类获取实例的方式相同,通过以下方法就可以获取:
PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
DevicePolicyManager dm = (DevicePolicyManager)getSystem(Context.DEVICE_POLICY_SERVICE);
DevicePolicyManager类是在android.app.admin目录下
PowerManager类是在android.os目录下
息屏操作:
使用DevicePolicyManager类进行息屏操作是调用DevicePolicyManager.lockNow()方法,调用该方法很重要的一个前提是要创建一个类继承DeviceAdminReceiver,该类可以不做任何操作,但是必须要有,这个类继承了一个广播接收类,所以需要在AndroidManifest文件里面定义,具体如下:
<receiver
android:name="xxx(类的名)"
android:label="@string/xxx"
android:permission="android.permission.BIND_DEVICE_ADMIN" >
<meta-data
android:name="android.app.device_admin"
此时在xml文件夹下的xml文件配置如下:
<?xml version="1.0" encoding="utf-8"?>
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 指定设备超级管理员的权限,以下任选,可多选 -->
<uses-policies>
<disable-camera /> <!-- 停用相机 -->
<disable-keyguard-features /> <!-- 停用屏幕锁定的部分功能 -->
<encrypted-storage /> <!-- 设置存储设备加密 -->
<expire-password /> <!-- 设置锁屏密码的有效性 -->
<set-global-proxy /> <!-- 设置设备全局代理 -->
<watch-login /> <!-- 监视屏幕解锁尝试次数-->
<limit-password /> <!-- 设置密码规则 -->
<reset-password /> <!-- 更改锁屏密码 -->
<force-lock /> <!-- 锁定屏幕 -->
<wipe-data /> <!-- 清除所有数据,恢复出厂设置 -->
</uses-policies>
</device-admin>
然后实现权限的检查,假设我的继承DeviceAdminReceiver的类名为MyAdminReceiver,主类为MainActivity,则操作如下:
ComponentName componentName = new CompnentName(MainActivity.this, MyAdminReceiver.class);
boolean isAdmin = devicePolicyManager.isAdminActivity(componetName);
此时返回的布尔值isAdmin若为true,则设备管理器已经激活,若为false,则未激活。可以手动跳转到激活界面,操作如下:
Intnet intent = new Intent();
intent.setAction(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, compnentName);
startActivity(intent);
若激活,息屏操作如下:
devicePolicyManager.lockNow();
如此,息屏操作完成。
亮屏操作:
PowerManager.WakeLock wl = powermanager.newWakeLock(PowerManager.ACQUIRE_CAUSE_WAKEUP | PowerManager.SCREEN_BRIGHT_WAKE_LOCK ,"TAG");
//锁定屏幕长期唤醒
wl.acquire();
//若不调用以下函数,则屏幕常亮;可以选择在定时器后调用,实现定时接触锁定的操作
wl.release();
在获取wl实例时,调用PowerManager.newWakeLock(int levelAndFlags, String tag)函数其中参数levelAndFlags指定使用逻辑或操作符组合的唤醒锁级别和可选标志。
唤醒锁定级别为:PARTIAL_WAKE_LOCK、FULL_WAKE_LOCK、SCREEN_DIM_WAKE_LOCK和SCREEN_BRIGHT_WAKE_LOCK。必须将一个唤醒锁级别指定为levelAndFlags参数的一部分。
唤醒锁标志是:ACQUIRE_CAUSES_WAKEUP和ON_AFTER_RELEASE。可以将多个标志组合为级别和标志参数的一部分。
需要权限:
<uses-permission android:name="android.permission.WAKE_LOCK" />