вторник, 25 февраля 2014 г.

Отключаем затухание и блокировку дисплея

Иногда в приложениях необходимо запретить автоблокировку экрана. Существует как минимум три способа (на JAVA, с использованием Android API) управления затуханием/блокировкой дисплея. Пока мне удалось опробовать только 2 способа (остальные пока не знаю, как реализовать), но и их в принципе уже достаточно.



Способ 1 – Всё автоматически:
Данный способ хорош тем, что всё происходит автоматически. Вписали одну строчку кода и забыли…

1) Открываем проект в Delphi XE5, далее в меню «Project->View Source», в IDE откроется файл «Project1.dpr».
2) Теперь в «uses», после «FMX.Forms,» или до «Unit1 in 'Unit1.pas' {Form1};»  добавляем  «FMX.Helpers.Android,  Androidapi.JNI.App, Androidapi.JNI.GraphicsContentViewText,»
3) Далее сразу после/до «Application.Initialize;» вставляем такую строчку:
«SharedActivity.getWindow.addFlags(TJWindowManager_LayoutParams.JavaClass.FLAG_KEEP_SCREEN_ON);»

Как это выглядит:

Всё, теперь компилируем приложение и проверяем, экран не будет затухать, и блокироваться пока отображается наше приложение.

Теперь объяснение.
На Яве этот код выглядел бы примерно вот так:

        protected void onCreate(Bundle icicle) {
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        }

Как этот код переводится на Delphi JNI, разбираем по частям:

Исходная строка: getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

getWindow()
  • API: android.app.Activity.getWindow;
  • Delphi: JActivity(SharedActivity).getWindow (файл Androidapi.JNI.App)
addFlags()
  • API: android.view.Window.addFlags(int flags);
  • Delphi: JWindow.addFlags(flags: Integer) (файл Androidapi.JNI.GraphicsContentViewText);
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
  • API: android.view.WindowManager.LayoutParams
  • Delphi: JWindowManager(TJWindowManager_LayoutParams) (файл Androidapi.JNI.GraphicsContentViewText)
Конечная строка: SharedActivity.getWindow.addFlags(TJWindowManager_LayoutParams.JavaClass.FLAG_KEEP_SCREEN_ON);

Эту строчку можно использовать только в файле «*.dpr» и только до создания формы «Application.CreateForm(TForm1, Form1);», иначе она не будет работать.

Способ 2 – Контролируем всё и вся :)
Данный способ хорош тем, что мы можем контролировать подсветку в run-time. Т.е. можем отключать/включать запрет на блокировку экрана по нажатию обычной кнопки.

К сожалению, в Delphi XE5 Update 2 пока нет «*.pas» файла для работы с «android.os.PowerManager», поэтому на просторах интернета найден такой файл, я не знаю, кто его написал, но спасибо этому человеку.

Всё что нужно сделать, это:
1) Подключаем в uses этот файл
2) Создаём кнопку «Разрешить блокировку» - ReleaseWakeLock
3) Создаём кнопку «Запретить блокировку» - AcquireWakeLock
4) В Uses Permissions выставляем Wake_Lock в True.

Файл Android.JNI.PowerManager.pas: Скачать с Google Drive

Оба способа проверены, работают!
Я буду обновлять эту заметку, т.к. существует ещё несколько способов, возможно, я разберусь с ними.

Если вам есть что сказать по теме, пишите в комменты.

6 комментариев:

  1. Для работоспособности второго способа надо в User Permission приложения разрешить WAKE LOCK.

    Project->Options->User_permissions->Wake_Lock

    ОтветитьУдалить
    Ответы
    1. Совсем забыл указать это. Спасибо!

      Удалить
  2. Подскажите, как это сделать в xe7

    ОтветитьУдалить
  3. В XE8 работает с Androidapi.Helpers, а не как в ТС

    ОтветитьУдалить
  4. Спасибо за примеры, со вторым способом возникла проблема на телефоне Галакси с3, после запуска AcquireWakeLock; прога сразу вылетает синий экран, на планшете с 5 андройдом тестил полет нормальный.

    ОтветитьУдалить
  5. Для первого варианта нужно добавить Androidapi.Helpers

    ОтветитьУдалить