Как отключить экран или отправить устройство в спящий режим

Я хочу, чтобы отправить устройство в спящий режим или выключить экран. Я исследовал и нашел эту тему: выключить экран на Android

в основном, это три способа сделать это, но я нашел проблемы для трех:

а) выбор 1:

PowerManager manager = (PowerManager) getSystemService(Context.POWER_SERVICE);
manager.goToSleep(int amountOfTime);

: это вызывает FC. Я прочитал, что мне нужно DEVICE_POWER разрешения, но он не может быть предоставлен для нормальных приложений.

б) выбор 2:

PowerManager manager = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = manager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Your Tag");
wl.acquire();
wl.release();

: это не работает для меня. Не знаю почему. Это не дает мне FC, но это безобидно.

c) выбор 3:

WindowManager.LayoutParams params = getWindow().getAttributes();
params.flags |= LayoutParams.FLAG_KEEP_SCREEN_ON;
params.screenBrightness = 0;
getWindow().setAttributes(params);

: я могу заставить его работать, но при попытке включить устройство он делает странные вещи, например, не любит возвращаться, или если мои приложения впереди, автоматически засыпает сразу после нажатия кнопки. Это больше похоже на совет или обходной путь, чем обычно решение.

может ли кто-нибудь сказать мне хороший способ отправить устройство в спящий режим или выключить экран, который может работать без проблем? Мне кажется редким, что такая простая функциональность не имеет хорошего способа ее использовать (или, по крайней мере, хорошо документирована)

2 ответов


отвечаю я сам себе. Можно отключить устройство, но приложение должно реализовать функцию администратора устройства через API:Администрирование Устройства

в этом API есть locknow() функция, которая делает то, что я хочу.

в любом случае, это для расширения аппаратных средств и функций безопасности android, и очень маловероятно, что кто-то хочет контролировать устройство таким образом.

то, что я хотел, это возможность заблокировать устройство от простой жест. Поскольку я не хочу создавать свой собственный класс диспетчера устройств, я проверяю, установлено ли бесплатное приложение "lockScreen" и запускаю его. Это короткий и простой способ сделать то, что я хочу. Это приложение должно быть зарегистрировано как диспетчер устройств, поэтому он реализовал этот класс. Его можно получить бесплатно с рынка.


мое приложение уже делает это хорошо, я нашел это в моем PowerManager.class

 /**
 * Force the device to go to sleep. Overrides all the wake locks that are
 * held.
 * 
 * @param time is used to order this correctly with the wake lock calls. 
 *          The time  should be in the {@link SystemClock#uptimeMillis 
 *          SystemClock.uptimeMillis()} time base.
 */
public void goToSleep(long time) 
{
    try {
        mService.goToSleep(time);
    } catch (RemoteException e) {
    }
}