Как сделать приложение галерея
AppGallery это магазин приложений от компании Huawei, который имеет огромное количество пользователей, по некоторым данным около 700 млн на 2020 год. Благодаря захвату доли рынков смартфонов и активному продвижению своих сервисов (HMS) и магазина рост действительно большой.
К тому же это один из самых простых способов выйти на рынок Китая, так как в 2010 году Google ушел из Китая, что привело к отсутствию Google Play на рынке Китая и появлению сотен маленьких магазинов приложений, которые чаще всего не адаптированы под другие языки, кроме Китая, да и публикация в 300+ магазинах может свести с ума любого разработчика.
В этой статье я рассмотрю общие шаги публикации существующего приложения в AppGellery, а по сути адаптацию приложения Google Play под их условия. Также будет несколько отдельных статей, посвященных IAP, выполнению условий для публикации конкретно в Китае и т.д.
Эта статья является одной из цикла статей про публикацию приложения в AppGallery :
- Как опубликовать приложение в AppGallery для Китая, Европы и СНГ
- Тонкости настройки Huawei Mobile Services (AppGallery)
- Особенности публикации приложения для Китая в AppGallery
Первым делом вам нужно зарегистрировать аккаунт huawei, если у вас его всё ещё нет, делается это стандартно, просто перейдите по этой ссылке .
Вот, что вы увидите в первую очередь. Здесь выбираем, что вам подходит. В моём случае я выбрал "Индивидуальный разработчик", возможно какие-то последующие шаги могут отличаться для корпоративных разработчиков.
Перейдя дальше вам предлагает заполнить данные о разработчике, в том числе прикрепить удостоверение личности и фото карточки. Указывайте здесь актуальную и правильную информацию.
После чего происходит проверка введенных данных, я ждал около недели, после чего мне надоело и я написал на почту поддержки, после чего проверку выполнили почти сразу же (не знаю, как сейчас это работает). Контакты тех поддержки . В том числе есть почта для России, соответственно и обращаться можно на русском языке.
После подтверждения аккаунта при первом входе в консоль разработчика вас попросит принять несколько соглашений, можете их прочитать внимательно, но принять всё же придется.
Это ещё не все проверки, что нужно пройти. Если вы планируете продавать приложение (платное приложение) или использовать IAP (покупки внутри приложения), то вам необходимо зарегистрировать аккаунт продавца. Для этого, переходим в меню "Настройки - Служба продавцов".
Банковские реквизиты
Здесь нужно указать банковские данные, куда вам будут переводить заработанные деньги. В том числе нужно загрузить скан файла квалификации, для меня подошла выписка об открытии счета в банке для ИП.
Договор о передаче данных нужно скачать, заполнить, отсканировать и загрузить скан сюда. И подготовить этот документ к отправке в офис в Москве. Без получения оригинала этого документа, вам не подключат службу продавцов.
Я сначала отправлял документ заказным письмом через Почту России, но этот документ завис у них в отделении, как оказалось никто из компании не пойдет забирать заказное письмо. Поэтому пришлось заказать услуги доставки в курьерской службе. И даже когда письмо доставили, пришлось пару раз писать в компанию, чтобы они нашли мой документ и подтвердили данные.
Налоговые данные
В налоговых данных также нужно указать свидетельство о постановке на налоговый учет (скан) и актуальные налоговые данные.
Шаг 2. Региональное разделение приложений
После того, как вам подтвердили аккаунт разработчика и продавца, вы можете приступать к интеграции SDK. Аккаунт продавца нужен только в случаях, если вы планируете продавать приложение или использовать IAP. Если единственный способ монетизации для вас реклама — вероятнее всего вы можете пропустить этот шаг.
К сожалению, AppGallery перенял не все удобства Google Play. Одна из проблем — хранение данных. По законодательству Китая и России данные пользователей должны храниться, соответственно на территории Китая и России. Помимо этого ещё есть Европа, потенциально вы можете хранить данные пользователей Европы в России или в Китае, но для них есть свои сервера в Германии.
Надеюсь не сильно вас запутал, перейдем в делу. Для каждого приложения вам нужно будет создать 3 версии приложения (flavors) и 3 проекта в консоли AppGallery.
What You'll Be Creating1. Что такое Glide?
Glide это популярная библиотека Android с открытым исходным кодом для загрузки изображений, видео и анимированных GIF. С Glide можно загружать и отображать медиа из разных источников, например удаленных серверов или из локальной файловой системы.
2. Так зачем использовать Glide?
Разработка своего собственного функционала для отображения и загрузки медиа на Java может оказаться настоящей головной болью: вам нужно будет позаботиться о кешировании, декодировании, управлении сетевых соединений, потоков, обработке исключений и о многом другом. Glide — это простая в использовании, хорошо спланированная, хорошо документированная и тщательно протестированная библиотека, которая поможет сохранить вам уйму времени — и избавить вас от головной боли.
В этом уроке, мы будем изучать Glide 3, создавая на нем простую галерею изображений. Изображения будут загружаться из интернета и отображаться миниатюрами в RecyclerView; пользователь нажимает на изображение и открывается детальная активити с изображением побольше.
3. Создаём проект в Android Studio
Запустите Android Studio и создайте новый проект с пустой активити под названием MainActivity .
2. Объявление зависимостей
После создания нового проекта, укажите следующие зависимости в build.gradle .
Или с помощью Maven:
Убедитесь, что вы синхронизации ваш проект после добавления зависимостей Glide.
Интеграция библиотек
Volley
Вы можете посетить официальное руководство по интеграции библиотек Glide для получения дополнительной информации.
3. Добавляем разрешение на использование Интернета
Так как Glide выполняет сетевой запрос для загрузки изображений через Интернет, нам нужно включить разрешение на INTERNET в нашем AndroidManifest.xml.
4. Создаём макет
Начнем с создания нашего RecyclerView .
Создание пользовательских элементов макета
Далее создадим структуру XML, которая будет использоваться для каждого элемента ( ImageView ) внутри RecyclerView .
Теперь, когда мы создали макет, следующим шагом будет создание RecyclerView адаптера для заполнения данных. Хотя, прежде чем мы это сделаем, давайте создадим нашу простую модель данных.
5. Создание модели данных
Мы определим простую модель данных для наших RecyclerView . Эта модель реализует Parcelable для высокой производительности передачи данных из одного компонента в другой. В нашем случае данные будут переноситься из SpaceGalleryActivity в SpacePhotoActivity .
6. Создаем адаптер
Создадим адаптер для заполнения RecyclerView данными. Также реализуем прослушиватель нажатия, чтобы открывалась активити с детализацией — SpacePhotoActivity , передавая экземпляр SpacePhoto в дополнение. Актвити детализации будет показывать изображение крупным планом. Мы создадим его в следующем разделе.
7. Загрузка изображения по URL
Вот тут нам и понадобится Glide, чтобы получить изображения из Интернета и отобразить их в отдельных ImageView , используя наш метод onBindViewHolder() в RecyclerView, когда пользователь прокручивает содержимое приложения.
Шаг за шагом, как мы будем применять Glide:
- with(Context context) : мы начинаем процесс загрузки с передачи нашего первого содержимого в метод with() .
- load(String string) : источник изображения указан либо как путь к каталогу, URI или URL адреса.
- placeholder(int resourceId) : идентификатор локального ресурса приложения, желательно использовать "drawable", то что будет показано пока не загрузится и отобразится нужное изображение.
- into(ImageView imageView) : представление изображения, куда будет помещено настоящее изображение.
Помните, что Glide также может загружать локальные изображения, по идентификатору Android ресурса, по пути к файлу или Uri в качестве аргумента метода load() .
Изменение размера изображения и преобразование
Вы можете изменить размер изображения, прежде чем оно отобразится в ImageView с методом Glide .override(int width, int height) . Это полезно если ваше приложение создает превьюшки, при загрузке изображения с сервера с другими размерами. Обратите внимание, что размеры в пикселях, а не dp.
Также доступны следующие преобразования изображения:
- fitCenter() : масштабирует изображение равномерно (сохраняя пропорции изображения) так, чтобы изображение вместилось в данную область. Изображение будет видно целиком и может быть иметь вертикальный или горизонтальный отступ.
- centerCrop() : масштабирует изображение равномерно (сохраняя пропорции изображения) так, чтобы изображение заполняло данную область, показав изображение по возможности полностью. При необходимости, изображение будет обрезано по горизонтали или вертикали, для соответствия размеру.
8. Инициализация адаптера
Теперь создадим RecyclerView с GridLayoutManager как менеджер компоновки, инициализируем адаптер и привяжем его к RecyclerView .
9. Создание активити для детализации
Создадим новую активити и назовем ее SpacePhotoActivity . Мы получим SpacePhoto и загрузку изображений с Glide, как мы делали это ранее. Здесь мы ожидаем файл или URL для Bitmap , поэтому мы будем использовать asBitmap() , для того, чтобы Glide получил Bitmap . В противном случае загрузка завершится ошибкой и сработает вызов .error() — тогда будет возвращен и показан ресурс drawable из вызванной ошибки. Также можно использовать asGif() , если вы хотите проверить, что загружаемые изображения являются GIF. (Я вскоре объясню, как работает GIF в Glide).
Обратите внимание, что мы также инициализируем уникальный кэш для загрузки изображений: DiskCacheStrategy.SOURCE . Я расскажу подробнее о кэшировании в следующем разделе.
Макет детального вида
Вот макет для отображения активити детализации. Он просто отображает прокручиваемый ImageView , который будет показывать полноразмерное изображение.
10. Кэширование в Glide
Если посмотреть внимательно, вы увидите, что когда вы возвращаетесь к изображению, которое было загружено ранее, оно загружается быстрее, чем раньше. Так почему быстрее? Система кэширования Glide, вот почему.
Как только изображение было загружено с интернета, Glide сохранит его в памяти и на диске, сохранив от повтора сетевых запросов и позволив быстрее получить изображение. Таким образом, перед загрузкой изображения из сети, Glide сначала проверяет наличие изображения в памяти или на диске.
В зависимости от вашего приложения, вы можете пожелать отказаться от кеширования — например, если отображаемые изображения будут часто изменяться.
Как отключить кэширование?
Вы можете отказаться от кэширования в памяти путем вызова .skipMemoryCache(true) . Но имейте в виду, что изображения по-прежнему будут кэшироваться на диске — для предотвращения этого — используется метод .diskCacheStrategy (DiskCacheStrategy strategy) , который принимает одно из следующих значений:
- DiskCacheStrategy.NONE : данные не сохраняется в кэше.
- DiskCacheStrategy.SOURCE : исходные данные сохраняются в кэше.
- DiskCacheStrategy.RESULT : сохраняет результат данных после преобразований в кэше.
- DiskCacheStrategy.ALL : кэширует исходные и преобразованные данные.
Чтобы отключить оба кеширования и в памяти и на диск, просто вызовите оба метода один за другим:
11. Прослушивание запросов
В Glide можно применить RequestListener для отслеживания состояний запроса, сделанного при загрузке изображения. Будет вызван только один из методов.
- onException() : срабатывает всякий раз, когда возникает исключение, так что вы можете обрабатывать исключения в этом методе.
- onResourceReady() : срабатывает, когда изображение загрузилось успешно.
Вернемся к нашему приложению галереи изображений и немного изменим отображение, с помощью объекта RequestListener , который будет назначать растровое изображение для ImageView , а также изменим фоновый цвет путем извлечения темного оттенка, в зависимости от цвета изображения с помощью API палитры Android.
Здесь можно также скрыть диалоговое окно прогресса, если оно у вас есть. С этим последним измененим не забудьте включить зависимость от Палитры в ваш build.gradle :
12. Тестируем приложения
Наконец, можно запустить приложение! Нажмите на превьюшку, чтобы полуить полноразмерное изображение.
10. Анимации
Когда вы запустите приложение, вы заметите crossfade анимацию при отображении изображения. Это по умолчанию включено в Glide, но вы можете отключить его путем вызова dontAnimate() , так что изображение будет просто отображаться без каких-либо анимации. Вы также можете изменить эту анимацию затухания путем вызова crossFade(int duration) , указав продолжительность в миллисекундах, либо ускорить ее или замедлить, значение по умолчанию — 300 миллисекунд.
Анимированные GIF
Показывать анимированные GIF в вашем приложении через Glide очень просто. Это работает так же, как отображение обычного изображения.
Если вы ожидаете GIF изображение, вызовите asGif() — это настроит Glide на получение GIF изображения, в противном случае загрузка завершится ошибкой и вместо этого будет показан Drawable , переданный методом .error() .
Воспроизведение видео
К сожалению Glide не поддерживает загрузку и отображение видео через URL. Вместо этого, он может только загружать и отображать видео с телефона. Показать видео можно передав его URI в метод load() .
Заключение
Отличная работа! На этом уроке вы построили полноценное приложении галереи с Glide и по пути узнали как работает эта библиотека и как вы можете интегрировать ее в свой собственный проект. Вы также узнали, как отображать локальные и удаленные изображения, как показывать анимированные GIF-файлы и видео, как применять преобразования изображения, на примере изменения размеров. И не только это. Вы видели, как легко можно включить кэширование, обработку ошибок и прослушиватьель запросов.
Чтобы узнать больше о Glide, обратитесь к ее официальной документации. Чтобы узнать больше о написании приложений для Android, посмотрите некоторые из наших других курсов и уроков на Envato Tuts+!
Стандартная галерея изображений для Android 4.x успешно справляется с возложенной на нее задачей — просмотром изображений. По умолчанию поддерживаются следующие форматы, встроенные в ядро ОС: JPEG, GIF, PNG, BMP, WebP (согласно официальному перечню мультимедийных форматов).
- Просмотр изображений: дополнительные режимы просмотра и способы категоризации
- Наличие дополнительных (в т. ч. пакетных) файловых операций
- Считывание метаданных, работа с тегами
- Онлайн-функции: поддержка социальных и облачных сервисов
- Редактирование (хотя, в принципе, для этих целей предназначены специализированные приложения)
На этих возможностях мы и остановимся подробней. Для детального обзора были отобраны три галереи — они имеют сравнительно полный комплекс функций. Помимо этого, нельзя не упомянуть другие галереи изображений, перечисленные в рубрике «Заслуживают внимания».
JustPictures!
JustPictures! — мультиплатформенный просмотрщик стандартных форматов изображений и органайзер для ОС Android 1.5 и выше. Продукт, в первую очередь, выделяется за счет интеграции с облачными и социальными сервисами. Их перечень достаточно широк: Picasa, Flickr, Smugmug, Photobucket, Deviant Art, Imgur, MediaRSS, Windows Live, Tumblr и прочие. Галерея JustPictures! нетребовательна к прошивке (Android 1.6>) и работает на старых устройствах.
Просмотр изображений
Запустив программу, пользователь попадает в интерфейс добавления локальных записей и онлайн-сервисов. На главной странице локальной учетной записи файлы отображаются в хронологическом порядке: за последние 7 дней, 30 дней, 90 и т. д. Порядок сортировки можно изменить — по названию, ключевым словам (тегам) и размеру. Каких-либо режимов отображения для эскизов, помимо вертикального списка, в наличии нет.
Поддержка метаданных
Как уже было сказано, в JustPictures! доступна навигация по тегам. Их можно добавлять вручную через контекстное меню выбранных элементов — в индивидуальном и пакетном режиме.
Кроме установленной даты, можно использовать информацию из метаданных изображения (при наличии EXIF в файле).
Также JustPictures! позволяет указывать местоположение фото, искать координаты на мини- и увеличенной карте — как для изображения, так и для альбома.
Файловые операции
Управлять файлами через галерею вполне удобно. При выделении элементов, в контекстном меню доступны операции: выделение, удаление, перемещение, редактирование меток и преобразование. Для пакетного режима также можно использовать соответствующие опцию меню. Помимо основных файловых операций, следует отметить загрузку и передачу файлов по MMS или Email.
Непривычно то, что в JustPictures! нельзя выделить файл длительным нажатием, необходимо активировать пакетный режим. Поддерживается весьма ограниченный набор жестов, что сказывается на удобстве не в лучшую сторону.
Онлайн-функции
Говоря об интеграции с веб-сервисами, в первую очередь следует обратить внимание на пакетную и индивидуальную загрузку изображений на хостинг Picasa, Facebook, Flickr, Smugmug, Photobucket и Imgur.
Еще один «плюс» совместного использования учетных записей JustPictures! — возможность поиска по нескольким аккаунтам одновременно (по заголовкам, тегам и проч.). При поиске учитываются теги из Picasa, Flickr, Smugmug, Tumblr и Deviant Art.
И, наконец, третий аспект интеграции — отслеживание обновлений для подключенных сервисов (кроме Flickr и Photobucket).
Однако, как ни привлекательны онлайновые возможности, на практике пользователь сталкивается с неудобным интерфейсом подключения учетных записей. Через менеджер входа в систему достаточно непросто авторизоваться, а в последней версии JustPictures (на момент обзора) добавление аккаунта было и вовсе недоступно.
Редактирование
Редактор JustPictures! не отличается какими-либо особенностями. Доступны перемещение, удаление и поворот локальных файлов. Использовать редактор для более сложной обработки фото (наложения фильтров, рисования) не получится.
QuickPic
Согласно статистике Google Play, QuickPic — одна из наиболее известных альтернативных галерей для ОС Android 2.0 и выше. Совмещает в себе функции органайзера и графического редактора. Аналогично JustPictures!, в QuickPic доступно подключение облачных сервисов.
QuickPic работает со стандартным перечнем форматов, с некоторыми особенностями: в частности, доступен показ GIF-анимации и стандартных видеофайлов. Для прозрачных фото может быть указан альфа-канал (слой прозрачности).
Просмотр изображений
Режимов просмотра всего три: галерея, сетка и список. В дополнение к этому, в меню есть опция «Проводник» — просмотр файловых путей непосредственно в окне просмотрщика. При этом, также доступны эскизы папок, удобные для просмотра вложенных элементов. Все это способствует удобной навигации и быстрому управлению файлами.
По умолчанию, пользователю доступны все изображения, найденные на карте. Для большего удобства и быстрого поиска можно включить только указанные для отображения папки и, соответственно, скрыть неиспользуемые.
В боковой панели QuickPic можно переключиться на просмотр с группировкой по каталогам либо дате — зачастую проще найти фото с камеры, просматривая в хронологическом порядке.
Стоит отметить удобное управление «в стиле iPhone»: можно двигать и перелистывать изображения, изменять масштаб одинарным или двойным нажатием, по усмотрению пользователя.
Было замечено, что иногда просмотр фото в QuickPic происходит с небольшими зависаниями, однако в настройках можно включить кэш для миниатюр — это позволяет ускорить полноэкранный вывод изображений.
В целях защиты конфиденциальных данных, в QuickPic предусмотрена парольная защита. Установив мастер-пароль, пользователь может создать защищенную область в памяти устройства — изображения будут скрыты из общего доступа. Соответствующая опция расположена в настройках QuickPic под названием «Защита скрытых папок». Впрочем, защита эта весьма ненадежна: снимается она простой деинсталляцией или удалением приложения.
Поддержка метаданных
QuickPic считывает геоданные изображения, возможен просмотр координат на карте. В сведениях файла доступна к просмотру вся EXIF-информация о файле: разрешение, камера, формат, дата съемки. Если требуется скорректировать дату файла, можно обратиться в контекстное меню и перезаписать данные из EXIF. Действие это применимо только к индивидуальным файлам; т. е., изменить дату в пакетном режиме не получится.
При работе с веб-сервисами можно также просматривать метаданные: дату съемки, местоположение, формат файла и проч.
Файловые операции
В меню QuickPic присутствуют стандартные команды управления файлами — сортировка, переименование, создание папок, копирование и перемещение изображений. Из пакетных операций примечательно групповое переименование по маске.
При обнаружении устройств в сети, доступна передача файлов по WiFi, с возможностью отслеживания очереди.
Онлайн-функции
Облачные возможности приложения — просмотр фото для учетных записей Google Drive, Dropbox, OneDrive. Также порадовала поддержка специализированных фотохостингов: Picasa, Flickr, 500px. Интеграция с социальными сервисами, вроде Facebook, не предусмотрена.
Просматривая изображения на сервере, можно переключаться между сеткой и списком, сортировать файлы по названию и дате. В случае с облачными сервисами, предусмотрена выборочная синхронизация.
И хотя выбор веб-сервисов не так широк, как в JustPictures!, в QuickPic нет проблем с авторизацией. Несложно добавить аккаунт выбранного сервиса — и в дальнейшем он отображается в навигации боковой панели.
Редактирование
В углу галереи QuickPic доступна кнопка камера. Ожидалось, что после съемки можно применить к фото быстрые эффекты. Но единственно возможное действие здесь — это снять фото и вернуться в обратно галерею.
Функции встроенного в QuickPic графического редактора включают в себя отражение по вертикали и горизонтали, кадрирование, изменение разрешения. В целом, для редактирования следует использовать специализированные редакторы, о которых пойдет речь в следующем выпуске.
F-Stop Media Gallery
F-Stop Media Gallery — органайзер и просмотрщик стандартных форматов для Android 4.0 и выше. В бесплатной версии приложения отображается реклама.
Просмотр изображений
Для просмотра фотографий в галерее имеется 4 режима отображения — сетка, список, расширенный список и большие миниатюры. Сетка и расширенный список демонстрируют папки со вложенными файлами в виде эскизов. В режиме списка можно видеть дату создания и расположение файлов. Большие миниатюры располагаются на экране в виде столбцов. И хотя последний режим не столь информативен, он будет полезен при работе на планшете.
Сортировать файлы можно по имени, дате изменения и количеству файлов (в случае с папками).
Для быстрой навигации используется боковая панель. На нее можно добавить быстрые ссылки, используя контекстное меню папки. Единичные же файлы можно добавить только в избранное.
Помимо папок, F-Stop позволяет создавать альбомы и «умные» альбомы. В первом случае, речь идет о ручном добавлении файлов в созданный каталог, во втором — можно выбрать определенные папки, включив или исключив из них подкаталоги. Альбом автоматически заполнится фотографиями, подходящими под заданные критерии, взятые из EXIF (дата съёмки, теги, оценки и т.п.).
Полезная функция, идентичная QuickPic — защищенное хранилище. Принципы ограничения доступа те же: устанавливается мастер-пароль, в специальную область добавляются папки.
В принципе, эта защита формальна и привязана к QuickPic. Кроме того, не идеально реализован сам интерфейс добавления: скажем, через контекстное меню либо для отдельного файла установить защиту нельзя.
Поддержка метаданных
Касательно метаданных, в F-Stop Media Gallery более всего интересны теги и оценки (от 1 до 5) — их можно сохранить напрямую в JPG или внешний файл, после чего можно просматривать изображения, сгруппированные по указанным тегам. Причем за каждым изображением может быть закреплено несколько меток.
Помимо того, в Media Gallery можно получить сведения из EXIF-, XMP- и IPTC метаданных.
Файловые операции
В контекстном меню галереи расположены стандартные файловые операции плюс команды связанные с метаданными (о которых сказано выше). Пакетные операции в галерее выполнять удобно — достаточно выделить файлы длительным нажатием и выбрать требуемую операцию.
Онлайн-функции
В Media Gallery онлайн-функции никак не представлены. Отправка в популярные приложения (такие как Facebook, Twitter, Instagram, Dropbox, Picasa, Skitch, Evernote, Google+) доступна через системное меню Android.
Редактирование
В приложении нет собственного редактора изображений, но возможен экспорт в другие программы, в т. ч. внешние редакторы.
Резюме
Галерея JustPictures! удобна в качестве органайзера: доступны варианты отображения, сортировка, поддерживаются EXIF-метатеги. Вместе с широкой веб-интеграцией, приложение позволяет загружать файлы на подключаемые сервисы. Из недостатков — неудобное добавление учетных записей и слабая поддержка жестов.
QuickPic можно предложить в качестве замены стандартной галереи — с расширенной поддержкой жестов, информативными режимами отображения, веб-интеграцией. Интеграция достаточно удобна для просмотра фотографий учетных записей. Для полноты функций, недостает возможности скачивания файлов в память телефона и загрузки с устройства на сервер (как это реализовано в JustPictures!).
F-Stop Media Gallery можно посоветовать пользователям, которым важны настройки отображения картинок, категоризация по тегам, альбомам и рейтингу. Галерея дает максимально подробные сведения о метаданных, позволяя вносить в них изменения. Интеграция с веб-сервисами здесь не реализована — что при таком наборе функций не является существенным недостатком.
Заслуживают внимания
Secure Gallery — Gallery Lock
В результате, фотографии и видео будут скрыты — по крайней мере, из списка в основной галерее. Для получения доступа к закрытым файлам не нужно совершать множество манипуляций: разблокировка осуществляется в 3 клика. Правда, аналогично галереям с функцией парольной защиты, действие Gallery Lock ограничено рамками собственно приложения, а пароль легко убрать, деинсталлировав галерею.
Приложение имеет очень аскетичный набор функций, файловые операции и другие особенности просмотрщика здесь недоступны.
Gallery KK — Gallery ICS
Улучшенная версия официальной галереи для Android KitKat. Примечательная особенность — наличие фоторедактора с возможностью применения быстрых фильтров, что бывает полезно при обработке фото с камеры смартфона или планшета. В редакторе можно повернуть изображение, кадрировать его, нарисовать произвольную фигуру. В Gallery KK даже доступен «монтаж» — обрезка видео.
В настройках приложения можно указать режим вывода эскизов (количество колонок при ландшафтном и портретном отображении), сортировки (по имени и дате). Благодаря поддержке метатегов, также доступен просмотр изображений по альбомам, местам, датам и др. параметрам.
Из других особенностей: Gallery KK позволяет определить размер и цвет эскизов, быстро скрыть ненужные папки.
MyRoll (Flayvr)
В галерею MyRoll входит множество интересных функций, среди них — органайзер фото, персонализация, обмен файлами и обнаружение устройств.
Основная особенность Flayvr, которая выделяет приложение на фоне, — показ "моментов" во временной ленте. По сути, это способ распределения фотографий по датам, аналогично timeline в Facebook. Моменты можно редактировать (изменять обложку, местонахождение), добавлять их в избранное. Предусмотрен экспорт — создание альбом на Facebook, отправка по email, предоставление ссылки на публикацию.
Cyanogen Gallery
Эта надстройка Cyanogen включена в одноименную прошивку Android. Главная особенность галереи — облачная синхронизация. Поддерживаются следующие сервисы с возможностью хранения фотографий: Flickr, Picasa, Dropbox и Facebook.
Вторая особенность и выгодное отличие от штатной галереи Android — умные папки. Их наполнение зависит от установленных пользователем фильтров на основе метаданных изображений. Таким образом, за счет умных папок, можно удобно организовать коллекцию, не прибегая к ручной сортировке.
Наконец, третий отличительный момент Cyanogen Gallery — применение быстрых фильтров и создание рамок для фотографии в редакторе.
Photo Gallery 3D & HD
Photo Gallery 3D & HD — трехмерная галерея для Android. Примечательна именно тем, что за счет гибкого управления придает фотогалерее большую интерактивность. Кроме того, понравится любителям эффектов и «красивостей».
Что касается поддерживаемых форматов, в списке числятся BMP, JPEG, GIF, PNG, PCX, TIFF, WMF, ICO и TGA — некоторые из них, как можно отметить, не включены в ядро Android.
В Photo Gallery имеется редактор с набором простейших действий: обрезка изображения и поворот. В этом плане приложение не дотягивает до стандартной галереи.
Piktures — Photo Album Gallery
Piktures — бесплатный просмотрщик изображений и видео для платформы Android 4.0 и выше. В наличии: широкая поддержка жестов, изменение размеров картинок, скрытие альбомов, несколько режимов просмотра. Отдельно стоит отметить календарное отображение с вертикальным скроллингом. Piktures считывает метатеги — так, доступен просмотр фото по локациям (фильтр по городам).
Касательно социальных функций — доступна отправка файлов через GMail, Facebook и WhatsApp.
Редактирование фото в Piktures возможно только через внешний редактор, однако доступно изменение размеров изображений с применением профилей (VGA, HD, Full-size).
Войти
Авторизуясь в LiveJournal с помощью стороннего сервиса вы принимаете условия Пользовательского соглашения LiveJournal
Галерея
В этом уроке расскажу как сделать галерею в приложениях android. Начнем с простой галереи и затем немного ее украсим.
1. Для работы с галерей используется класс Gallery. Напишем его в разметке xml:
- <Gallery
- android:id = "@+id/gallery"
- android:layout_width = "fill_parent"
- android:layout_height = "wrap_content"
- />
У меня в разметке еще есть текстовое поле (TextView) c id «selected», в который я буду выводить номер выделенного изображения в галереи.
2. Так же как и в списках (ListView) или в таблицах (GridView) для работы с галерей используется адаптер — класс унаследованный от BaseAdapter. Про него я уже писала в статьях Списки и Игра для тренировки памяти. При наследовании от класса BaseAdapter необходимо обязательно описать 4 метода:
public int getCount() - кол-во элементов (в данном случае в галерее)
public Object getItem(int position) — возвращает значение элемента с номером position
public long getItemId(int position) — возвращает ID элемента с номером position
public View getView(int position, View convertView, ViewGroup parent) — возвращает View, который будет является элементом с номером position.
3. Для представления галереи в android есть предопределенный стиль, который рисует для каждого элемента серую рамку (для выделенного — светло-серую). Называется стиль galleryItemBackground. Как мы знаем, чтобы задать фон или стиль в программе используется идентификатор типа R.drawable.image, причем image должен лежать в директории /res/drawable нашего проекта. Но стиль galleryItemBackground является системным и для того чтобы получить идентификатор создадим в /res/values файл (например attrs.xml) и напишем туда
- <?xml version = "1.0" encoding = "utf-8" ?>
- <resources >
- <declare-styleable name = "MyGallery" >
- <attr name = "android:galleryItemBackground" />
- </declare-styleable >
- </resources >
Это ресурс стиля, который будет применен к каждому элементу помещеному в галерею. Элемент attr определяет конкретный атрибут. Таких элементов может быть несколько.
4. Теперь напишем собственно класс GalleryOne унаследованный от Activity
Основные места прокомментированы, так что должно быть все понятно. Более подробно расскажу про использование стиля galleryItemBackground. Для работы с такими стилями используется класс TypedArray, который является массивом. Инициализируется экземпляр класса с помощью obtainStyledAttributes() или obtainAttributes(). Метод obtainStyledAttributes() возвращает атрибуты прочитанные из ресурса styleable (то есть все элементы attr из attrs.xml).
Метод getResourceId(int index, int defValue) — возвращает идентификатор ресурса.
После работы с экземпляром класса TypedArray, его обязательно надо очистить с помощью метода recycle();
Таким образом мы получаем id ресурса для предопределенного стиля galleryItemBackground, который можем передать в метод imageView.setBackgroundResource().
6. Если посмотреть исходники андроида, то можно найти, что galleryItemBackground, это не какой-то неизвестный кот в мешке, а вполне понятный файл ресурса drawable и выглядит он приблизительно так:
selector определяет drawable, значение которого меняется в зависимости от состояния. Поэтому если мы хотим сделать собственный стиль, можно скопировать этот код в файл в директории /res/drawable (у меня это bg.xml) и заменить «@drawable/. » на собственные изображения. Мне обрабатывать столько состояний объекта ни к чему, я хочу чтобы выделенный элемент (или элемент в фокусе) был в рамочке, а все остальные никак не выделялись. Напишем в bg.xml такое:
7. Теперь надо немного изменить наш класс. Прежде всего уберем все что связано с TypedArray из конструктора ImageAdapter и в методе getView() изменим строчку imageView.setBackgroundResource(R.drawab le.bg);
Рамочка нарисовалась, но картинки налезают друг на друга. Определим для галереи атрибут spacing (расстояние между элементами). Это можно сделать в gallery.xml или в самом коде. А также поставим для каждого элемента атрибут padding (расстояние между границей элемента и его содержимым). Итого получилось такое: (в комментариях показано какие строчки добавились, а какие надо удалить)
10. Менять в зависимости от состояния можно не только фон, но и само изображение. Для каждой картинки создадим ее черно-белую копию (если изначальный файл s01.jpg, то копия будет s01_gray.jpg). Также создадим для каждой картинки файл (например d01.xml) в директории /res/drawable.
То есть для выбранного элемента будет использоваться картинка s01.jpg, а для невыбранного s01_gray.jpg
11. В коде нам необходимо заменить массив ресурсов на
private int[] mImageIds = <
R.drawable.d01, R.drawable.d02, R.drawable.d03, R.drawable.d04,
R.drawable.d05, R.drawable.d06, R.drawable.d07, R.drawable.d08,
R.drawable.d09, R.drawable.d10>;
Вместо изображений s01, s02. s10, будут браться файлы drawable d01, d02. d10. И уберем добавление фона изображения, то есть строчку imageView.setBackgroundResource(R.drawab le.bg);
13. Метод getView() адаптера возвращает не ImageView, а просто View. А значит элементом галереи необязательно должно быть изображение. Там может быть TextView (текстовое поле), Button (кнопка) или даже LinearLayout содержащий несколько элементов. В статье про списки мы уже такое делали. Там мы делали это с помощью класса LayoutInflater, сейчас посмотрим как сделать это без него. Добавим к нашим мордочкам текст. Для этого после массива с картинками, определим массив с строками
private String[] mStrings = "Winking", "Laughting", "Surprised", "Upset", "Angry">;
И допишим метод getView ()
14. Вначале мы определяем изображение imageView (оно ничем не отличается оттого что у нас уже было). Затем определяем textView, устанавливаем ему значение из массива mStrings. Располагаем текст по центру, шрифт моноширинный 10pt. Цвет текста также должен меняться в зависимости от состояния элемента, поэтому добавим в /res/color файл text.xml
И наконец создаем вертикальный LinearLayout и добавляем в него картинку и текст.
15. Запускаем
Мы посмотрели как создать галерею в android и несколько способов ее представления. В папке исходников лежат все 4 примера галерей.
Недавно Google прекратил сотрудничество с Huawei. Это привело к тому, что Huawei на своих новых девайсах уже не может использовать сервисы Google (магазин приложений, геолокация, карты, пуши, аналитика etc), что для пользователя превращает девайс в кирпич. Если бы это не была китайская компания, то, скорее всего, на этом её бизнес, связанный с Android, просто бы прекратился. Но компания китайская, большая и они пошли по пути импортозамещения, в кратчайшие сроки реализовав функционал, аналогичный Google сервисам.
В этой серии статей мы хотим поделиться своим опытом использования Huawei Mobile Services в уже готовом приложении, использующем Google Mobile Services для аналитики (Firebase Analytics), карт и геолокации. Текста получилось довольно много и о сильно разных сервисах, засим статей будет несколько. Начнём мы с основ — регистрации аккаунта разработчика и базовых вещей в коде.
- Создаём аккаунт разработчика, подключаем зависимости, подготавливаем код к внедрению. ← вы тут
- Встраиваем Huawei Analytics. тык
- Используем геолокацию от Huawei.
- Huawei maps. Используем вместо Google maps для AppGallery.
Если вам интересно узнать технических подробностей, посмотреть код и узнать про подводные камни — эта серия статей вам будет полезна!
Всё было бы просто, если бы приложение писалось с нуля и не нужно было бы поддерживать как Google так и Huawei. Но мы живём в реальном мире и без сложностей не обойтись. Однако дело сильно упростится, если соблюдён ряд условий.
Но перед перечислением условий надо составить ТЗ. Оно у нас получилось такое:
1. Нам нужно получить 2 версии APK — одну для Google Play, с библиотеками от Google, другую — для AppGallery, с библиотеками от Huawei.
2. В приложении уже используется Firebase Analytics. Надо его заменить на аналог от Huawei.
3. Есть определение местоположения пользователя. Аналогично заменяем на аналог.
4. Есть карты. Нужно также заменить на аналог, по максимуму сохранив функционал, т.к. в реализации от Huawei некоторые вещи ещё не сделаны.
А вот что сильно сократит прикладываемые усилия:
1. Код должен быть написан хорошо. И быть без багов (хотя это само собой разумеется — зачем код с багами писать?). Под хорошо будем подразумевать более-менее стандартную архитектуру, мимикрирующую под Clean.
3. Использование DI. Очень упрощает абстрагирование над аналитикой и геолокацией. Используем интерфейсы, через DI передавая нужную реализацию.
4. Карты не слишком сильно кастомизированы. В частности, основная сложность будет с абстрагированием над кластеризацией маркеров.
Как и в случае с Google, надо зарегистрироваться, создать проект приложения, получить файл конфигурации.
2. Принимаем всякие соглашения об обработке персональных данных. Внимательно читая, конечно же)
3. Создаём проект приложения, указывая пакет (он же ApplicationId).
5. Включаем сервис аналитики. В отличие от геолокации и карт, включённых по умолчанию, это нужно сделать вручную.
6. Добавляем SHA-256 для всех ключей, которыми будет подписано приложение. Т.е. дебажные ключи и релизный ключ.
7. Скачиваем аналог `google-services.json`, в случае Huawei называемый `agconnect-services.json`
8. Создаём разные flavors для Google и Huawei. Наконец-то можно перейти к коду:
В build.gradle (module app) создаём flavors и указываем, что в папках src/google/kotlin, src/google/res, src/huawei/kotlin, src/huawei/res также находиться будет наш код.
Также создаём папки src/huaweiDebug и src/huaweiRelease. В них помещаем наш файл конфигурации agconnect-services.json
И добавляем apply plugin: ‘com.huawei.agconnect’ в конец build.gradle (module app).
И наконец, добавляем в build.gradle проекта:
Теперь мы полностью готовы. У нас есть 2 разных варианта сборки — для Huawei и Google. У нас подключены необходимые зависимости. Созданы папки, где будет наш код. Создан аккаунт разработчика и выполнены необходимые действия по созданию проекта приложения. У нас даже какое-то ТЗ есть. И мы уже выполнили первый пункт из ТЗ! Отличный повод на этом статью закончить. И уже в следующей — встроить аналитику не от Google, а от Huawei.
Читайте также: