You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android API21(Lollipop)Java应用:阻止屏幕被点亮方案咨询(新手)

Android API Level 21 防止第三方点亮屏幕的可行方案

针对API Level 21(Lollipop),普通应用要阻止第三方点亮屏幕,唯一合法且有效的方式是借助DevicePolicyManager(设备策略管理器),结合设备管理员权限实现强制锁屏并维持锁定状态。以下是具体实现步骤和说明:

核心思路

之前尝试的方法存在的问题:

  • PowerManager.goToSleep():需要系统级权限(android.permission.DEVICE_POWER),普通应用无法获取,因此过时且不可用。
  • WakeLock:作用是保持设备唤醒,而非阻止唤醒,完全不符合需求,且多数标记在高版本已废弃。
  • XML中的force-lock:单独使用无效,必须配合设备管理员权限才能生效。

DevicePolicyManager是系统提供的用于设备管理的API,普通应用通过激活设备管理员后,可调用其锁屏相关方法,实现强制锁定并阻止第三方唤醒。

具体实现步骤

1. 创建设备管理员接收器

实现一个继承自DeviceAdminReceiver的类,无需重写额外方法,保持默认实现即可:

public class MyDeviceAdminReceiver extends DeviceAdminReceiver {
    // 无需自定义逻辑,使用父类默认实现
}

2. 在Manifest中注册接收器

添加权限并注册上述接收器,同时关联设备管理配置文件:

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

3. 创建设备管理配置文件

在res/xml/目录下创建device_admin.xml,声明所需的设备管理权限:

<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-policies>
        <!-- 允许强制锁屏 -->
        <force-lock />
        <!-- 允许禁用键盘锁特性 -->
        <disable-keyguard-features />
    </uses-policies>
</device-admin>

4. 激活设备管理员并执行锁定逻辑

在Activity中请求用户激活设备管理员权限,激活后设置锁定策略并锁定屏幕:

import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    private DevicePolicyManager mDevicePolicyManager;
    private ComponentName mAdminComponent;
    private static final int REQUEST_CODE_ACTIVATE_ADMIN = 100;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mDevicePolicyManager = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE);
        mAdminComponent = new ComponentName(this, MyDeviceAdminReceiver.class);

        checkAndActivateAdmin();
    }

    private void checkAndActivateAdmin() {
        // 检查是否已激活设备管理员
        if (!mDevicePolicyManager.isAdminActive(mAdminComponent)) {
            // 发起激活请求
            Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
            intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mAdminComponent);
            intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "激活后可防止第三方点亮屏幕");
            startActivityForResult(intent, REQUEST_CODE_ACTIVATE_ADMIN);
        } else {
            // 已激活,设置锁定策略并锁定屏幕
            setupLockPolicy();
            mDevicePolicyManager.lockNow();
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE_ACTIVATE_ADMIN) {
            if (resultCode == RESULT_OK) {
                setupLockPolicy();
                mDevicePolicyManager.lockNow();
                Toast.makeText(this, "设备管理员已激活,屏幕已锁定", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(this, "未激活设备管理员,无法执行锁定操作", Toast.LENGTH_SHORT).show();
            }
        }
    }

    private void setupLockPolicy() {
        // API21及以上,禁用键盘锁的唤醒特性,阻止第三方唤醒屏幕
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            mDevicePolicyManager.setKeyguardDisabledFeatures(
                    mAdminComponent,
                    DevicePolicyManager.KEYGUARD_DISABLE_WAKEUP
            );
        }
        // 设置屏幕休眠后立即锁定,不给第三方唤醒机会
        mDevicePolicyManager.setMaximumTimeToLock(mAdminComponent, 0);
    }
}

关键说明

  • 设备管理员权限:这是核心前提,用户必须手动在系统弹窗中同意激活,普通应用无法绕过此步骤。
  • 锁定策略:setKeyguardDisabledFeatures禁用了键盘锁的唤醒触发,第三方无法通过常规唤醒机制点亮屏幕;setMaximumTimeToLock(0)确保屏幕一休眠就立即锁定,阻断唤醒窗口。
  • 卸载注意:激活设备管理员后,需先在系统设置的「安全」-「设备管理员」中取消该应用的权限,才能正常卸载。

内容的提问来源于stack exchange,提问作者Etan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 11:28:20