Сейчас мы с вами разберемся где на Андроиде хранятся контакты из вашей телефонной кники, а так же различных приложений (Skype, Viber, Телеграм и прочее).
Данная статья подходит для всех брендов, выпускающих телефоны на Android 11/10/9/8: Samsung, HTC, Lenovo, LG, Sony, ZTE, Huawei, Meizu, Fly, Alcatel, Xiaomi, Nokia и прочие. Мы не несем ответственности за ваши действия.
Внимание! Вы можете задать свой вопрос специалисту в конце статьи.
Контакты в гаджетах Андроид могут располагаться в совершенно разных местах: аккаунты приложений и электронный документ. Давайте рассмотрим все эти варианты хранения контактов.
Где сохраняются контакты на Самсунг?
Резервное копирование контактов на SD-карту
- На любом главном экране нажмите «Приложения».
- Коснитесь Настройки.
- Прокрутите до «ПРИЛОЖЕНИЯ», затем нажмите «Контакты».
- При необходимости коснитесь «Контакты», чтобы отобразить> Все контакты.
- Коснитесь Импорт / Экспорт.
- Коснитесь Экспорт на SD-карту.
- Проверьте имя файла для списка контактов во всплывающем сообщении.
- Нажмите ОК, чтобы подтвердить экспорт.
Процесс работы с данными в контактах
запрос данных
Возьмем DefaultContactBrowseListFragment в главном интерфейсе в качестве примера, отношения наследования такие, как показано
, как показано ниже:
Процесс загрузки данных интерфейса List, унаследованного от ContactEntryListFragment, выглядит следующим образом:
CursorLoader создается и управляется LoaderManager во фрагменте. Фрагмент содержит объект ContactEntryListAdapter. Конфигурация параметров CursorLoader помещается в ContactEntryListAdapter. После загрузки данных CursorLoader он вызывается обратно Исходя из фрагмента, а затем используйте ContactEntryListAdapter для управления обновлением данных и контроля пользовательского интерфейса
Адаптером, соответствующим DefaultContactBrowseListFragment, является DefaultContactListAdapter, а соответствующим курсором загрузки является ProfileAndContactsLoader.
Другие операции
Создание, обновление и удаление контактов обычно инкапсулируются в классе ContactSaveService, как показано на рисунке.
Класс ContactSaveService наследуется от IntentService и является службой для асинхронной обработки контактных данных. После завершения операции с данными намерение передается при запросе операции (намерение содержит действие, которое требует обратного вызова) И действие) обратный вызов в Activity для уведомления UIThread для выполнения обновления пользовательского интерфейса
Возьмем пример создания контакта:
метод ContactEditorFragment.save ()
CreateSaveContactIntent () в ContactSaveService, передавая параметры, необходимые для обратного вызова
ContactSaveService, saveContact ()
может выполнять обратный вызов Activity, поскольку базовый класс ContactsActivity Activity, связанный с операцией контакта, в Contact реализует ContactSaveService.Listener, а затем в onCreate ContactSaveService.registerListener (this), а затем с помощью вышеупомянутого Логика кода в конечном итоге вызовет
Как мне сохранить все мои контакты в Google?
Резервное копирование и синхронизация контактов устройства
- На телефоне или планшете Android откройте приложение «Настройки».
- Коснитесь Службы учетной записи Google. Синхронизация контактов Google. Также синхронизируйте контакты устройства. Автоматическое резервное копирование и синхронизация контактов устройства.
- Включите автоматическое резервное копирование и синхронизацию контактов устройства.
- Выберите учетную запись, в которой вы хотите сохранить контакты.
Анализ базы данных
База данных системных контактов находится в следующих папках данных \ data \ com.android.providers.contacts \ базы данных \, обычные контакты хранятся в contacts2.db, а личная информация хранится в profile.db, но базовая структура обеих баз данных одинакова
Структура таблицы
Есть еще три важные таблицы: учетная запись, mimetype, данные, raw_contacts, контакты. Другие структуры таблиц используются реже. При возникновении проблем перейдите в ContactsProvider для просмотра кода.
Основная прямая связь между несколькими таблицами
Аккаунт связан с аккаунтом
В таблице данных хранится информация о контакте. В каждой строке хранится информация определенного типа для контакта (например, телефон, имя, адрес электронной почты, учетная запись социальной сети, адрес и т. д.).
Где данные хранятся в dataX (x — это число), в соответствии с mimetype_id этой строки, чтобы соответствовать типу информационных данных, таблица mimetype хранит несколько типов данных и _id, как показано на рисунке
соответствует коду, вы можете перейти к исходному коду через некоторые из следующих классов, чтобы увидеть, что mimetype и dataX являются соответствующими отношениями
Например:
Для других классов, пожалуйста, обратитесь к следующему определению
[java] view plaincopy
- String MIMETYPE_EMAIL_V2 = Email.CONTENT_ITEM_TYPE;//»vnd.android.cursor.item/email_v2?;
- String MIMETYPE_IM = Im.CONTENT_ITEM_TYPE;//»vnd.android.cursor.item/im»;
- String MIMETYPE_NICKNAME = Nickname.CONTENT_ITEM_TYPE;//»vnd.android.cursor.item/nickname»;
- String MIMETYPE_ORGANIZATION = Organization.CONTENT_ITEM_TYPE;//»vnd.android.cursor.item/organization»;
- String MIMETYPE_PHONE_V2 = Phone.CONTENT_ITEM_TYPE;//»vnd.android.cursor.item/phone_v2?;
- String MIMETYPE_SIP_ADDRESS = SipAddress.CONTENT_ITEM_TYPE;//»vnd.android.cursor.item/sip_address»;
- String MIMETYPE_NAME = StructuredName.CONTENT_ITEM_TYPE;//»vnd.android.cursor.item/name»;
- String MIMETYPE_POSTAL_ADDRESS_V2 = StructuredPostal.CONTENT_ITEM_TYPE;//»vnd.android.cursor.item/postal-address_v2?;
- String MIMETYPE_IDENTITY = Identity.CONTENT_ITEM_TYPE;//»vnd.android.cursor.item/identity»;
- String MIMETYPE_PHOTO = Photo.CONTENT_ITEM_TYPE;//»vnd.android.cursor.item/photo»;
- String MIMETYPE_GROUP_MEMBERSHIP = GroupMembership.CONTENT_ITEM_TYPE;//»vnd.android.cursor.item/group_membership»;
- String MIMETYPE_NOTE = Note.CONTENT_ITEM_TYPE;//»vnd.android.cursor.item/note»;
- String MIMETYPE_WEBSITE = Website.CONTENT_ITEM_TYPE;//»vnd.android.cursor.item/website»;
Ниже приведены представления в базе данных (некоторые инкапсуляции совместных запросов), некоторые из которых были помечены.
Выше приведены некоторые часто используемые таблицы данных и представления. Подробная структура таблицы данных, а также тип данных и значение каждого поля должны быть проверены в коде.
Два основных класса в ContactsProvider:
com.android.providers.contacts.ContactsDatabaseHelper
com.android.providers.contacts.ContactsProvider2
ContactsDatabaseHelper наследуется от SqliteOpenHelper, это операция создания и обновления базы данных, этот класс содержит подробные определения полей и типов данных каждой таблицы, а также обновления базы данных и контактов в соответствии с версией Оператор инкапсуляции данных CURD данных человеческой части, предоставляемый вызову ContactsProvider2
ContactsProvider2 наследуется от AbstractContactsProvider и представляет собой протокол для передачи данных между приложениями и базами данных. Доступ к нему осуществляется через Uri и определяет метод CURD, который необходимо использовать приложениям.
Редактировать интерфейс
Редактировать интерфейс В ContactEditorActivity-> ContactEditorFragment процесс загрузки данных в интерфейсе аналогичен описанному выше. Более сложным является пользовательский интерфейс интерфейса редактирования, который представляет собой пользовательский RawContactEditorView. И обязательная блок-схема
Фрагмент содержит пользовательский объект представления RawContactEditorView и объект данных RawContactDeltaList, после запроса данных Contact из базы данных данные инкапсулируются в RawContactDeltaList, а затем RawContactDeltaList через bindeditors, метод editor.setState Данные передаются в пользовательское представление, затем RawContactEditorView разделяет данные, а затем передает каждое подпредставление, а также передает RawContactDeltaList, и затем обновление данных будет завершено в подпредставлении, когда контакт должен быть сохранен во фрагменте. , Вы можете напрямую использовать RawContactDeltaList, операция сохранения контактов аналогична описанному выше процессу взаимодействия с данными.
Функция импорта и экспорта
Эта функция вызывается кнопкой меню на главном интерфейсе.
Импорт с SIM-карты
будет вызывать com.android.phone от Telephony. ADMList расширяет ADNList, отвечает за процесс загрузки данных, SimContacts — за обработку логики пользовательского интерфейса, все очень просто.
Импорт из хранилища
Импортировать файл vcard в ImportVCardActivity. Сначала он получает файл .vcf в пространстве хранения через VCardScanThread, а затем предлагает пользователю выбрать файл vcf для импорта и кэшировать данные через VCardCacheThread. Инкапсулируйте типы данных, необходимые для импорта данных. Конкретный процесс импорта выполняется через bind VCardService. В службе ExecutorService (инициализированный как однопоточный пул потоков) используется для выполнения потока ImportProcessor (реализует Runable). ImportProcessor выполняет специальный анализ и импорт. ImportProcessor Во время инициализации будет передан NotificationImportExportListener для выполнения обратного вызова интерфейса после завершения импорта.
Экспорт на карту памяти
Экспортирует контакты в файл vcf и сохраняет их в области хранения. Процесс экспорта аналогичен процессу импорта, а также выполняется с использованием VCardService.
Подробный интерфейс
В коде AndroidL нет предыдущих контактных данных в пакете сведений, оставлены только некоторые вспомогательные инструменты, а вместо ContactDetailActivity используется QuickContactActivity, а в пользовательском интерфейсе также происходят значительные изменения. , Интерфейс скользящий, внешний слой — это пользовательский вид: com.android.contacts.widget.MultiShrinkScroller. Если вы недавно связались с контактом, номер контакта будет указан сразу под номером контакта, Включая звонки и текстовые сообщения, а затем другую информацию. Если имеется несколько данных каждого типа, по умолчанию отображается одна из них. Она будет развернута при нажатии «Просмотреть все».
z
При входе из списка контактов он находится в полноэкранном режиме, а при входе из других каналов (в настоящее время известен по SMS и ярлыкам на рабочем столе) — не в полноэкранном состоянии, которое контролируется MultiShrinkScroller (runEntranceAnimation )
Загрузка данных аналогична процессу загрузки, описанному выше.
Основной интерфейс
Основным интерфейсом является интерфейс PeopleActivity, который разделен на две вкладки, а именно DefaultContactBrowseListFragment и ContactTileListFragment, которые можно переключать с помощью viewpager
Где DefaultContactBrowseListFragment — это страница списка контактов, в основном используемая для обработки отображения загрузки и поиска контактов в списке контактов, процесс загрузки данных описан выше, представление элемента списка — ContactListItemView
ContactTileListFragment является избранным контактом и общим контактом, этот класс напрямую наследуется от Fragment, но процесс в основном такой же, как и раньше, метод немного отличается, данные делятся на избранные контакты и последние контакты Контакты, через ContactTileLoaderFactory, чтобы обеспечить загрузчик курсора для загрузки различных данных
На дисплее пользовательского интерфейса адаптер используется для управления отображением частых и частых контактов, 3 строки и одна строка часто
В правом нижнем углу самого верхнего слоя основного интерфейса есть кнопка создания контакта, нажмите непосредственно для входа в интерфейс создания контакта.
В верхней части находится панель инструментов с кнопкой поиска и клавишей меню.
Основной интерфейс также отслеживает изменения данных поставщика
Выберите интерфейс
Интерфейс Pick — это ContactSelectionActivity, который будет загружать разные фрагменты в соответствии с различными действиями, включая ContactPickerFragment.
PhoneNumberPickerFragment
EmailAddressPickerFragment
PostalAddressPickerFragment
JoinContactListFragment
Чаще всего используются первые 3 фрагмента
ContactSelectionActivity обычно запускается startActivityForResult, поэтому ему необходимо вернуть результат до его завершения.
Процесс загрузки данных пропущен.