关于Android设备管理器的一些操作以及权限开启

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/w815878564/article/details/81519200

做这个的目的简要的说一下,因为我们的设备长期暴露在阳光之下,长时间的运行导致设备温度过高从而导致设备停止运行。因此我们做了一个温度传感器,当温度高于阈值的时候,通过关闭屏幕来进行降温。至于为什么不直接关机,这里主要是为了后台监控方便。
那么,怎么关闭屏幕呢?谷歌为我们提供了一个叫DevicePolicyManager的服务,我们可以通过这个服务来实现屏幕的关闭。
当然首先我们需要配置一些东西,权限申请肯定是必要的

    <uses-permission android:name="android.permission.DEVICE_POWER" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
    <uses-permission android:name="android.permission.USES_POLICY_FORCE_LOCK" />

其次我们需要创建一个静态广播,并且注册

    <receiver android:name=".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>

上面的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>

其实这里还可以添加其他许多权限,不过我们这里就免了
以上配置完成以后,我们就可以调用关屏代码了

DevicePolicyManager mDPM = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
mDPM.lockNow();

不过运行代码以后发现,我们并不能关闭屏幕,这是为什么呢?因为我们还需要打开应用的设备管理权限。这个选项一般在系统设置的安全选项的设备管理器中,需要在那里将我们的应用进行勾选,这样我们就能顺利关屏了。当然想唤醒屏幕也是很容易的,代码如下:

PowerManager mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock mWakeLock = mPowerManager
                    .newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "tag");
mWakeLock.acquire();
mWakeLock.release();

当然,如果你的应用像我的一样 是系统应用的话,我们还可以直接调用相关代码来直接打开设备管理权限,代码如下

ComponentName componentName = new ComponentName("包名","静态广播类名(全称,包含包名路径)");
try {
     DevicePolicyManager mDPM = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
     Method setActiveAdmin = mDPM.getClass().getDeclaredMethod("setActiveAdmin", ComponentName.class, boolean.class);
     setActiveAdmin.setAccessible(true);
     setActiveAdmin.invoke(mDPM, componentName, true);
    } catch (Exception e) {
    }

注意,这里我们使用反射的原因是DevicePolicyManager的setActiveAdmin方法属于hide api,因此我们只好采取反射调用(如果你的操作系统是Android9.0,反射调用系统API将无法顺利执行,不过暂时不清楚该机制是否对系统应用生效,当然绕开的方式也有很多,尤其是对于这类public 但是又是hide的api)

猜你喜欢

转载自blog.csdn.net/w815878564/article/details/81519200