Android息屏与亮屏

最近的项目要求apk能在空闲一会后让屏幕熄灭,检测到有用户到来(距离传感器触发)后点亮屏幕。百度了一大堆发现很多都不靠谱,google了一会才勉强找到一种能满足需求的方法,说勉强是因为这种方法需要到系统设置中给该app设备管理的权限,这使得熄屏与亮屏这样看似简单的功能显得繁琐了起来。
废话不多说,实现起来还是蛮简单的,源码可在github上直接下载:
AndroidScreenOnAndOff

息屏:

    private void screenOff(){
        DevicePolicyManager policyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
        ComponentName adminReceiver = new ComponentName(AppIdleActivity.this, ScreenOffAdminReceiver.class);
        boolean admin = policyManager.isAdminActive(adminReceiver);
        if (admin) {
            isScreenOn = false;
            policyManager.lockNow();
        } else {
            Toast.makeText(this,"没有设备管理权限",
                    Toast.LENGTH_LONG).show();
        }
    }

息屏主要使用的是DevicePolicyManager 类,此外ScreenOffAdminReceiver是一个息屏管理的广播接收器,该接受器非常重要,系统设置中正是通过该接收器才找到的应用程序,该广播接收器在AndroidManifest.xml中的声明如下:

        <receiver
            android:name=".ui.ScreenOffAdminReceiver"
            android:label="@string/app_name"
            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>

resource只想xml目录下的device_admin文件,改文件如下:

<?xml version="1.0" encoding="utf-8"?>
<device-admin xmlns:android="http://schemas.android.com/apk/res/android" >

    <uses-policies>

        <force-lock />
    </uses-policies>

</device-admin>

ScreenOffAdminReceiver如下:

/**
 * Receiver class which shows notifications when the Device Administrator status
 * of the application changes.
 */
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,
                "设备管理器没有使能");
    }

}

这些都按照套路来就好,做完这几步后,就能在系统设置-》安全-》设备管理器下看到你的app了,勾选后面的checkbox,使能它就能实现息屏了,当然了,你还需要这个权限:

 <uses-permission android:name="android.permission.USES_POLICY_FORCE_LOCK" />

设置界面如下:
安全
这里写图片描述
设备管理器
这里写图片描述

亮屏

    public void screenOn() {
        // turn on screen
        PowerManager mPowerManager = (PowerManager) getSystemService(POWER_SERVICE);
        PowerManager.WakeLock mWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "tag");
        mWakeLock.acquire();
        mWakeLock.release();
        isScreenOn = true;
        handler.sendEmptyMessageDelayed(MESSAGE_SCREEN_OFF,1000);
    }

亮屏需要的权限:

 <uses-permission android:name="android.permission.WAKE_LOCK" />

很多博客上说mWakeLock.acquire()可以亮屏,mWakeLock.release()就可以息屏,但实际测试中发现无效acquire确实可以亮屏,但是releasea却不能息屏。但是acquire亮屏也是有限制的,当系统没有休眠的情况下是可以点亮的,一旦系统进入休眠状态,则无效。

源码github地址:
AndroidScreenOnAndOff

猜你喜欢

转载自blog.csdn.net/u011913612/article/details/77822280