Tagdevelopment

Realm: хитрости при сохранении данных сервера

Ситуация в следующем: приложение делает REST запрос на получение данных, сохраняет их в базе, каким-то образом модифицирует, затем снова их получает с сервера. Все довольно тривиально, казалось бы, если бы не одно «но» — где мои локальные изменения?

К сожалению, Realm не поддерживает обновление данных с пропуском конкретных полей, как это было сделано в реквесте на гитхабе проекта, например

But, what about a call to specify a list of the fields that one want to overwrite (or preserve)?
copyToRealmOrUpdateOverwritingFields("field1","field2")
copyToRealmOrUpdatePreservingFields("field1","field2")
copyToRealmOrUpdate(obj).preserve("field1","field2")

https://github.com/realm/realm-java/issues/2179

что было бы довольно удобно. Давайте рассмотрим на примерах. Представим, что у нас есть чат, в котором у сообщений есть флаг «прочитано». Наш REST интерфейс не возвращает об этом состоянии никаких данных и вся информация о том, было ли сообщение прочитано или нет, хранится только локально. Continue reading

Android: логгирование и отправка результатов на почту

Привет.

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

Одно дело — разработка, LogCat в Android Studio (если вы из любителей пожестче — можно распечатку в консоли смотреть с помощью adb), и совсем другое — ломать голову над вопросом почему у вас все работает на всем парке тестовых устройств, а пользователь жалуется на абсолютно обратную ситуацию. Коммуникация между разработчиком и конечным пользователем — это хорошо, но совсем другое — видеть своими глазами картинку происходящего (помните, как в матрице — для кого-то это зеленые иероглифы, а для кого-то — женщина в красном?)

Continue reading

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

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

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

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

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

Continue reading

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

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

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

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

Continue reading

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

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

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

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

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

Паттерны проектирования: строитель

С паттерном «Строитель» (хотя лично я никогда его так не называю — для меня он Builder) знакомы все, кто хоть немного продвинулся в изучении уроков на startandroid или других подобных (Александр  Климов, например). Лично я впервые с ним столкнулся в незапамятно далеких временах, когда изучал AlertDialog. Думаю, не я один такой.

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

Итак, мой код изначально выглядел следующим образом
Continue reading

Запретный контент при публикации в Google Play

Остаток вечера я посвятил подготовке страницы приложения в Google Play: нагенерировал кучу разных скриншотов, обработал их покрасивее, как полагается, как мог пробежался по текстам, наконец, залил все изменения в консоли и стал ждать когда накатится обновление.

Обновление пришло в две волны. Сначала пришло подтверждение (в виде появления локализации) о размещении английского перевода приложения. И практически сразу же вслед пришло письмо о небольшом нарушении авторских прав.

Continue reading