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

Android 6.0.1设备重启后自动熄屏方案求助(无Root)

问题描述

我开发了一款基于JobService的应用,通过代码调用ADB命令实现设备每周自动重启,这部分功能正常。这些设备是长期通电的导航设备,导航应用运行数周后会卡顿,因此需要定期重启。

当前遇到的问题:设备重启后屏幕持续常亮,被其他应用持有唤醒锁,只能手动按电源键熄屏。设备系统为Android 6.0.1,因设备数量多,需要实现重启后自动熄屏的自动化流程。

我已尝试以下方案但均未成功:

  • 代码内调用ADB命令:input keyevent 26(设备端无法执行ADB命令,仅电脑端可用)
  • 代码内调用ADB命令:sendevent /dev/input/event0 1 116 0(设备端无权限执行)
  • 非ADB方案:
    mWakeLock = mPowerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "tag");
    mWakeLock.acquire();
    
    (依赖距离传感器,且无法强制覆盖其他应用的唤醒锁)
    DevicePolicyManager manager = ((DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE));
    manager.lockNow();
    
    (未配置设备管理员权限,调用无效)

调整屏幕亮度或添加黑色浮层的方案不切实际,设备无Root权限。


可行解决方案

针对Android 6.0.1、无Root权限的场景,以下方案可尝试实现重启后自动熄屏:

1. 修改系统屏幕超时设置

在重启完成触发的JobService任务中,临时将屏幕超时设置为最小值,让系统自动触发熄屏,之后再恢复原设置:

代码实现

PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
// 申请临时唤醒锁,确保代码执行过程中设备不进入休眠
PowerManager.WakeLock tempWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Restart:TempWakeLock");
tempWakeLock.acquire(10000); // 最多持有10秒,避免意外长期持有

ContentResolver resolver = getContentResolver();
// 保存原屏幕超时设置
int originalTimeout = Settings.System.getInt(resolver, Settings.System.SCREEN_OFF_TIMEOUT, 30000);

// 设置屏幕超时为最小值(多数设备支持15秒,即15000ms)
Settings.System.putInt(resolver, Settings.System.SCREEN_OFF_TIMEOUT, 15000);

// 释放唤醒锁,让系统按新设置自动熄屏
if (tempWakeLock.isHeld()) {
    tempWakeLock.release();
}

// 延迟恢复原超时设置(可选,根据需求调整延迟时间)
new Handler(Looper.getMainLooper()).postDelayed(() -> {
    try {
        Settings.System.putInt(resolver, Settings.System.SCREEN_OFF_TIMEOUT, originalTimeout);
    } catch (Exception e) {
        e.printStackTrace();
    }
}, 20000);

权限要求

需要在Manifest中添加:

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

Android 6.0+中,该权限需用户手动在系统设置的「应用权限」→「修改系统设置」中开启,首次启动时可引导用户完成配置。

2. 利用辅助功能模拟锁屏

创建辅助服务,监听系统启动完成后的界面变化,调用系统锁屏动作:

辅助服务代码

public class AutoLockService extends AccessibilityService {
    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        // 监听窗口状态变化,检测到主界面后触发锁屏
        if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
            performGlobalAction(GLOBAL_ACTION_LOCK_SCREEN);
            // 完成后停止服务,减少资源占用
            stopSelf();
        }
    }

    @Override
    public void onInterrupt() {}

    @Override
    protected void onServiceConnected() {
        super.onServiceConnected();
        AccessibilityServiceInfo info = new AccessibilityServiceInfo();
        info.eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED;
        info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
        setServiceInfo(info);
    }
}

配置步骤

  1. 在Manifest中注册服务:
<service
    android:name=".AutoLockService"
    android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
    <intent-filter>
        <action android:name="android.accessibilityservice.AccessibilityService" />
    </intent-filter>
    <meta-data
        android:name="android.accessibilityservice"
        android:resource="@xml/accessibility_config" />
</service>
  1. 创建res/xml/accessibility_config.xml:
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeWindowStateChanged"
    android:accessibilityFeedbackType="feedbackGeneric"
    android:accessibilityFlags="flagDefault"
    android:description="@string/accessibility_desc" />
  1. 在strings.xml中添加辅助服务描述:
<string name="accessibility_desc">重启后自动锁屏,无需手动按电源键</string>

该方案无需Root,但需要用户提前在系统设置中开启应用的辅助功能,批量部署时可预先配置。

3. 优化重启触发时机

如果设备默认有合理的熄屏超时设置,可将重启任务安排在设备闲置时段(比如深夜),重启后系统会在超时后自动熄屏。这种方式无需额外代码,但稳定性依赖系统默认设置,适合对熄屏及时性要求不高的场景。


内容的提问来源于stack exchange,提问作者A.N.D.Y

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:45:15