最近做的电子班牌需要早上7点开启,晚上8点关闭的功能,之前倒是没有接触过这类的东西,所以早上研究了一上午,赶紧记录下来
第一步:先申请权限
<!-- 屏幕唤醒 --> <uses-permission android:name="android.permission.WAKE_LOCK" /> <!-- 屏幕熄灭 --> <uses-permission android:name="android.permission.DEVICE_POWER" />
第二步:注册监听,为了激活设备管理器
<receiver android:name="com.test.service.ScreenOffAdminReceiver" android:permission="android.permission.BIND_DEVICE_ADMIN"> <meta-data android:name="android.app.device_admin" android:resource="@xml/device_admin" /> <intent-filter> <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> </intent-filter> </receiver>
其中的values/xml文件如下所示:
<device-admin xmlns:android="http://schemas.android.com/apk/res/android"> <uses-policies> <limit-password /> <reset-password /> <force-lock /> </uses-policies> </device-admin>
监听的类:
public class ScreenOffAdminReceiver extends DeviceAdminReceiver { private void showToast(Context context, String msg) { Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); } @Override public void onEnabled(Context context, Intent intent) { showToast(context, "设备管理器激活成功"); } @Override public void onDisabled(Context context, Intent intent) { showToast(context, "设备管理器激活失败"); } }
第三步:进入程序启动设备管理器激活
/** * @param view 检测并去激活设备管理器权限 */ public void checkAndTurnOnDeviceManager(View view) { Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName); intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "开启后就可以使用锁屏功能了..."); startActivityForResult(intent, 0); }
在此之前,要在程序先初始化几个对象:
componentName = new ComponentName(this, ScreenOffAdminReceiver.class); mPowerManager = (PowerManager) getSystemService(POWER_SERVICE); policyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
这样用DevicePolicyManager去锁屏,用PowerManager去亮屏,用componentName去设置设备管理器权限
第四步:调用亮屏或者锁屏方法
/** * @param view 亮屏 */ public void checkScreenOn(View view) { mWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "tag"); mWakeLock.acquire(); mWakeLock.release(); } /** * @param view 熄屏 */ public void checkScreenOff(View view) { boolean admin = policyManager.isAdminActive(componentName); if (admin) { policyManager.lockNow(); } else { Toast.makeText(this, "没有设备管理权限", Toast.LENGTH_SHORT).show(); } handler.postDelayed(new Runnable() { @Override public void run() { checkScreenOn(null); } }, 10 * 1000); }
大概就是这样,今天也是刚实现,具体里面还是有点不太明白,记录一下,感谢这位大神,https://blog.csdn.net/u014614038/article/details/80430764