- Экран
- Настройки — Экран
- Размеры экрана и его ориентация (Старый и новый способ)
- Плотность экрана, масштабирование шрифта и др.
- Получить текущее значение яркости экрана
- Установить яркость экрана
- Настраиваем яркость экрана в своём приложении
- Определение поддерживаемых экранных размеров в манифесте
- Размеры картинок для фона экрана
- Советы
- Cleartext HTTP traffic not permitted (https)
- Запретить делать скриншот экрана приложения
- Аналог html-кода
- Где находятся исходники системного калькулятора?
- Имитация тяжёлых задач
- Доступ к ресурсам через URI
- Ошибка Debug Certificate expired
- Убрать предупреждающие значки при использовании строк в атрибутах
- Проверка на первый запуск приложения
- Ошибка при загрузке apk-файла на эмулятор/устройство
- Сделать скриншот экрана своего приложения
- Раскодирование HTML-символов
- Кодирование строк по схеме UTF-8
- Кодирование в режиме Base64
- Пишем собственную функцию md5() для вычисления хэша строки
- Как заблокировать экран в приложении?
- Узнать размеры экрана
- В чем разница между fill_parent и match_parent
- Как убрать заголовок у Activity?
- Как использовать собственный значок для программы
- Получить номер версии программы
- Убить приложение
- Сколько используется памяти
- Разрешённый объём памяти для приложения
- Запретить автоматическую смену ориентации при повороте устройства
- Как получить размер экрана Android программно, раз и навсегда?
Экран
Небольшая подборка различных примеров для работы с экраном. На самом деле их не так часто приходится использовать в практике, но иметь общее представление бывает необходимым. Начало было положено в 2012 году, что-то могло устареть.
Настройки — Экран
Чтобы показать окно Экран из системного приложения Настройки:
Размеры экрана и его ориентация (Старый и новый способ)
Чтобы узнать размеры экрана и его ориентацию из запущенного приложения, можно воспользоваться встроенными классами Android.
Данный способ был опубликован в те времена, когда у меня был Android 2.3. Читатели подсказали, что теперь методы считаются устаревшими (API 13 и выше). Пришлось переписывать код. Впрочем, спустя некоторое время и этот код стал считаться устаревшим.
Ориентацию при помощи нового метода не узнаешь. Помните, что это размеры экрана устройства, а не экрана вашего приложения. Кроме того, в документации как-то туманно описывается точность вычислений этих размеров. Никому верить нельзя.
Плотность экрана, масштабирование шрифта и др.
Существует класс 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
Источник
Советы
Cleartext HTTP traffic not permitted (https)
При работе с Android 8+ примеры, которые обращаются к веб-адресам по протоколу http вызывают ошибку. Чтобы обойти данное ограничение, можно сделать следующее.
В папке res/xml размещаем файл network_security_config.xml:
В манифесте в блоке application добавляем новый атрибут.
Запретить делать скриншот экрана приложения
Существует специальный флаг FLAG_SECURE, запрещающий пользователю сделать скриншот вашего экрана. Это нужно в целях безопасности для отдельных видов приложений, например, банковских.
Аналог html-кода
При многострочных текстах вы можете воспрепятствовать переносу слов на разные строки, если их желательно держать вместе. В html есть специальный символ неразрывного пробела . В строковых ресурсах вы можете использовать символ или юникод-код \u00A0.
Где находятся исходники системного калькулятора?
Имитация тяжёлых задач
В Android нельзя выполнять сложные задачи в основном потоке. Для создания быстрой заглушки, которая будет имитировать тяжёлую задачу, можно написать следующий код:
Например, поместите код в обработчик нажатия кнопки и после нажатия нажмите на кнопку Back. Программа зависнет и вы увидите сообщение об этом.
Доступ к ресурсам через URI
Обычно мы обращаемся к ресурсам через идентификатор. Существует альтернативный способ через Uri. Например, такой подход может пригодиться для загрузки изображения в WebView при помощи метода loadUrl(). Формат доступа будет следующим: android.resource://[package-name]/res-id. Например:
Ошибка Debug Certificate expired
По умолчанию вашей программе выдается отладочный сертификат на один год. Если у вас есть старый проект, то можете получить сообщение об ошибке: Error generating final archive: Debug Certificate expired.
Вам следует удалить старый сертификат, и Eclipse создаст новый ещё на один год. Путь к сертификату можно посмотреть в настройках: Preferences | Android | Build | Default debug keystore. Обычно это папка C:\Users\ИмяПользователя\.android.
Убрать предупреждающие значки при использовании строк в атрибутах
Если в некоторых атрибутах компонентов использовать строки, то появляются предупреждающие значки с всплывающей надписью [I18N] Hardcoded string «Котики рулят», should use @string resource. Надпись призывает использовать строковые ресурсы, а не писать текст прямо в атрибутах. На самом деле это всего лишь предупреждение, а не ошибка. Программа будет прекрасно запускаться, но новичков такие надписи пугают. Можете убрать данное предупреждение, если добавите дополнительный атрибут tools:ignore.
Проверка на первый запуск приложения
Для проверки первого запуска приложения можно использовать настройки SharedPreferences. Смотрите пример.
Ошибка при загрузке apk-файла на эмулятор/устройство
Если при загрузке apk-файла вашего приложения на эмулятор или устройство вы получаете сообщение об ошибке:
Failed to upload xxxxxxxx.apk on device ’emulator-5554′
java.io.IOException: Unable to upload file: timeout
То зайдите в Eclipse в меню Window | Preferences | Android | DDMS и в текстовом поле ADB connection time-out (ms) вместо значения по умолчанию 5000 введите большее значение.
Сделать скриншот экрана своего приложения
Один из примеров снятия скриншота своего экрана — через методы рисования получить графический отпечаток корневой разметки, а затем сохранить его как картинку, которую можно вывести в ImageView. Выберите любой ваш экран для опытов и добавьте на неё кнопку для снятия скриншотов и ImageView для вывода сохранённого изображения. В моём случае корневым элементом была компоновка TableLayout.
Результат до и после снятия скриншота. Сам скриншот помещается в ImageView, поэтому растягивается до его размеров. Попробуйте доработать пример.
Изменённый пример, когда скриншот сохраняется на SD-карту:
Не забываем про разрешения.
Раскодирование HTML-символов
Если вам нужно раскодировать HTML-символы (угловые скобки <>, знак амперсанда &, кавычки «»), то воспользуйтесь методом TextUtils.htmlEncode(). Добавим на форму две текстовые метки. И небольшой код для примера:
Примечание: Если вы пользуетесь Notepad++, то там есть такая же возможность: TextFX | TextFX Convert | Encode HTML.
Кодирование строк по схеме UTF-8
Вероятно, вы не раз замечали, что в адресной строке некоторые символы заменяются на последовательность других символов. Самый простой пример — символ пробела заменяется на %20. Немного изменим предыдущий пример:
В нашем примере были преобразованы символы пробела и русские символы.
Кодирование в режиме Base64
Пишем собственную функцию md5() для вычисления хэша строки
У PHP-программистов есть готовая функция md5(), которая вычисляет MD5 хэш строки с использованием алгоритма MD5 RSA Data Security и возвращает этот хэш. Хэш представляет собой 32-значное шестнадцатеричное число. Напишем собственную функцию на Java:
Осталось применить её где-нибудь:
Как заблокировать экран в приложении?
Также нужно установить разрешение android.permission.DISABLE_KEYGUARD.
Если стоит обратная задача — запретить блокировку экрана при долгом бездействии, то используйте метод setKeepScreenOn() или используйте XML-атрибут android:keepScreenOn=»true».
Узнать размеры экрана
Для вычисления размеров экрана можно воспользоваться двумя способами. Второй способ более правильный.
В чем разница между fill_parent и match_parent
match_parent = fill_parent. Первое свойство нужно использовать в новых проектах, второе свойство считается устаревшим и пока оставлено в целях совместимости.
Как убрать заголовок у Activity?
В некоторых случаях хочется спрятать заголовок (Title) у программы. Есть несколько способов. Например, применить специальную тему (прописать в манифесте файла):
Также попробуйте android:theme=»@android:style/Theme.Black.NoTitleBar.Fullscreen» (убирает не только заголовок, но и панель уведомлений). Названия тем могут быть и другими, смотрите документацию. Несколько примеров
Если у вас используется своя тема, то используйте в ней параметр:
Также существует программный способ (перед вызовом setContentView):
Как использовать собственный значок для программы
Когда вы создаете учебные примеры, то у всех программ используется стандартный значок с изображением андроида. Как же использовать свой значок? Ответ прост. В папке проекта /res вы можете видеть подпапки drawable-ldpi, drawable-mdpi, drawable-hdpi и др., в которых и содержатся готовые значки в формате PNG под разные размеры экранов.
Вы можете просто открыть png-файл в графическом редакторе и нарисовать что-то свое и сохранить изменения.
Вы можете сохранить значки под своим именем, например, cat.png. В этом случае вам надо открыть файл манифеста, найти там строчку:
И отредактировать её, например, android:icon=»@drawable/cat» (без расширения). Как вариант, вы можете сохранить один значок в папке drawable в нужном размере, если пишете программу под определенные типы телефонов.
Размеры значков в папках (часть):
- Low density – ldpi = 36×36 px
- Medium density – mdpi = 48×48 px
- High density – hdpi = 72×72 px
- Extra-high density screen — xhdpi (320 dpi) = 96 × 96 px
Получить номер версии программы
Убить приложение
Сколько используется памяти
Нужно от общей памяти отнять свободную память
Более общий пример:
Разрешённый объём памяти для приложения
Система выделяет каждому приложению определённый лимит памяти. На разных устройствах размер выделяемой памяти отличается. Чтобы узнать размер выделяемой памяти для вашего приложения, используйте код:
Особенно это касается приложений, которые активно используют графику. Следите за размерами изображений, вызывайте метод recycle() для освобождения памяти при работе с классом BitmapFactory.
Начиная с Android 3.0 можно попросить у системы выделять чуть больше памяти, прописав в манифесте просьбу:
Запретить автоматическую смену ориентации при повороте устройства
Если вы хотите запретить автоматическую смену ориентацию при повороте устройства, то можно ее отключить для нужного экрана. Например, если экран с настройками должен отображаться только в портретном режиме, то добавьте одну строчку с атрибутом screenOrientation в манифест файла для соответствующей активности
Источник
Как получить размер экрана Android программно, раз и навсегда?
Как я могу определить размер экрана программно, в единицах, используемых событиями касания и Просмотр измерения/компоновки? Другими словами, мне нужны координаты в правом нижнем углу экрана, в системе координат, используемой сенсорными событиями » getRawX()/getRawY() и View.getLocationOnScreen() .
Я не решаюсь вызывать нужные единицы измерения/просмотра «пикселей» поскольку, очевидно, существует несколько понятий «пикселей» , на моем телефоне в различных режимах, и они не дополняют последовательную историю.
Я вижу, что это было задано и много ответили на stackoverflow и в других местах, но ни один из ответов не работает на моем телефоне (droid 4, android 4.1.2) во всех режимах:
Это код библиотеки, который должен работать независимо от того, находится ли приложение в режиме совместимости с экраном, (т.е. targetSdkVersion
мой телефон (дроид 4 работает андроид 4.1.2) имеет 540×960 физических пикселей, то есть маленькие цветные светящиеся точки.
размер экрана в желаемых единицах, от просмотра событий касания и просмотра измерений, является 360×640, когда приложение находится в режиме сопоставления экрана, 540×960, когда приложение не находится в режиме сопоставления экрана. Это числа, которые мне нужно найти программно, без отбрасывания событиями касания или представлениями, чтобы найти их, но мне очень сложно найти какой-либо API которые вернут эти числа.
Полученные объекты Display и DisplayMetrics в разных отношениях все утверждают, что размер экрана 540×960 «пикселей» (в режиме сопоставления экрана или нет). Чтобы быть конкретным, все говорят 540×960 все время: DisplayMetrics. <Ширина, высота>Пиксели, Display.getSize(), Display.getRealSize(), Display.get <ширина, высота>(),
Объекты конфигурации, полученные различными способами все говорят экран <Ширина, Высота>Dp = 360×614 (в режиме сопоставления экрана или нет). Я не считаю, что это весь экран, так как соотношение сторон неверно. (Я думаю, что весь экран минус строка состояния; Мне нужен весь экран.) Я думаю, что можно с уверенностью сказать, что весь экран 360×640 dp, хотя я не знаю API, который возвращает это 640.
DisplayMetrics, полученный различными способами скажем, «плотность» 1.0f, когда в режиме сопоставления экрана, 1.5f, если не в режиме сопоставления экрана.
Деятельность getWindow().getAttributes().
Я понимаю, что предполагается следующая формула: пикселей = плотность dp * Это, похоже, согласуется со всеми представленными числами ((3), (4), (5) выше) если не в режиме совместимости с экраном: 540×960 = 360×640 * 1,5 Но в режиме совместимости с экраном он не складывается: 540×960!= 360×640 * 1 Итак, что-то не так.
Простейшее объяснение, я думаю, заключается в том, что методы, перечисленные в (3) выше просто дают неправильный ответ для «пикселей» , когда в режиме сопоставления экрана, то есть они были предназначены для возврата 360×640 «пикселей» , но они ошибочно возвращают 540×960 вместо этого. Но могут быть и другие способы взглянуть на это.
В любом случае, получение желаемых номеров независимо от режима, из вышеупомянутых кусочков головоломки, безусловно, сложная головоломка. Я нашел способ, который, кажется, работает на моем телефоне в обоих режимах, но это очень круто, и он полагается на два предположения, которые по-прежнему кажутся довольно шаткими (как описано в комментариях кода ниже).
Есть ли лучший/чистый способ найти размер экрана?
Источник