Кроссплатформенная совместимость Android Contacts.

Кроссплатформенная совместимость Android Contacts.

В последнее время все чаще говорят о фрагментации Android и о различных версиях платформы. Прочитав вышеупомянутые обзоры и просмотрев историю изменения исходников для родного приложения Contacts_в_git, у меня возникло желание выяснить причины по которым девелоперы так кардинально поменяли исходники и почему для каждой платформы свои контакты.

В ходе исследования все данные были получены с помощью стандартного эмулятора запущенного для различных платформ (1.5, 1.6, 2.1, 2.2). При этом исходники тестового проекта были собраны с помощью SDK API level 3 (Android 1.5) и полученный apk файл инсталлировался на эмулятор без каких либо изменений. С помощью утилиты DatabaseMasterSetup были получены зависимости между таблицами базы данных. На рис. 1 хорошо видно, как происходила трансформация базы данных для каждой версии Android.

Первый старт на платформе 1.5 и 1.6 показал полную работоспособность тестового примера. Отлично отображался список всех контактов с номерам телефона и фотографией пользователя.

При запуске на 2.1 список имен отобразился, но вот номера телефонов отобразились не везде. К тому же в логах была обнаружена ошибка: ERROR/ContactsProvider: Cannot determine the default account for contacts compatibility. Как оказалось, проблема с отображением номера заключалась в том, что для записей, у которых не установлен главный номер (а номеров один или несколько) SQL запрос в поле номера возвращал null. Cкорее всего, это связано с тем, что в Android 1.5 и 1.6 использовались разные таблицы для хранения данных(телефонные номера, фотография), а в Android 2.1 и 2.2 уже появилась таблица data в которой хранятся все данные контакта (телефоны, фотография и другая информация)

Следующее разочарование было при попытке просмотреть детальную информацию о контакте. Программа, которая стабильно работала под 1.5 и 1.6 наотрез отказалась работать под 2.1. Посмотрев в логи, была обнаружена ошибка: ERROR/DatabaseUtils: Unknown URL content://contacts/people/1/contact_methods_with_presence

Не захотел код собранный с SDK 1.5 работать под платформой 2.1. Оно и не удивительно. Потому что товарищи из Google меняли структуру БД каждый раз как выпускали новую платформу(рис. 2,3,4,5), следовательно, алгоритм работы с контактами не смог остаться прежним.

Поэтому, всем кто пробует использовать API контактов в своем приложении, следует очень внимательно отнестись к вопросу совместимости. Одно из решений, как обеспечить кроссплатформенную совместимость, это проверять версию сборки с помощью класса Build. VERSION и в зависимости от платформы на которой запущено приложение, формировать SQL запросы или по разному обрабатывать ответы от БД. Но сразу же возникает проблема, а как же собирать проект под SDK 1.5 если в нем еще нет класса ContactsContracts, который так нужен для обращения к базе данных в версиях выше 2.0?

Так что вопрос о кроссплатформенной совместимости остается открытым. Может быть Google что то предложит?


Карта сайта


Информационный сайт Webavtocat.ru