利用DevicePolicyManager执行屏幕锁定

PowerManager的使用

在Android 6.0以下,系统的休眠和唤醒我们可以调用PowerManager.goToSleep()和PowerManager.wakeUp()。

需要的权限:Android.permission.DEVICE_POWER。

但是在Android 6.0之后你会发现调用不到PowerManager.goToSleep()方法,即使你跳到PowerManager这个类下面且找到 goToSleep方法,但在程序中就是报错不能使用。这个时候我们就可以使用第三方应用实现休眠,用DevicePolicyManager的lockNow()即可。


下面我们来看一下具体如何操作。 要让自己的应用实现该屏幕锁定,主要需要用到以下几个类:

DevicePolicyManager

这是设备管理的主类。通过它可以实现屏幕锁定、屏幕亮度调节、出厂设置等功能。

DeviceAdminReceiver

该类继承自 BroadcastReceiver 。从源码可以看到,其实就是实现了一个OnReceive方法,该方法中根据不同的Action,执行相应的操作。 

比如,如果激活成功,那么Action就是ACTION_DEVICE_ADMIN_ENABLED, 据此调用 onEnabled 方法。
 

 DeviceAdminInfo

定义设备管理类的 meta 信息。 什么意思呢? 就是定义可用的权限。define policy that this device admin can use。
比如 DeviceAdminReceiver.USES_POLICY_FORCE_LOCK , 这个就是本次要用的"强制锁定屏幕"的权限. 不过这些权限一般都直接通过XML文件来定义。 稍后你就会看到。


下面我们就来看下如何实现屏幕锁定。


1. "激活" 功能。

初始化设备管理需要的几个类:
//获取设备管理服务  
policyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);  
//AdminReceiver 继承自 DeviceAdminReceiver  
componentName = new ComponentName(this, AdminReceiver.class); 

其中: AdminReceiver 类的代码如下:

package com.yfz.broadcast;  
import com.yfz.log.Logger;  
import android.app.admin.DeviceAdminInfo;  
import android.app.admin.DeviceAdminReceiver;  
import android.app.admin.DevicePolicyManager;  
import android.content.ComponentName;  
import android.content.Context;  
import android.content.Intent;  
import android.content.pm.ResolveInfo;  
import android.os.IBinder;  
import android.widget.Toast;  
public class AdminReceiver extends DeviceAdminReceiver {  
    @Override  
    public DevicePolicyManager getManager(Context context) {  
        Logger.d("------" + "getManager" + "------");  
        return super.getManager(context);  
    }  
    @Override  
    public ComponentName getWho(Context context) {  
        Logger.d("------" + "getWho" + "------");  
        return super.getWho(context);  
    }  
      
    /** 
     * 禁用 
     */  
    @Override  
    public void onDisabled(Context context, Intent intent) {  
        Logger.d("------" + "onDisabled" + "------");  
          
        Toast.makeText(context, "禁用设备管理", Toast.LENGTH_SHORT).show();  
          
        super.onDisabled(context, intent);  
    }  
    @Override  
    public CharSequence onDisableRequested(Context context, Intent intent) {  
        Logger.d("------" + "onDisableRequested" + "------");  
        return super.onDisableRequested(context, intent);  
    }  
      
    /** 
     * 激活 
     */  
    @Override  
    public void onEnabled(Context context, Intent intent) {  
        Logger.d("------" + "onEnabled" + "------");  
          
        Toast.makeText(context, "启动设备管理", Toast.LENGTH_SHORT).show();  
          
        super.onEnabled(context, intent);  
    }  
    @Override  
    public void onPasswordChanged(Context context, Intent intent) {  
        Logger.d("------" + "onPasswordChanged" + "------");  
        super.onPasswordChanged(context, intent);  
    }  
    @Override  
    public void onPasswordFailed(Context context, Intent intent) {  
        Logger.d("------" + "onPasswordFailed" + "------");  
        super.onPasswordFailed(context, intent);  
    }  
    @Override  
    public void onPasswordSucceeded(Context context, Intent intent) {  
        Logger.d("------" + "onPasswordSucceeded" + "------");  
        super.onPasswordSucceeded(context, intent);  
    }  
    @Override  
    public void onReceive(Context context, Intent intent) {  
        Logger.d("------" + "onReceive" + "------");  
          
        super.onReceive(context, intent);  
    }  
    @Override  
    public IBinder peekService(Context myContext, Intent service) {  
        Logger.d("------" + "peekService" + "------");  
        return super.peekService(myContext, service);  
    }  
      
}

