Не гасить экран android studio

Delphi разработка под Android

Страницы

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

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

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

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

1) Открываем проект в Delphi XE5, далее в меню «Project->View Source», в IDE откроется файл «Project1.dpr».
2) Теперь в «uses», после «FMX.Forms,» или до «Unit1 in ‘Unit1.pas’ ;» добавляем «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?

У меня есть приложение, которое я хотел бы использовать в портретном режиме, так я определил android: screenOrientation= «портрет» в XML-манифесте. Это работает нормально для HTC Magic телефон (и предотвращает изменения ориентации на других телефонах, а также).

но у меня проблема с HTC G1 телефон, как я открываю оборудование QWERTY-клавиатура (не виртуальной клавиатуры). Моя активность остается в портретном режиме, но, похоже, она перезапускается и теряет все свои состояния. Это не происходит с HTC Hero версия.

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

12 ответов:

обновление апрель 2013: Не делайте этого. Это была не очень хорошая идея в 2009 году, когда я впервые ответил на вопрос, и это действительно не очень хорошая идея сейчас. См. этот ответ hackbod по причинам:

добавить android:configChanges=»keyboardHidden|orientation» к вашему AndroidManifest.XML. Это говорит системе, какие изменения конфигурации вы собираетесь обрабатывать самостоятельно — в этом случае, выполнив ничего.

Читайте также:  Блокировка экрана во время разговора android xiaomi

см. справочник разработчика configChanges для более подробной информации.

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

обновление: начиная с Android 3.2, вам также нужно добавить «screenSize»:

внимание: начиная с Android 3.2 (уровень API 13), «Размер экрана » также изменяется при переключении устройства между книжной и альбомной ориентацией ориентация. Таким образом, если вы хотите предотвратить перезапуск среды выполнения из-за изменение ориентации при разработке для API уровня 13 или выше (как объявленные атрибутами minSdkVersion и targetSdkVersion), вы необходимо включить значение» screenSize «в дополнение к» ориентация» значение. То есть, вы должны заявлять android:configChanges=»orientation|screenSize» . Однако, если ваш приложение нацелено на уровень API 12 или ниже, тогда ваша активность всегда обрабатывает это изменение конфигурации сам (это изменение конфигурации не перезапускает вашу деятельность, даже при работе на Android 3.2 или высшее устройство).

Источник

Android: как включить и выключить экран программно?

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

Я пытаюсь выключить устройство, а затем через несколько минут или сменить датчик, включите его снова.

Выключить тесты дисплея

Я могу отключить экран, используя:

Мне не удалось отключить экран, используя метод wl.release ().

Включение дисплея

Мое первое предположение, как следует, не работает. Ничего не происходит, экран остается выключенным.

Я также попытался использовать wakelocks, без успеха.

Наконец, я пробовал следующее, без результата.

В общем, я не получаю никаких ошибок в консоли для любого из этих методов. Мой тестовый текст «Экран должен быть включен», находится на экране, когда я включаю устройство с помощью кнопки питания. Это показывает, что код должен работать. Пожалуйста, ответьте только, если вы протестировали код, кажется, что многие из таких функций, как params.screenBrightness = -1 , не работают так, как должны, согласно sdk.

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

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

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

Теперь, чтобы вернуть экран к обычной яркости, нужно просто установить значение яркости:

Я не могу объяснить, почему это не заменит ранее установленное значение 0. В качестве теста вы можете попытаться установить принудительную полную яркость, чтобы заставить эту конкретную яркость:

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

Чтобы отладить, вы можете использовать «окно dumpsys оболочки adb», чтобы увидеть текущее состояние вашего окна. В данных для вашего окна он скажет вам текущие LayoutParams, которые были установлены для него. Убедитесь, что вы действительно на самом деле стоите.

И снова FLAG_KEEP_SCREEN_ON – отдельная концепция; Он и яркость не оказывают прямого воздействия друг на друга. (И не было бы причин снова устанавливать флаг при отмене яркости, если вы уже установили его при установке яркости на 0. Флаг будет оставаться установленным до тех пор, пока вы его не измените.)

Я написал этот метод, чтобы включить экран после блокировки экрана. Он отлично работает для меня. Попробуй-

Читайте также:  Пабг нев стате системные требования для андроид

И назовите этот метод из onResume() .

Я бы предложил следующее:

Флаг ACQUIRE_CAUSES_WAKEUP объясняется следующим образом:

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

Привет, надеюсь, это поможет:

Вы уверены, что запросили правильное разрешение в вашем файле манифеста?

Вы можете использовать класс AlarmManager 1, чтобы скрыть намерение, которое начинает вашу деятельность, и получает блокировку слежения. Это включит экран и сохранит его. Освобождение wakelock позволит устройству самостоятельно спать.

Вы также можете взглянуть на использование PowerManager, чтобы установить устройство в режим сна: http://developer.android.com/reference/android/os/PowerManager.html#goToSleep(long)

Вот успешный пример реализации одной и той же вещи на устройстве, поддерживающем более низкие значения яркости экрана (я тестировал на планшете Allwinner Chinese 7 «, на котором работает API15).

Если кто-то еще попытается это сделать, комментарий PLS ниже, если он работал / не работал и устройство Android API.

// Файл пользовательского манифеста

Лучший способ сделать это (используя укороченные устройства):

Теперь у нас есть две функции:

Извините за мой плохой английский.

У меня не было бы надежды на «пробуждение экрана» в этой деятельности. Если экран выключен, активность, вероятно, находится в состоянии паузы и не должна содержать какой-либо код.

