CategoryРазработка

Сборка библиотеки FFmpeg для Android приложения

Есть не так много библиотек, которые позволяют добавить функционал ffmpeg в ваше Android приложение. А если говорить про отсутствие в проекте NDK, то количество вариантов практически стремится к нулю. Я давно уже познакомился с ffmpeg-android, которую собственно и использую в приложении Selfie Timelapse App, однако все чаще и чаще приходилось сталкиваться с проблемой практически нулевой поддержки разработчиков.

Так, к примеру, ковыряться с библиотекой пришлось впервые, когда понял, что размер проекта меня не устраивает (чуть меньше 30 мегабайт). Оказалось, что в aar файл зашит скомпилированный ffmpeg для архитектур ARM и x86. Так как последних довольно мало (по крайней мере устройства на этой архитектуре мне лично не встречались), то я решил удалить ее поддержку из проекта.

Размер готового файла при этом стал колебаться в районе 20 мегабайт.

После появилось желание обновиться до последней версии ffmpeg (в библиотеке зашита версия 3.0.1). Пришлось очень сильно гуглить, чтобы получить приемлемый результат.

Continue reading

Скриншоты приложения: хорошая новость, плохая новость и нейтрализующая

Не так давно открыл для себя сервис, с помощью которого можно достаточно быстро делать скриншоты для приложения (есть такая штука в Google Play и AppStore, если кто уж совсем не в курсе что здесь происходит) — https://theapplaunchpad.com/ Как мы недавно обсуждали это на AppTractor.ru, этот сервис не уникальный, но мне как-то сразу он понравился.

К плюсам я отнес:

Continue reading

Как сделать электронную книгу из блога на LiveInternet.ru

Используя Android, саму площадку и Calibre для OS X.

Давайте начнем с того, что LiveInternet.ru — это мертвая площадка.

По крайней мере на основе информации, которой я владею. Все что я вижу там — это древний устаревший интерфейс с кучей рекламы и непонятными перспективами. Возможно, я не прав, может, кто-то активно пользуется этой платформой, а про всякие Medium, Golos.io и даже ЖЖ думает — вот людям заняться нечем, напридумывали разного.

С другой стороны, когда-то liveinternet.ru был довольно активной блог-платформой, так что вполне возможно, что у кого-то там хранится архив наивных мыслей, которые — вот внезапность — вдруг захотелось перечитать на сон грядущий. Имея в наличии такой же набор инструментов, что и я, можно эту хотелку реализовать.

Continue reading

Возня с ImageMagick и FFMPEG

Итак, братцы-акробатцы, я немного поразгребал чудные вещи, которые предоставляет ImageMagick и ffmpeg (конкретно — для morph transition между кадрами) и получил следующие результаты.

Самое простое — это использовать оба этих инструмента вместе. ImageMagick отлично работает с раскадровкой, но в плане создания видеофайла меня настиг фейл. Так что связка такая — сначала в ImageMagick создаем gif’ку с анимацией, которую скармливаем ffmpeg для получения ролика.

К сожалению, внедрить это в приложение на Android это не представляется возможным — порта для imagemagick, который у меня получилось бы внедрить, я не нашел. Увы.

(Что самое обидное — ImageMagick идет в базе на iOS).

Оказалось, что можно хитро извернуться и решить вопрос с помощью одного ffmpeg. Тут есть два подводных камня, каждый из которых мы рассмотрим по отдельности.

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

Ну и второй камень — кажется, на параметр filter_complex существует ограничение на количество вводных данных (input). По крайней мере превысить количество рисунков более чем пять у меня не получилось (вылет с соответствующей ошибкой).

Вывод.

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

Спасибо.

Как изменить таблицу в SQLite на Android

Каждый раз, когда изменяется структура базы данных в приложении, необходимо вызывать метод SQLiteOpenHelper.onUpgrade, в котором описывать сами изменения (добавление / удаление таблиц, полей или индексов). Естественно, эти же изменения необходимо указывать в обновленном запросе при создании базы в методе SQLiteOpenHelper.onCreate.

