以编程方式锁定或关闭屏幕

Posted

技术标签:

【中文标题】以编程方式锁定或关闭屏幕【英文标题】:Lock or turn off the screen programmatically 【发布时间】:2017-11-24 13:55:35 【问题描述】:

我想以编程方式关闭 / 锁定屏幕

目前,当我尝试时:

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

我有这个错误:

java.lang.SecurityException: 策略 #3 的 uid 10176 没有活动管理员

这是我的 androidManifest.xml :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="opteamit.com.belami" >

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-feature android:name="android.hardware.location.gps" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

    <application...

怎么了?

【问题讨论】:

显示你的 manifist.xml。 完成!您只想查看权限吗? 【参考方案1】:

好吧,两行代码无法完成具有高度必要性的事情,需要锁定屏幕device admin。你可以关注这个:

private void lock() 
    PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
    if (pm.isScreenOn()) 
        DevicePolicyManager policy = (DevicePolicyManager)
                getSystemService(Context.DEVICE_POLICY_SERVICE);
        try 
            policy.lockNow();
         catch (SecurityException ex) 
            Toast.makeText(
                    this, 
                    "must enable device administrator",
                    Toast.LENGTH_LONG).show();
                ComponentName admin = new ComponentName(context, AdminReceiver.class);
                Intent intent = new Intent(
                    DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN).putExtra(
                        DevicePolicyManager.EXTRA_DEVICE_ADMIN, admin);
                context.startActivity(intent);
                   
    

AdminReceiverClass

public class AdminReceiver extends DeviceAdminReceiver 
    public static final String ACTION_DISABLED = "device_admin_action_disabled";
    public static final String ACTION_ENABLED = "device_admin_action_enabled";

    @Override
    public void onDisabled(Context context, Intent intent) 
        super.onDisabled(context, intent);
        LocalBroadcastManager.getInstance(context).sendBroadcast(
            new Intent(ACTION_DISABLED));
    
    @Override
    public void onEnabled(Context context, Intent intent) 
        super.onEnabled(context, intent);
        LocalBroadcastManager.getInstance(context).sendBroadcast(
            new Intent(ACTION_ENABLED));
    

我们还需要声明元数据中使用的安全策略,例如 Path android:resource="@xml/device_admin_sample" :

 <device-admin xmlns:android="http://schemas.android.com/apk/res/android">
  <uses-policies>
    <limit-password />
    <watch-login />
    <reset-password />
    <force-lock />
    <wipe-data />
    <expire-password />
    <encrypted-storage />
    <disable-camera />
  </uses-policies>
</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>`

现在在我们的 manifist.xml 中声明它:

<receiver
        android:name=".AdminReceiver"
        android:label="@string/device_admin"
        android:description="@string/device_admin_description"
        android:permission="android.permission.BIND_DEVICE_ADMIN">
        <meta-data
            android:name="android.app.device_admin"
            android:resource="@xml/device_admin_sample" />
        <intent-filter>
            <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
        </intent-filter>
    </receiver>`

希望对你有所帮助。

【讨论】:

谢谢,但我有 android.util.AndroidRuntimeException:从 Activity 上下文外部调用 startActivity() 需要 FLAG_ACTIVITY_NEW_TASK 标志。这真的是你想要的吗?(我在Service @Jéwôm' 新例外是什么?什么时候发生的? 它发生在 startActivity(intent) 行 @Jéwôm' 只需通过构造函数缓存 Context 对象,并在开始活动之前使用此行intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); @Jéwôm' 关注this

以上是关于以编程方式锁定或关闭屏幕的主要内容,如果未能解决你的问题,请参考以下文章

我如何以编程方式锁定手机android

iPhone 上的屏幕关闭事件或属性

在android上以编程方式打开/关闭大写锁定和shift键

以编程方式关闭 Amazon Fire TV 屏幕保护程序

使 iPad 屏幕关闭,但通过触摸唤醒(无锁定) - - iOS 6.0 / openFrameworks

屏幕关闭时如何在 UIPageViewController 中以编程方式翻页?