继承了DeviceAdminReceiver,没有做什么特别操作,仅仅在启动、禁用时输出一个提示消息。
同时,像普通Broadcast类一样,该类也需要在  AndroidManifest.xml 文件中注册。

<!-- 设备管理 -->  
<receiver android:name=".broadcast.AdminReceiver"  
    android:label="@string/device"  
    android:description="@string/device_des"  
    android:permission="android.permission.BIND_DEVICE_ADMIN">  
    <meta-data android:name="android.app.device_admin"  
        android:resource="@xml/lock_screen" />  
    <intent-filter>  
        <action  
            android:name="android.app.action.DEVICE_ADMIN_ENABLED" />  
    </intent-filter>  
</receiver>
android:resource="@xml/lock_screen" 对应的就是权限说明文件。
本次仅需要强制锁定权限。 如下:
<?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> 
"激活"按钮 执行代码:
/** 
 * 激活设备管理权限 
 * 成功执行激活时,DeviceAdminReceiver中的 onEnabled 会响应 
 */  
private void activeManage() {  
    // 启动设备管理(隐式Intent) - 在AndroidManifest.xml中设定相应过滤器  
    Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);  
      
    //权限列表  
       intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName);  
         
       //描述(additional explanation)  
       intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "------ 其他描述 ------");  
         
       startActivityForResult(intent, 0);  
} 
这边就是用了一个隐式Intent ,通过这个Intent (DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN)跳转到 权限提醒页面。 同时传递了两个参数EXTRA_DEVICE_ADMIN 、 EXTRA_ADD_EXPLANATION。
EXTRA_DEVICE_ADMIN参数中说明了用到哪些权限, EXTRA_ADD_EXPLANATION参数为附加的说明。

 点击"激活"。
此时该应用就拥有了设备管理权限。 激活时 AdminReceiver 类的  onEnabled方法会被调用。

2. “禁用” 功能。

    如果在上面选择了"激活", 那么你这个应用就可以一直使用这些权限了,不需要再次激活。 但是如果想"禁用",该怎么做呢?答案很简单,只要调用下面的方法即可.
/** 
 * 禁用设备管理权限 
 * 成功执行禁用时,DeviceAdminReceiver中的 onDisabled 会响应 
 */  
private void unActiveManage() {  
    Logger.d("------ unActiveManage ------");  
    boolean active = policyManager.isAdminActive(componentName);  
       if (active) {  
        policyManager.removeActiveAdmin(componentName);  
       }  
}
禁用时 AdminReceiver 类的  onDisabled方法会被调用。

3. “系统锁”

其实到这已经非常简单了,所有的配置及初始化,都在激活时做了。下面直接上调用系统锁的代码:
boolean active = policyManager.isAdminActive(componentName);  
if (active) {  
    policyManager.lockNow();  
} 

到此为止, 屏幕锁定结束了。



  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你想要在应用中调用 `devicePolicyManager.setProfileOwner()` 方法设置设备所有者,你需要满足以下条件: 1. 你的应用必须被系统签名。 2. 你的应用必须是设备上的第一个已安装的应用。也就是说,如果设备上已经有其他应用被设置为设备所有者,你的应用就无法再次设置设备所有者。 3. 你的应用必须在设备的出厂设置中被预装。如果你的应用是用户手动安装的,那么你就无法设置设备所有者。 如果你的应用满足以上条件,但是仍然无法调用 `devicePolicyManager.setProfileOwner()` 方法,可能是因为你的应用没有获得正确的权限。你需要在你的应用的 `AndroidManifest.xml` 文件中添加以下权限声明: ```xml <uses-permission android:name="android.permission.BIND_DEVICE_ADMIN" /> <uses-permission android:name="android.permission.MANAGE_DEVICE_ADMINS" /> ``` 如果你的应用已经声明了这些权限,但是仍然无法调用 `devicePolicyManager.setProfileOwner()` 方法,可能是因为你的应用没有获得正确的签名认证。你需要确保你的应用已经被正确地签名,并且签名的证书和系统签名的证书是相同的。 如果你的应用仍然无法调用 `devicePolicyManager.setProfileOwner()` 方法,你可以尝试使用 `adb shell dpm set-device-owner` 命令来设置设备所有者。这个命令需要在设备的终端中执行,需要使用 root 权限。如果你需要在应用中执行这个命令,可以使用 `Runtime.getRuntime().exec()` 方法来执行命令。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值