К примеру, сначала таблица mytable создавалась с помощью такого запроса

Затем в процессе разработки возникла необходимость в дополнительном поле category. Что мы должны сделать:

Continue reading

Как подделать запрос с использованием CSRF токена для Instagram

Если вы увлекаетесь разработкой для Android и когда-то вам пришла в голову идея написать свое приложения для Instagram, то вы наверняка сталкивались с тем, что API, которое эта социальная сеть предоставляет своим разработчикам, отличается крайне скупыми ресурсами, и используя их сложно сделать приложение, от которого вообще возможна хоть какая-то польза. Получаемая информация от сервиса в основном крутится вокруг аккаунта, под которым произошла авторизация — последние посты, список тех, кто лайкнул пост, информация об отношениях между пользователями и проч., но никаких полезных действий — лайков, поисков по тегам и проч. произвести не получится.

С одной стороны, все логично и может быть легко объяснено. Это просто способ защиты соцсети от массовых накруток аккаунтов, от автоматизации процессов постинга и проч. Принимая это во внимание, можно предположить, что Instagram позиционирует себя как социальная сеть, все виды взаимодействия с которой могут быть произведены только вручную. К сожалению, это ограничивает многих, ведь помимо «незаконных» действий с инстаграмом можно было бы разрабатывать альтернативные клиенты для этой соцсети, ведь давно уже не секрет, что официальный (и единственный) клиент обладает рядом дико раздражающих минусов (плохо реализованный Material Design, например, или отсутствие ландшафтной ориентации на Android, или полное отсутствие версии для iPad и проч.).

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

Continue reading

Качество фото в Instagram

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

Получить данные по посту не составляет никаких сложностей, если что, для чистоты эксперимента можете попробовать сами: все что нужно — это Firefox, Firebug, сервисы для симпатичного отображения json и немного вашего времени. Итак, поехали.

Для иллюстрации текущей картины я взял одну из своих последних фото в инстаграме.

Continue reading

Periodic JobScheduler в Android Nougat

Буквально в одну строку — начиная с Nougat нужно пересмотреть использование периодических задач с использованием JobScheduler и вот почему: минимальное время повторения составляет 15 минут!

То есть если у вас есть необходимость в фоновом вызове некоторого кода чаще (например, для обновления UI виджете), придется отказаться от вызова setPeriodic.

Таким образом в моем рабочем проекте уже 3 (ТРИ!) имплементации для фоновых повторяющихся задач — для старых версий Android, от Lollipop до Android M, и дальше.

Связано это с оптимизацией работы батареи, правда на спинах разработчиков.

 

Добавить символ в конец EditText (как вариант)

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

Итак (как в школьных задачах по геометрии), дано — есть EditText, в который будут добавляться только проценты (в виде чисел, естественно). Чтобы сделать интерфейс чуть более понятным для пользователя, нужно добавить знак процента в конец поля. Можно немного погородить огород с помощью OnTextChangeListener, но я против такого подхода, нужно мыслить более системно.

Continue reading

How to share story on Facebook on Android

Привет всем!

Facebook  прекращает поддержку Graph API v2.1 30 октября 2016 года, а это значит, что некоторые проекты, которые работают на этих механизмах, требуется переписать.

Несмотря на то, что лично я часто ругаю Facebook за крайне запутанный способ ведения документации (и вообще все, там абсолютно все запутано!), он предоставляет довольный мощный инструмент для всего, который порой, правда выглядит как наведения пушки на воробья.

В одном из проектов мне пришлось переписать полностью класс по работе с Facebook — начиная от авторизации (как мы помним, класс по работе с сессиями Session канул в лету), заканчивая шарингом историй. И если с первым пунктом никаких проблем особенно не возникло (достаточно просто следовать документации и у вас все получится), то со вторым пришлось немного повозиться.

Continue reading