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!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章