Когда вы просыпаетесь, возникает проблема блокировки экрана. Я не знаю, как любое приложение может автоматически обойти lockscreen.

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

Вы также можете попытаться запустить операцию прямо из службы, но я действительно не знаю, включит ли это экран или обойдется экран блокировки.

Что касается документации Android, ее можно достичь, используя следующую строку кода:

Я добавил это в мой метод onCreate и он отлично работает.

По ссылке вы найдете разные способы достижения этого и общее объяснение.

Чтобы включить экран:

Вернуться к экрану по умолчанию: просто снимите флаг FLAG_KEEP_SCREEN_ON

Бывают случаи, когда экран необходимо отключить ПОЛНОСТЬЮ. Если энергопотребление не очень важно для вашего приложения, класс PowerManager можно использовать в следующих случаях:

  • Используйте PowerManager.goToSleep (), чтобы отключить отображение экрана.
  • Используйте PowerManager.wakeUp (), чтобы включить экран.
  • Используйте PowerManager.isScreenOn (), чтобы получить состояние включения / выключения экрана. В качестве альтернативы для этой цели используйте PowerManager.isInteractive () или Display.getState ().

В следующем примере кода показано, как реализовать это решение:

Вышеупомянутый код был протестирован на встроенном устройстве под управлением Android 4.4.2 (API уровня 19).

Обратите внимание, что некоторые из этих методов API не могут быть найдены в документации API Android, и вам необходимо указать соответствующие разрешения, такие как DEVICE_POWER.

Источник

Экран

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

Настройки — Экран

Чтобы показать окно Экран из системного приложения Настройки:

Размеры экрана и его ориентация (Старый и новый способ)

Чтобы узнать размеры экрана и его ориентацию из запущенного приложения, можно воспользоваться встроенными классами Android.

Данный способ был опубликован в те времена, когда у меня был Android 2.3. Читатели подсказали, что теперь методы считаются устаревшими (API 13 и выше). Пришлось переписывать код. Впрочем, спустя некоторое время и этот код стал считаться устаревшим.

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

Читайте также:  Android studio hotkeys override

Плотность экрана, масштабирование шрифта и др.

Существует класс DisplayMetrics, также имеющий в своём составе свойства для экрана. Пример также пришлось переписывать после выхода Android 11 (API 30), который теперь тоже устаревший:

Вот ещё несколько способов определения размеров:

Такой же код, но с использованием дополнительной константы SCREENLAYOUT_SIZE_MASK:

На Kotlin в виде отдельной функции.

Заглянув в документацию, обнаружил, что можно обойтись без собственных констант. Они уже есть в Android. Оформил в виде отдельного метода.

Получить текущее значение яркости экрана

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

Установить яркость экрана

Если можно получить значение текущей яркости экрана, значит можно и установить яркость. Для начала нужно установить разрешение на изменение настроек в манифесте:

Для настройки яркости нужно использовать параметр System.SCREEN_BRIGHTNESS. Добавим на форму кнопку, метку и ползунок. Код для установки яркости:

Проверил старый пример времён Android 2.2 на эмуляторе с Android 10. Правила ужесточились. Теперь разрешение на изменение системных настроек выдаются только системным программам. Пока ещё есть лазейка, которой и воспользуемся. Новый пример написан на Kotlin. Добавим в манифест немного модифицированное разрешение.

Далее программа должна проверить возможность изменять системные настройки через метод canWrite(). Если такая возможность есть, то запрашиваем разрешение. Появится специальное окно, в котором пользователь должен подтвердить своё решение через переключатель. После этого нужно заново запустить программу, чтобы ползунок стал доступен. Теперь можете менять настройки.

Настраиваем яркость экрана в своём приложении

Существует возможность переопределить яркость экрана в пределах своего приложения. Я не смог придумать, где можно найти практическое применение, но вдруг вам пригодится. Для управления яркостью экрана воспользуемся элементом SeekBar.

За яркость экрана отвечает свойство LayoutParams.screenBrightness:

Интересно, что когда выводил ползунок в значение 0, то эмулятор зависал с экраном блокировки. Вам следует учесть эту ситуацию и добавить условие:

Опять столкнулся с проблемой. Пример работал на старых устройствах, а на некоторых устройства не работает. Но за эти годы мне ни разу не пришлось использовать этот способ, поэтому даже не стал искать причину. И кстати, ошибка со значением 0 уже не возникает (возможно из-за того, что сам пример не работает как раньше).

Определение поддерживаемых экранных размеров в манифесте

Не всегда предоставляется возможным написать приложение для всех возможных типов экранов. Вы можете использовать тег в манифесте, чтобы указать, на устройствах с какими экранами может работать ваша программа.

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

Атрибут anyDensity говорит о том, каким образом ваше приложение будет масштабироваться при отображении на устройствах с разной плотностью пикселов. Если вы учитываете это свойство экрана в своем интерфейсе, установите этому атрибуту значение true. При значении false Android будет использовать режим совместимости, пытаясь корректно масштабировать пользовательский интерфейс приложения. Как правило, это снижает качество изображения и приводит к артефактам при масштабировании. Для приложений, собранных с помощью SDK с API level 4 и выше, этот атрибут по умолчанию имеет значение true.

Размеры картинок для фона экрана

Если вы используете изображение в качестве фона, то нет смысла выводить очень большую картинку на устройстве с маленьким экраном. Можно подготовить разные размеры.

res/drawable-ldpi — 240×320
res/drawable-mdpi — 320×480
res/drawable-hdpi — 480×800
res/drawable-xhdpi — 640×960
res/drawable-xxhdpi — 960×1440
res/drawable-tvdpi — 1.33 * mdpi

Источник

Оцените статью