Android一键关闭手机屏幕

一、概述

最近从应用市场下载了一款关闭手机屏幕的软件,这款软件很好的实现了关闭手机屏幕的功能,然而也加入了其他如连网,定位,
安装包大小竟然到了3M,所以想动手自己写一个简单纯净的关屏软件。

二、开发

创建好新工程后,想到android应该有相关API,应该要用户授权之类的,然后结合从网上找到的资料和自己的总结,完成了开发。

1.首先,用户授权不是声明权限,而是激活自己的软件的锁屏功能,android把这个激活封装了一个activity,我们声明一个隐式意图跳到这个activity即可。而这个隐式意图是DeviceAdminReceiver这个广播的类对象,我们只需要创建一个广播继承即可,如下

package com.lzy.lockscreen;

import android.app.admin.DeviceAdminReceiver;

public class MyDeviceAdminReceiver extends DeviceAdminReceiver {
}

2.类中不需要任何代码,在Manifest文件中,声明如下

<receiver android:name=".MyDeviceAdminReceiver">
    <meta-data
        android:name="android.app.device_admin"
        android:resource="@xml/my_admin" />
    <intent-filter>
       <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
    </intent-filter>
</receiver>

3.这里指定了一个xml文件my_admin,它的作用就是去列出自己需要激活的权限

<?xml version="1.0" encoding="utf-8"?>
<device-admin>
    <uses-policies> 
        <force-lock />
    </uses-policies>
</device-admin>

这里的force-lock就是关闭手机屏幕,还有这些激活,有兴趣的可以试一下,

limit-password 设置密码的规则
watch-login 监控屏幕解锁尝试次数
reset-password 更改屏幕解锁密码
force-lock 设备锁屏
wipe-data 删除全部的数据

4.然后就是写主activity的逻辑了,贴出代码吧

package com.lzy.lockscreen;

import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    DevicePolicyManager policyManager;
    ComponentName componentName;
    private TextView mTV;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTV = ((TextView) findViewById(R.id.tv));
        mTV.setOnClickListener(this);
        policyManager = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE);
        componentName = new ComponentName(this, MyDeviceAdminReceiver.class);
        if (!policyManager.isAdminActive(componentName)) {
            goSetActivity();
        } else {
            systemLock();
        }
    }

    private void goSetActivity() {
        Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
        intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName);
        startActivityForResult(intent, 1);
    }

    /**
     * 锁屏并关闭屏幕
     */
    private void systemLock() {
        if (policyManager.isAdminActive(componentName)) {
            Window localWindow = getWindow();
            WindowManager.LayoutParams localLayoutParams = localWindow.getAttributes();
            localLayoutParams.screenBrightness = 0.05F;
            localWindow.setAttributes(localLayoutParams);
            policyManager.lockNow();
        }
        finish();
    }

    @Override
    public void onClick(View view) {
        if (view == mTV) {
            goSetActivity();
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (1 == requestCode) {
            if (RESULT_OK == resultCode) {
                systemLock();
            } else if (RESULT_CANCELED == resultCode) {
                //用户拒绝激活
            }
        }
    }

}

大家可以看到仅仅60多行代码即可实现功能,有激活成功和失败的回调,交互友好,相信大家一看就明白,代码已经上传到github,地址:https://github.com/lzyang187/LockScreen

5.thks ,have a good time!

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值