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); } }
配置步骤
- 在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>
- 创建
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" />
- 在
strings.xml中添加辅助服务描述:
<string name="accessibility_desc">重启后自动锁屏,无需手动按电源键</string>
该方案无需Root,但需要用户提前在系统设置中开启应用的辅助功能,批量部署时可预先配置。
3. 优化重启触发时机
如果设备默认有合理的熄屏超时设置,可将重启任务安排在设备闲置时段(比如深夜),重启后系统会在超时后自动熄屏。这种方式无需额外代码,但稳定性依赖系统默认设置,适合对熄屏及时性要求不高的场景。
内容的提问来源于stack exchange,提问作者A.N.D.Y
相关产品推荐
相关产品推荐

