Android - Активация системной блокировки клавиш (он же экран блокировки)

Мне нужно активировать системную блокировку клавиш Android (ту, которую вы получаете, когда нажимаете кнопку выключить / положить трубку). Глянь сюда:

img

Я уже просматривал документы, но все, что я нашел, было PowerManager и KeyguardManager. Оба, похоже, не решение :-(.

Итак, все ли знают, как этого добиться с помощью приложения для Android? (Если требуются специальные разрешения, это не проблема, но изменение настроек устройства не является решением ...)

РЕДАКТИРОВАТЬ: Или кто-то знает, что это вообще невозможно? Кстати. Решение Craigs с отправкой ключей больше не работает (см. комментарии).


person Johannes Weiss    schedule 09.04.2009    source источник
comment
Вы также можете попробовать перейти на IRC (freenode #android) и поговорить с самим ведущим разработчиком.   -  person Joe Phillips    schedule 20.04.2009


Ответы (5)


Некоторое время я искал ответ на тот же вопрос. По-видимому, после версии 2.0 права диспетчера устройств на уровне приложения были удалены. Но с Froyo - 2.2 раскрывается диспетчер политик устройств, предоставляющий нам, разработчикам, множество элементов управления на административном уровне.

http://developer.android.com/guide/topics/admin/device-admin.html

person Orkun Ozen    schedule 02.11.2010

Вам нужен reenableKeyguard () в KeyguardManager.KeyguardLock, мой друг!

person sthg    schedule 20.04.2009
comment
Вы пробовали это? Действительно ли появился экран блокировки, как вы можете видеть выше? Я попробовал это, и он заблокировал клавиатуру, но это НЕ была системная блокировка ... - person Johannes Weiss; 20.04.2009
comment
Ах, возможно, я неправильно понял ваш вопрос. Это про отображение самого ЭКРАНА или активацию блокировки клавиш системы? - person sthg; 22.04.2009
comment
sthg, оба :-). Я просто хочу активировать обычную системную блокировку клавиатуры. Сам экран является частью этой блокировки. Если пользователь активировал код (или шаблон разблокировки), его следует спросить об этом коде / шаблоне. Недостаточно просто заблокировать клавиатуру :-( - person Johannes Weiss; 22.04.2009

Похоже, функция блокировки экрана выполняется по методу:

public void goToSleep(long time)

метод в PowerManager.java. Получить ссылку на него можно следующим образом:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);

Однако для этого требуется разрешение

android.permission.DEVICE_POWER

это разрешение уровня 2, доступное только системе.

Похоже, это невыполнимо. Это только для версии 1.1, не знаю для 1.5.

person JRL    schedule 20.04.2009
comment
хм, это плохо. На самом деле, я думаю, что этого было бы даже недостаточно, потому что мне действительно нужна системная блокировка клавиш, как вы можете видеть на скриншоте выше. Ничего об этом экране не упоминается в документации PowerManager ... В нем говорится только о том, что устройство перейдет в спящий режим, но не о том, что системная блокировка клавиатуры активируется. - person Johannes Weiss; 20.04.2009
comment
Не уверен, что это поможет, так как это источник версии ‹1.1, но: goToSleep вызывает goToSleep в PowerManagerService, затем goToSleepLocked, затем setPowerState. И в setPowerState есть этот комментарий: // Когда пользователь нажимает кнопку питания, нам нужно всегда отправлять // уведомление о том, что он переходит в спящий режим, чтобы сработала блокировка клавиатуры. Но // мы не можем этого сделать, пока экран не погаснет, поэтому мы не показываем блокировку клавиатуры // слишком рано. - person JRL; 21.04.2009
comment
А в LockPatternKeyguardView есть вызов ScreenLock следующим образом: View createLockScreen () {return new LockScreen (mContext, mLockPatternUtils, mUpdateMonitor, mKeyguardScreenCallback); } - person JRL; 21.04.2009
comment
Также обратите внимание на эту ветку. Кажется, это подтверждает, что это невозможно: groups.google.com/group / android-platform / browse_thread / thread / - person JRL; 21.04.2009

Вот довольно хороший пример:

http://www.anddev.org/throwing-simulating_keystrokes_programatic-t717.html

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

http://developer.android.com/reference/android/view/KeyEvent.html

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

person Craig Otis    schedule 09.04.2009
comment
Этот метод больше не доступен, он был удален из соображений безопасности. - person sooniln; 10.04.2009
comment
Ах, облом, знаете ли вы какое-нибудь другое решение? - person Craig Otis; 10.04.2009
comment
Хм, Android 1.0 / грядущая 1.5 - целевая платформа, так что это не сработает :-( - person Johannes Weiss; 16.04.2009

Копаясь в источнике Android, обнаружил WindowManagerService, у которого, похоже, есть общедоступный метод (startAppFreezingScreenLocked) для его активации. Это может быть хорошим местом для начала поиска вашего ответа, поскольку, к сожалению, не похоже, что вы можете напрямую получить объект WindowManagerService.

person Steve Pomeroy    schedule 20.04.2009