main

Синхронизация контактов на андроиде без гугла

Михалыч, в какой сарай мы водку сгрузили?

В двух словах - это возможно. Причём не только контактов, но и календаря. Ниже описывается "как" и опробованные в процессе решения.

Историческая ретроспектива

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

Долгое время такое объединение данных, ака синхронизация, было доступно только в "бизнес смартфонах". Также, существовал зоопарк различных решений, например activesync, nokia connect, ical1 и подобных, различной степени кривости и с обязательной привязкой к производителю, чтобы не дай б-г не заработало с конкурентами.

Всё изменилось с пришествием андроида и стандартизацией 2х протоколов обмена данных: caldav и совсем недавно - carddav.

Почему стоит заморачиваться

Правда сии дифирамбы "синхронизации для 'простого пользователя'" омрачаются одним фактом - данные сливаются напрямик дядюшке гуглу, да ещё и в рафинированом виде. Посмотрите ради интереса содержимое одного дотошно заполненого контакта. Там может быть: день рождения, пара телефонов, фото, прочие контактные данные, место работы, заметки, связи с другими контактами через группы. Вобщем всё, включая фамилию любовницы троюродного зятя.

Что ещё печальнее - андроид всеми силами старается по умолчанию эту синхронизацию включить. Вплоть до того, что стандартными средствами эту "особенность" системы выкорчевать невозможно. Дополнительно, к процессу подключается жадность самих вендоров, готовых выдоить с телефона последние крохи приватности.

Думаете это паранойя? Хрен там. Были неоднократные скандалы из-за этого. Например: 1, 2, 3, 4 и ещё много подобного.

Приведу один из примеров, который мне попадался во время чистки моей xperia. Суть такова: один из продвинутых юзеров приложения, записывающее gps-треки столкнулся с проблемой: каждые N минут сигнал терялся, из-за этого трек "гулял" - потеря привязки non penis canina.

Вооружившись дебаггером умелец докопался до источника проблемы. Это оказалась функция, которая пытается выкачать данные для agps и заодно отсылает gps-статистику куда-то там в интернете. Проблема проявлялась из-за того что стоял droidwall и не пускал её в интернет. Т.е. редкое сочетание "включен gprs / нет соединения". подробнее

Я знаю все стандартные возражения на эту часть, и ни одна меня не убеждает.

  • я никому не нужен/интересен
  • это ты пока никому не нужен. Этот "аргумент" подробно разбирается здесь, например

  • это всего лишь статистика

  • это пока всего лишь статистика

Немного теории

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

Нам нужна серверная часть, то бишь то, что наши данные будет хранить и отдавать по запросу. Максимально доступная для модификации, ибо возможны кривые клиенты.

Клиентская часть на андроиде у нас уже есть и как правило мы с ней сделать ничего не можем. И! она заточена только под гугл. Поэтому она не имеет никаких настроек, только включить/выключить/выключить полностью(зуб даю ;-)). Но! В силу описанного выше про вендоров, гугл сделал возможны добавление "провайдеров" различных системных служб. Что и применяется, для реализации различных сервисов, той же мозиллой (интерфейс закладок) или же, интересующих нас календаря и контактов.

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

Обзор кандидатов

Я видел несколько программ, потенциальных кандидатов на роль нашего сервера данных.

  • davical2 -- пачка скриптов на php :!:, работающих только с postgre :!:. Сразу не завелось, сильно ковырять не пробовал. Внушает впечатление поделки.
  • radicale -- демон на питоне, выглядит намного адекватнее предыдущёго пункта, но по виду полузаброшен. При попытке настроить - словил грабли с авторизацией. Висит десяток багов, которые никто не торопится фиксить.
  • baikal -- опять php, на этот раз с mysql. Смотрел, что именно не заработало - не помню.
  • owncloud -- как часть функционала.

Ляпота

В связке с последним у меня всё и заработало. Не с первого раза, не без огрехов, но после "устаканивания" связь держится железно.

php на хосте у меня уже стоял, почти все нужные модули - тоже, но не было рекомендуемого апача - вместо него nginx. Конфиг для owncloud'а, стянутый с сайта nginx'а, не заработал даже с напильником, поэтому стянул конфиг nginx'а с сайта самого owncloud'а.

На устройства поставил {Cal,Card}DAV-sync, хватило бесплатной версии.

Сейчас всё работает примерно по такой схеме: в owncloud'е заводится N+1 учёток, N личных + 1 "семейная". На телефон подтягивается 2 календаря, личный+семейный, на читалку - только семейный. Контакты пока у каждого свои, но часть из них я хочу вынести в общие.

Профит.

В сочетании с ff-sync, демон которого у меня стоит - чхать я хотел на эти ваши зонды. На повестке дня - подобное TODO, календарь не умеет зависимые задачи и привязан ко времени.


  1. такое шедевральное название, и такое незначительное применение. Ящитаю, ябблу следовало использовать его шире. ↩

  2. ещё одно эпичное название! ↩