Отключить кнопку питания ... или ... Возобновить полный экран в приложении Android малыша - PullRequest
3 голосов
/ 24 февраля 2012

Я создаю приложение для Android для малышей. Поэтому мне нужно заблокировать как можно больше кнопок, чтобы предотвратить доступ малыша к другим функциям устройства Android. По сути, я хочу воспроизвести механизм блокировки в популярных приложениях для малышей, таких как «Блокировка малышей». У меня есть логика, которая требует от пользователя касаться четырех углов экрана по часовой стрелке, чтобы выйти из приложения.

Чтобы показать приложение в полноэкранном режиме, в моем манифесте есть следующее

android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

Чтобы показать приложение только в альбомном режиме, в событии onCreate моей деятельности есть следующее

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

Чтобы запретить использование кнопок, я переопределяю событие onKeyDown следующим кодом

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    return true;
}

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

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

Почему при пробуждении экрана на устройстве Android панель уведомлений появляется над полноэкранным приложением, настроенным, как описано выше ... и как я могу предотвратить это?

Ответы [ 2 ]

2 голосов
/ 19 апреля 2012

Если вопрос логический: возможно ли отключить кнопку POWER? Ответ ДА. Пожалуйста, помните, я ничего не говорю о контексте, в котором такое поведение должно или не должно быть выбрано, или ситуация принесет вам пользу в том, чего вы пытаетесь достичь!

ПЕРЕХОДНАЯ КНОПКА ПИТАНИЯ ВОЗМОЖНА на телефонах без рута (по крайней мере 2.3.5 и 2.3.6)! Если вы мне не верите, просто скачайте бесплатное приложение Theft Aware из Google play (версия до того, как оно было приобретено AVAST) и проверьте его сами. Я тестировал его на нерутированных Samsung Galaxy Y (Android 2.3.6) и HTC Wildfire-S (Android 2.3.5).

Я НЕ утверждаю, что это возможно с помощью публично документированных API-интерфейсов Android, но это возможно на заводской прошивке Android без root-прав (как минимум 2.3.5 и 2.3.6, если не другие). Может быть, ребята из Theft Aware, возможно, зацепились за уровень ОС / реверс-инжиниринг или копали глубоко в исходном коде и, возможно, нашли способ переопределить кнопку питания, но сделали это совершенно блестяще.

Это их IP, и по этой причине нет ни документа, ни документа, ни решения для обсуждения на форуме о том, как они это сделали. Я пытался понять это сам в течение прошлых 2 недель. Пока не удалось, но если они могут это сделать ... значит, это может быть СДЕЛАНО!

Надоело читать, что это невозможно, отсюда и ответ. Продолжайте искать, и если кто-то найдет хитрость, пожалуйста, напишите об этом!

П.С .: Я не говорю, что это хорошая вещь. Я не говорю, что вы должны отключить кнопку питания и получить плохое приложение для взаимодействия с пользователем. Ответ просто утверждает, что переопределение кнопки POWER ВОЗМОЖНО!

1 голос
/ 29 февраля 2012

ОК, после нескольких поисков в Google и поиска проб и ошибок я наконец-то нашел ответ на эту проблему.Если вы пытаетесь создать приложение для Android, которое блокирует все кнопки, чтобы малыши не могли получить доступ к другим областям устройства, выполните следующие действия ...

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

android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

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

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

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

import android.app.KeyguardManager;

В определении класса вашей деятельности добавьте следующие две переменные.Это позволяет использовать менеджер keygaurd для событий onCreate(...), onPause(...) и onResume(...) (см. Ниже).

KeyguardManager keyguardManager;
KeyguardManager.KeyguardLock lock;

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

keyguardManager = (KeyguardManager) getSystemService(Activity.KEYGUARD_SERVICE);
lock = keyguardManager.newKeyguardLock(KEYGUARD_SERVICE);
lock.disableKeyguard();

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

lock.reenableKeyguard();

В вашемсобытие onResume(...), добавьте код фоллинга.Это отключает экран блокировки клавиш еще раз, когда ваше приложение возобновляет работу с выключенного экрана.

lock.disableKeyguard();

Это все, что нужно сделать.

...