实现一键关屏功能

实现一键关闭屏幕的功能,需要获得系统服务DevicePolicyManager mDevicePolicyManager=(DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);

通过这个DevicePolicyManager类,能够实现关闭屏幕功能,但需要获得设备管理权限。

关键代码如下:

        mDevicePolicyManager=(DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);
        componentName=new ComponentName(this,yy.class);
        if(!mDevicePolicyManager.isAdminActive(componentName)){
            Intent intent=new Intent();
            intent.setAction(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
            intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,componentName);
            startActivityForResult(intent,1);

        }else{
            mDevicePolicyManager.lockNow();
            finish();
        }
通过ComponentName来定义一个组件:

public class yy extends DeviceAdminReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

    }
}
DeviceAdminReceiver又是什么呢?官方API解释的是“用于实现设备管理组件的基类”。

public class DeviceAdminReceiver 
extends BroadcastReceiver 

java.lang.Object
   ↳ android.content.BroadcastReceiver
     ↳ android.app.admin.DeviceAdminReceiver

可以看出实则是一个特殊的广播接收器(BroadcastReceiver),换句话说,只有注册了这个广播接收器,且使得这个广播接收器组件获得设备管理的权限,才有权利用DevicePolicyManager去管理设备。于是在Manifest文件中注册该广播接收器:

        <receiver
            android:name=".yy"
            android:enabled="true"
            android:exported="true"
            android:permission="android.permission.BIND_DEVICE_ADMIN">  //必须声明的权限
            <meta-data
                android:name="android.app.device_admin"
                android:resource="@xml/policy"/>
            <intent-filter>
               <action android:name="android.app.action.DEVICE_ADMIN_ENABLED"/>
            </intent-filter>

        </receiver>
上面代码的<meta-data>是通过指定的xml文件,把你所需要申请的设备管理权限告知给设备管理器。而这个特定的xml文件(/res/xml/policy.xml)类似于下面的代码:

<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-policies>
        <limit-password />
        <watch-login />
        <reset-password />
        <force-lock />     <!--仅需该权限就能实现一键关屏-->
        <wipe-data />
        <expire-password />
        <encrypted-storage />
        <disable-camera />
        <disable-keyguard-features />
    </uses-policies>
</device-admin>

设备管理器是如何读取到你需要的<force-lock /> ?通过获得PackageItemInfo的子类ActivityInfo的类对象,该类对象中有一个Bundle字段metaData,该字段保存有相应组件的<meta-data>信息。获取组件的<meta-data>示例:

ActivityInfo ai=getPackageManager().getActivityInfo(new ComponentName(MainActivity.this,MainActivity.class), PackageManager.GET_META_DATA);
                   String name=ai.metaData.getString("这里是<meta-data>name属性对应的值");
注册好广播接收器后,需要申请设备管理权限啦,隐式Intent打开设备管理器注册活动:
            Intent intent=new Intent();
            intent.setAction(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
            intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,componentName);
            startActivityForResult(intent,1);

激活为device administrator后,调用mDevicePolicyManager.lockNow( )关闭屏幕。

总结:首先注册一个继承DeviceAdminReceiver的广播接收器,并在该广播接收器的<meta-data>中指定需要的设备管理权限。在Activity中判断该广播接收器组件是否具有权限,若没有则进行注册,若有则直接关闭屏幕并finish。


demo地址:https://github.com/zycoJamie/PutoutS


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值