- Wallpaper Engine для Android
- Загрузите мобильное приложение-компаньон Wallpaper Engine
- Частые вопросы — Wallpaper Engine для Android
- Создание Android Live Wallpapers
- В поисках правды
- Рисуем
- Методы жизненного цикла Engine
- Scheduler
- Service & Engine
- AndroidManifest и другие заклинания
- Как добавить
- Причем тут Android Watch?!
- Что получилось
- Благодарности
- Смена Интерактивных обоев по расписанию с помощью Tasker (требуется ROOT)
- Tasker
- Русские Блоги
- Процесс установки обоев в Android Wallpaper
- Как установить обои? Дайте каштан.
- Три шага:
- Как отображаются обои?
- 1.setStream
- 2.WallpaperManagerService.java#setWallpaper
- 3. Самый главный метод: WallpaperObserver # onEvent
- 4.LockscreenWallpaper.java# onWallpaperChanged:
- Обои для рабочего стола Lockscreen Запускаемый интерфейс, поэтому посмотрите на его метод запуска:
- 5.StatusBar.java#updateMediaMetaData:
- 6. Посмотрите раздел обоев рабочего стола:
- 6.1 b indWallpaperComponentLocked
- 6.2 Продолжайте смотреть на метод attachServcieLocked:
- 6.3 onCreate(mSurfaceHolder)
- 6.4 updateSurfaceSize
- 6.5 drawFrame
Wallpaper Engine для Android
Загрузите бесплатное приложение Wallpaper Engine для Android и переносите свои коллекции Wallpaper Engine на мобильные устройства беспроводным способом.
Загрузите мобильное приложение-компаньон Wallpaper Engine
Требуется Android 8.1 или новее.
Чтобы узнать подробнее, ознакомьтесь с разделом частых вопросов ниже.
Частые вопросы — Wallpaper Engine для Android
Какие устройства поддерживаются?
Wallpaper Engine поддерживает все телефоны и планшеты с версией Android 8.1 или выше.
Можно ли установить обои на экран блокировки устройства Android?
Это зависит от устройства: на устройствах Android от некоторых производителей нет функции отображения живых обоев на экране блокировки. Если ваше устройство поддерживает эту опцию, вы автоматически увидите вариант установки обоев на экран блокировки.
Влияет ли Wallpaper Engine для Android на уровень заряда?
Влияние на работу аккумулятора минимальное. Приложение Wallpaper Engine запущено, только когда вы видите обои. Кроме того, вы можете выбрать качество графики и лимит кадров в секунду в настройках приложения. Также можно включить автоматическую приостановку при переходе в режим энергосбережения для комфортного расхода заряда аккумулятора.
Как добавлять в приложение новые обои?
Из-за технических ограничений Wallpaper Engine для Android не может подключаться к Мастерской напрямую для загрузки новых обоев. Однако вы можете перенести свою коллекцию с компьютера на телефон беспроводным способом посредством Wallpaper Engine.
Источник
Создание Android Live Wallpapers
Мне нужно отображать на экране телефона техническую информацию о его состоянии, точнее, о его состоянии в составе тестового пула. Видеть эту информацию я хочу всегда, то есть на Home screen, и без дополнительных телодвижений.
Способов, которые никак не повлияют на выполнение других приложения, всего два: Widget или Live wallpaper. Я выбрал Live wallpaper, они же «живые обои», потому что они автоматически попадают на все страницы Home screen, и даже на Lock screen. Эта статья содержит практические рекомендации, как создавать «живые обои».
В поисках правды
Документации о «живых обоях» кот наплакал. С момента первого (и единственного) анонса в блоге, случившегося больше 9 лет назад, Гугл не сделал ни одного внятного примера или codelab-а на эту тему. Пришлось разбираться.
Сначала основы. Внутренняя механика Андроида такова, что на устройство мы можем установить только приложение, и устройство всех приложений одинаково. Поскольку «живые обои» — это тоже приложение, то выбор управляющего компонента не велик, и стоит ожидать, что это будет Service. Найти его легко: это WallpaperService.
Экземпляров «живых обоев» может быть несколько, и жизненный цикл у них будет не такой, как у Activity или View. Соответственно, должен быть еще один базовый класс. Это WallpaperService.Engine (и он обязательно inner для WallpaperService!). Если вглядеться, то он окажется таким же поставщиком событий жизненного цикла, как Activity, Service и иже с ними.
Жизненный цикл «живых обоев» выглядит так:
Из этого списка становится понятно, когда можно/нужно перерисовать картинку (либо начать перерисовывать, если у вас анимация), и когда пора прекратить всю активность и не тратить батарейку.
Метод onSurfaceRedrawNeeded() выделяется среди остальных, читайте ниже. Также в помощь есть метод isVisible() (который в Котлине превращается в свойство isVisible ).
Теперь можно собирать этот конструктор. Начну с конца.
Рисуем
Рисовать придется самим на Canvas, никаких layout и inflater нам не будет. Как получить Canvas из SurfaceHolder и как на нем рисовать — за рамками этой статьи, ниже есть простой пример.
Методы жизненного цикла Engine
Все методы жизненного цикла, кроме onSurfaceRedrawNeeded , не требуют немедленной перерисовки. Поэтому хорошим тоном будет перерисовку поставить в очередь.
Обратите внимание на onSurfaceRedrawNeeded, который передает нам вызов одноименного коллбэка SurfaceHolder, который возникает при изменении размера и аналогичных событиях. Этот колбэк позволяет выполнить перерисовку немедленно, не допустив показа пользователю старой (и уже неверной) картинки. Система гарантирует, что пока не произошел возврат из этого метода, вывод на экран будет приостановлен.
Scheduler
Я люблю переопределять Handler, а не гонять в нем Runnable. На мой взгляд, так изящней.
В случае, если у вас анимация или регулярное обновление, то нужно будет сделать регулярную постановку сообщения в очередь (postAtTime() и postDelayed() вам в помощь). Если данные обновляются эпизодически, достаточно для обновления вызвать planRedraw() .
Service & Engine
Собирается эта марешка из Service и Engine вот так:
AndroidManifest и другие заклинания
Заклинаниями в разработке софта я называю то, что невозможно понять, но нужно точно повторить.
В . /app/src/main/res/xml должен лежать XML файл с описанием «живых обоев». Имя этого файла должно быть указано в AndroidManifest (ищите в примере ниже слово foobarwallpaper )
Не потеряйте в описании Service-а permission , meta-data и intent-filter :
Как добавить
«Живые обои» прячутся, поэтом подсказка. Описываю, как это выглядит на моем Samsung.
Для начала long press где-нибудь на Home screen, телефон перейдет в режим настройки рабочих столов, появится иконка Wallpapers.
Нажимаем на иконку Wallpapers, несколько разделов, нам нужен My wallpapers, жмем надпись View all в правом верхнем углу раздела, открывается список во весь экран.
Жмем «три точки» вызова меню, в нем пункт LIve wallpapers (у меня он единственный), появляется список доступных «живых обоев».
Выбираем наши обои, и выбираем «Home and lock screen».
Появится «превью», которое уже отрисовывается нашим приложением (чтобы распознать этот момент, есть метод isPreview()), жмем Set as wallpaper… И ничего не видим, потому что возвращаемся в список доступных обоев.
Жмем «Home» и наслаждаемся.
Причем тут Android Watch?!
Интересное наблюдение по ходу, что Faces в Android Watch сделаны по точно такой же схеме (с точностью, что у них свои базовые классы со своей реализацией): такие же Service + Engine, почти те же метаданные и intent filter для Service в манифесте (в которых слово wallpaper встречается четыре раза:), также надо писать свой шедулер на основе Handler-а.
В базовых классах Watch Faces есть готовый onDraw() , куда передается Canvas, и есть invalidate() для его вызова. Но это не принципиальное различие, а реализованная часть бойлерплейта.
В отличие от Live Wallpaper, для Watch Faces есть примеры, в них можно покопаться (ссылки здесь, в самом начале).
Что получилось
Скриншотики для приложения, которое красит экран в зеленый цвет, имеют мало смысла. Но пара фоток, что на базе этого получилось сделать для боевого стенда, под спойлером.
Стикеры — это оставшаяся система обнаружения проблем предыдущего поколения.
Благодарности
Если бы не эти две статьи, я бы блуждал в потьмах намного дольше. Не представляю себе, как их можно было написать аж в 2010 году при таком качестве документации?!
Источник
Смена Интерактивных обоев по расписанию с помощью Tasker (требуется ROOT)
Tasker
На данный момент существует большое количество прекрасных Интерактивных обоев, которые хочется видеть на своём устройстве, но до недавнего времени не было решений позволяющих их менять по расписанию, чтобы они менялись каждый день автоматически.
Сравнительно недавно появился способ смены при помощи EasyProfiles, но я использую Таскер, а так как в EasyProfiles я не нашел для себя полезных функций которые нельзя запрограммировать в Таскере, то ставить ещё одну программу, которая будет висеть в процессах, мне не очень хочется. Поэтому я стал искать своё решение.
Итак, сначала, я опишу как это происходит:
Каждый день, в 5 часов утра, Таскер запускает встроенную в прошивку программу для выбора установленных Интерактивных обоев, и эмулируя нажатия на кнопки, перелистывает список до необходимой обоины и устанавливает её.
Теперь более подробно:
Для выполнения описанной выше процедуры, требуется чтобы экран был включён и телефон был разблокирован, для этого необходимо установить дополнение для Таскера — Secure Setting. После установки Secure Settings необходимо в самой программе открыть вкладку Helper и установить этот самый Helper.
Также потребуется программа ManifestExplorer, для чего будет описано ниже.
Кто пользовался Таскером знает что в нём есть функция запуска приложений, но в данном случае использовать её не получится, т.к. встроенный в прошивку установщик Интерактивных обоев не отображается в списке приложений. В телефоне он вызывается либо через Настройки, либо через ланчер. Но раз вызывается через другие программы, значит можно вызвать и через Таскер.
Инструкция:
Всё что описано ниже выполнялось на телефоне Samsung Note2 версия андроида 4.1.2,
на других устройствах и версиях андроида имя пакета установщика Интерактивных обоев может отличаться.
Заходим в ManifestExplorer, нажимаем на верхнюю кнопку и в выпадающем списке находим установщик Интерактивных обоев — в моём случае это
Нажимаем кнопку view — на экране отобразится манифест и если уверены что это то что нам нужно, то нажимаем на аппаратную кнопку Меню, а затем на появившуюся на экране Save in File. В памяти устройства по указанному пути сохранится текстовый файл с содержимым файла Manifest, из которого удобно копировать необходимые нам строки.
Заходим в Таскер, открываем вкладку Tasks, нажимаем на + для добавления новой задачи и даём ей название.
После создания новой задачи, мы видим окно в котором необходимо добавить действия из которых и будет состоять задача.
Первым действием будет пробуждение телефона и включение экрана —
нажимаем на + -> Плагин -> Secure Settings -> кнопка Измен. ->
открывается Secure Settings в котором нажимаем на Wake device -> и выставляем время на которое необходимо включить дисплей — я ставлю не больше 30 сек., нажимаем на значок дискеты чтобы сохранить.
После сохранения настроек попадаем обратно в Таскер
Нажимаем кнопку Назад и видим что первое действие нашей задачи назначено.
Добавляем следующее: нажимаем + -> Разное -> Send intent
Для того, чтобы узнать, что нужно вписать в открывшемся окне, необходимо изучить манифест установщика обоев.
С помощью любого файл менеджера или текстового редактора открываем сохраненный ранее текстовый файл с содержимым манифеста.
Вот содержимое моего:
manifest.xml
Как не сложно догадаться, в строке
Содержится то, что нужно вписать в Таскере в пункте
PACKAGE, а именно — com.android.wallpaper.livepicker
Далее возвращаемся к манифесту,
в нём только в одном месте можно встретить действие intent:
Поэтому в Таскере в пункте Действие смело вписываем — android.intent.action.SET_WALLPAPER,
а в пункте Cat.(Категория) ставим — DEFAULT
В пункте Target выставляем Activity.
На этом настройку второго действия в нашей задаче можно считать законченной. После нажатия кнопки Назад, видим это:
Можно нажать на кнопку в нижнем левом углу и посмотреть как работает настроенная задача.
Если появляется окно с выбором установленных интерактивных обоев, то можно продолжать.
Нажимаем + -> Ввод -> Трекбол и выбираем направление и количество движений.
На следующем скрине можно увидеть как выглядит законченная задача
Когда настройка задачи завершена, нажимаем Назад и переходим на вкладку PROFILES.
Здесь зададим условие при котором наша задача должна выполняться.
Нажимаем + -> Вводим имя профиля -> Время -> я выставляю от 05:00 до 07:00 -> нажимаем кнопку Назад и появляется окно в котором нужно выбрать нашу задачу.
Профиль готов.
В правой части показывается имя задачи, в левой — условие при котором эта задача будет выполняться. Если нажать и держать на левую сторону строки, то появится окно с выбором действий, в котором можно Добавить ещё условия. Нажимаем Добавить -> День и выбираем по каким дням мы хотим видеть эти обои. Вот так выглядит готовый профиль
Так-же я выложил
видео
в котором наглядно показывается вся настройка. Если вы не видите у себя в Таскере каких-либо функций, которые видели в видео, то зайдите в настройки Таскера и вЫключите Begginer Mode
Прикрепленный файл #1:
Источник
Русские Блоги
Процесс установки обоев в Android Wallpaper
Обои Android включают в себя обои для экрана блокировки и обои для рабочего стола, причем обои делятся на статические и динамические. Первое, что мы видим, когда пользуемся мобильным телефоном каждый день — это обои. Красивые обои также значительно улучшают внешний вид телефона (смешно). Давайте узнаем об обоях.
Эта статья основана на исходном коде Android 8.1, соответствующие файлы следующие:
1. Как установить обои в качестве разработчика?
2. Как отображаются обои?
3. Где хранятся обои?
Как установить обои? Дайте каштан.
В наших мобильных телефонах обычно есть приложения со встроенными темами. Вы можете скачать и использовать множество красивых обоев здесь и установить их в качестве обоев экрана блокировки или рабочего стола.
Способ настройки очень простой, смотрите:
Три шага:
1. Добавьте разрешение на установку обоев
2. Получите объект WallpaperManager.
3. Установите обои, четыре параметра соответствуют соответственно:
a.InputStream: входной поток для изображения.
b.visibleCropHint: связано с обрезкой изображения, обычно по умолчанию равно null
c.allowBack: разрешить ли назад
d.which: Обои делятся на обои экрана блокировки и обои рабочего стола, поэтому вам нужно установить FLGA: обои экрана блокировки — WallpaperManager.FLAG_LOCK, обои рабочего стола: WallpaperManager.FLAG_SYSTEM
Как отображаются обои?
Вот простой анализ каждого процесса на рисунке выше:
1.setStream
2.WallpaperManagerService.java#setWallpaper
3. Самый главный метод: WallpaperObserver # onEvent
WallpaperObserver — это внутренний класс WallpaperManagerservice.java. Его основная задача — отслеживать изменения файлов, то есть обновлять файл, соответствующий обоям. Посмотрите на комментарии в исходном коде:
Следите за изменениями обоев и уведомляйте IWallpaperServiceCallbacks, упомянутый выше LockscreenWallpaper наследуется
IWallpaperServiceCallbacks и перепишите его метод onWallppaerChanged, обновите здесь обои экрана блокировки.
Сначала посмотрите на эту часть обновления обоев экрана блокировки:
Где назначается mKeyguardListener:
Ранее мы говорили, что LockscreenWallpaper.java наследует IWallpaperManagerCallback, поэтому вызов setLockWallpaperCallback должен находиться здесь:
4.LockscreenWallpaper.java# onWallpaperChanged:
Обои для рабочего стола Lockscreen Запускаемый интерфейс, поэтому посмотрите на его метод запуска:
5.StatusBar.java#updateMediaMetaData:
В основном это делается для выполнения самого основного setImageBitmap для View, где расположены обои экрана блокировки.
6. Посмотрите раздел обоев рабочего стола:
6.1 b indWallpaperComponentLocked
Об этом упоминалось в начале:
ImageWallpaper наследует Service.Поскольку это bindService, основное внимание уделяется conn, то есть WallpaperConnection.
6.2 Продолжайте смотреть на метод attachServcieLocked:
Если посмотреть на его метод построения, отправляется сообщение DO_ATTACH:
onCreateEngine также является абстрактным методом:
Место реализации по-прежнему находится в ImageWallpaper.java
DrawableEngine — это настраиваемый внутренний класс, наследующий Engine
Наконец, вызовите метод engine.attach.
Метод прикрепления WallpaperService.java:
6.3 onCreate(mSurfaceHolder)
Это абстрактный метод
Это абстрактный метод, поэтому реальная реализация находится в его подклассе — ImageWallpaper.java.
6.4 updateSurfaceSize
6.5 drawFrame
Выполните некоторые операции по вырезанию обоев и определите метод рисования в зависимости от того, поддерживает ли он аппаратное ускорение:
На этом простой процесс установки обоев в основном закончен, как примечание для записи.
Источник